From 4e995b8a267d237390a2ff3bb6e66cf246ddcc8d Mon Sep 17 00:00:00 2001 From: Felipe Ricardo Date: Fri, 30 Jan 2026 18:27:33 -0300 Subject: [PATCH 1/5] feat(i18n): add internationalization support and translations --- README.md | 8 --- index.html | 2 +- package.json | 2 + pnpm-lock.yaml | 37 ++++++++++ src/App.tsx | 44 +++++++++++- src/components/command-step.tsx | 11 +-- src/i18n.ts | 2 +- src/locales/ar.json | 60 ++++++++++++++++ src/locales/bn.json | 60 ++++++++++++++++ src/locales/en.json | 60 ++++++++++++++++ src/locales/es.json | 60 ++++++++++++++++ src/locales/fr.json | 60 ++++++++++++++++ src/locales/hi.json | 60 ++++++++++++++++ src/locales/ja.json | 60 ++++++++++++++++ src/locales/pt.json | 60 ++++++++++++++++ src/locales/ru.json | 60 ++++++++++++++++ src/locales/zh.json | 60 ++++++++++++++++ src/main.tsx | 14 ++-- src/pages/Builder.tsx | 91 ++++++++++++------------ src/pages/LandingPage.tsx | 119 +++++++++++++++----------------- 20 files changed, 795 insertions(+), 135 deletions(-) diff --git a/README.md b/README.md index 18caa3d..6aaba5d 100644 --- a/README.md +++ b/README.md @@ -71,14 +71,6 @@ Para rodar o projeto localmente, siga os passos abaixo. pnpm run dev ``` -## 📁 Variáveis de Ambiente - -Crie um arquivo `.env` na raiz do projeto e adicione as seguinte variáveis: - -```env -VITE_API_KEY=url_da_api -``` - ## Licença Distribuído sob a licença personalizada de uso não comercial. Veja [`LICENSE`](https://github.com/FelipeRicard0/stack-builder/blob/main/LICENSE) para mais informações. diff --git a/index.html b/index.html index af8d2bb..bcb86a7 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - stack-builder + Stack Builder { + i18n.changeLanguage(validLang); + }, [validLang]); + + if (lang !== validLang) { + return ; + } + + return ( + + } /> + } /> + + ); +} export default function App() { return ( - } /> - } /> + } + /> + } /> ); } diff --git a/src/components/command-step.tsx b/src/components/command-step.tsx index ea595a3..e9a17b7 100644 --- a/src/components/command-step.tsx +++ b/src/components/command-step.tsx @@ -35,16 +35,11 @@ export default function CommandStep({ step, index }: CommandStepProps) { {step.label} - diff --git a/src/i18n.ts b/src/i18n.ts index b6f0fdd..5a4c31e 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -12,7 +12,7 @@ import ru from "./locales/ru.json"; import ja from "./locales/ja.json"; i18n.use(initReactI18next).init({ - lng: navigator.language, + lng: navigator.language.split("-")[0], fallbackLng: "en", resources: { pt: { translation: pt }, diff --git a/src/locales/ar.json b/src/locales/ar.json index e69de29..33c85b1 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "دعم Stack Builder", + "support_description": "ساعدنا في الحفاظ على هذا المشروع مفتوح المصدر ومجانيًا. مساهمتك تحدث فرقًا.", + "share": "مشاركة", + "support": "دعم", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "دعم شهري أو لمرة واحدة", + "buy_me_coffee": "اشتر لي قهوة", + "buy_me_coffee_desc": "مساهمة سريعة لمرة واحدة", + "thank_you_support": "شكرًا لدعم المشاريع مفتوحة المصدر!", + "features": "المميزات", + "presets": "إعدادات مسبقة", + "start_building": "ابدأ التطوير", + "build_faster": "طور بشكل أسرع مع التقنيات المناسبة", + "build_your_perfect": "اصنع", + "tech_stack": "Tech Stack المثالي", + "stop_wasting_time": "توقف عن إضاعة الوقت في إعداد المشاريع من الصفر. اختر تقنياتك، احصل على الأوامر المثالية، وابدأ التطوير في ثوانٍ.", + "open_builder": "فتح Builder", + "everything_you_need": "كل ما تحتاجه للبدء بسرعة", + "thoughtfully_designed": "Builder مصمم بعناية لتطوير الويب الحديث.", + "curated_stack": "خيارات Stack منتقاة", + "choose_battle_tested": "اختر من تقنيات مجربة في Frontend و Backend و Database والأدوات.", + "smart_compatibility": "توافق ذكي", + "intelligent_system": "نظامنا الذكي يمنع الاختيارات غير المتوافقة ويقترح أفضل التركيبات.", + "instant_commands": "أوامر فورية", + "get_ready_to_run": "احصل على أوامر CLI جاهزة للتشغيل مخصصة لاختياراتك ومدير الحزم المفضل.", + "project_structure": "هيكل المشروع", + "view_recommended": "اعرض هيكل المجلدات الموصى به بناءً على اختيارات التقنية قبل البدء.", + "start_with_preset": "ابدأ بإعداد مسبق", + "jump_start_project": "ابدأ مشروعك بسرعة مع التركيبات المفضلة في المجتمع.", + "use_this_preset": "استخدم هذا الإعداد", + "ready_build_great": "هل أنت مستعد لبناء شيء رائع؟", + "join_thousands": "انضم إلى آلاف المطورين الذين يستخدمون Stack Builder لبدء مشاريعهم بشكل أسرع.", + "launch_builder": "تشغيل Builder", + "view_on_github": "عرض على GitHub", + "built_with_care": "مبني بعناية لمجتمع المطورين.", + "select_one": "اختر واحدًا", + "recommended_structure": "الهيكل الموصى به", + "share_your_stack": "شارك Stack الخاص بك", + "share_this_configuration": "شارك هذا الإعداد مع الآخرين", + "selected_technologies": "التقنيات المختارة", + "share_link": "رابط المشاركة", + "no_technologies_selected_yet": "لم يتم اختيار تقنيات بعد", + "copy_btn": "نسخ", + "copied_btn": "تم النسخ", + "reset_all": "إعادة تعيين الكل", + "random_stack": "Stack عشوائي", + "project_name": "اسم المشروع", + "command_label": "أمر", + "selected_stack": "Stack المختار", + "no_technologies_selected": "لم يتم اختيار تقنيات", + "save_btn": "حفظ", + "back_btn": "رجوع", + "builder_badge": "Builder", + "configure_tab": "إعداد", + "commands_tab": "أوامر", + "preview_tab": "معاينة", + "setup_commands": "أوامر الإعداد", + "run_these_commands": "قم بتشغيل هذه الأوامر بالترتيب لإعداد مشروعك" +} diff --git a/src/locales/bn.json b/src/locales/bn.json index e69de29..1c200a7 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Stack Builder সমর্থন করুন", + "support_description": "আমাদের এই প্রজেক্টকে বিনামূল্যে এবং ওপেন সোর্স রাখতে সাহায্য করুন। আপনার অবদান পার্থক্য তৈরি করে।", + "share": "শেয়ার করুন", + "support": "সমর্থন", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "মাসিক বা একবারের সমর্থন", + "buy_me_coffee": "আমাকে কফি কিনুন", + "buy_me_coffee_desc": "দ্রুত একবারের অবদান", + "thank_you_support": "ওপেন সোর্স সমর্থনের জন্য ধন্যবাদ!", + "features": "বৈশিষ্ট্য", + "presets": "Presets", + "start_building": "ডেভেলপমেন্ট শুরু করুন", + "build_faster": "সঠিক stack দিয়ে দ্রুত ডেভেলপ করুন", + "build_your_perfect": "আপনার পারফেক্ট", + "tech_stack": "Tech Stack তৈরি করুন", + "stop_wasting_time": "স্ক্র্যাচ থেকে প্রজেক্ট কনফিগার করতে সময় নষ্ট করা বন্ধ করুন। আপনার টেকনোলজি নির্বাচন করুন, পারফেক্ট কমান্ড পান এবং সেকেন্ডের মধ্যে ডেভেলপমেন্ট শুরু করুন।", + "open_builder": "Builder খুলুন", + "everything_you_need": "দ্রুত শুরু করার জন্য আপনার প্রয়োজনীয় সবকিছু", + "thoughtfully_designed": "আধুনিক web development এর জন্য সযত্নে ডিজাইন করা একটি builder।", + "curated_stack": "কিউরেটেড Stack অপশন", + "choose_battle_tested": "Frontend, backend, database এবং tooling ক্যাটাগরিতে যুদ্ধ-পরীক্ষিত টেকনোলজি থেকে চয়ন করুন।", + "smart_compatibility": "স্মার্ট সামঞ্জস্য", + "intelligent_system": "আমাদের বুদ্ধিমান সিস্টেম অসামঞ্জস্যপূর্ণ নির্বাচনগুলি প্রতিরোধ করে এবং সর্বোত্তম সমন্বয়গুলি পরামর্শ দেয়।", + "instant_commands": "তাৎক্ষণিক Commands", + "get_ready_to_run": "আপনার নির্বাচন এবং পছন্দের package manager এর জন্য ready-to-run CLI কমান্ড পান।", + "project_structure": "প্রজেক্ট Structure", + "view_recommended": "শুরু করার আগে আপনার টেকনোলজি পছন্দের উপর ভিত্তি করে সুপারিশকৃত folder structure দেখুন।", + "start_with_preset": "একটি preset দিয়ে শুরু করুন", + "jump_start_project": "কমিউনিটি-পছন্দের কম্বিনেশনগুলির সাথে আপনার প্রজেক্টকে দ্রুত শুরু করুন।", + "use_this_preset": "এই preset টি ব্যবহার করুন", + "ready_build_great": "কিছু দুর্দান্ত তৈরি করতে প্রস্তুত?", + "join_thousands": "হাজার হাজার ডেভেলপারদের সাথে যোগ দিন যারা তাদের প্রজেক্ট দ্রুত শুরু করতে Stack Builder ব্যবহার করে।", + "launch_builder": "Builder চালু করুন", + "view_on_github": "GitHub-এ দেখুন", + "built_with_care": "ডেভেলপার কমিউনিটির জন্য যত্ন সহকারে তৈরি।", + "select_one": "একটি নির্বাচন করুন", + "recommended_structure": "সুপারিশকৃত Structure", + "share_your_stack": "আপনার Stack শেয়ার করুন", + "share_this_configuration": "এই configuration অন্যদের সাথে শেয়ার করুন", + "selected_technologies": "নির্বাচিত টেকনোলজি", + "share_link": "শেয়ার লিঙ্ক", + "no_technologies_selected_yet": "এখনও কোন টেকনোলজি নির্বাচন করা হয়নি", + "copy_btn": "কপি করুন", + "copied_btn": "কপি হয়েছে", + "reset_all": "সব রিসেট করুন", + "random_stack": "Random stack", + "project_name": "প্রজেক্টের নাম", + "command_label": "Command", + "selected_stack": "নির্বাচিত Stack", + "no_technologies_selected": "কোন টেকনোলজি নির্বাচন করা হয়নি", + "save_btn": "সংরক্ষণ করুন", + "back_btn": "ফিরে যান", + "builder_badge": "Builder", + "configure_tab": "Configure করুন", + "commands_tab": "Commands", + "preview_tab": "Preview", + "setup_commands": "Setup Commands", + "run_these_commands": "আপনার প্রজেক্ট সেটআপ করতে এই commands ক্রমে চালান" +} diff --git a/src/locales/en.json b/src/locales/en.json index e69de29..33855b4 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Support Stack Builder", + "support_description": "Help us keep this project free and open source. Your contribution makes a difference.", + "share": "Share", + "support": "Support", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "Monthly or one-time support", + "buy_me_coffee": "Buy Me a Coffee", + "buy_me_coffee_desc": "Quick one-time contribution", + "thank_you_support": "Thank you for supporting open source!", + "features": "Features", + "presets": "Presets", + "start_building": "Start Building", + "build_faster": "Build faster with the right stack", + "build_your_perfect": "Build Your Perfect", + "tech_stack": "Tech Stack", + "stop_wasting_time": "Stop wasting time configuring projects from scratch. Select your technologies, get the perfect commands, and start building in seconds.", + "open_builder": "Open Builder", + "everything_you_need": "Everything you need to start fast", + "thoughtfully_designed": "A thoughtfully designed builder for modern web development.", + "curated_stack": "Curated Stack Options", + "choose_battle_tested": "Choose from battle-tested technologies across frontend, backend, database, and tooling categories.", + "smart_compatibility": "Smart Compatibility", + "intelligent_system": "Our intelligent system prevents incompatible selections and suggests optimal combinations.", + "instant_commands": "Instant Commands", + "get_ready_to_run": "Get ready-to-run CLI commands tailored to your selections and preferred package manager.", + "project_structure": "Project Structure", + "view_recommended": "View the recommended folder structure based on your technology choices before you start.", + "start_with_preset": "Start with a preset", + "jump_start_project": "Jump-start your project with community-favorite combinations.", + "use_this_preset": "Use this preset", + "ready_build_great": "Ready to build something great?", + "join_thousands": "Join thousands of developers who use Stack Builder to start their projects faster.", + "launch_builder": "Launch Builder", + "view_on_github": "View on GitHub", + "built_with_care": "Built with care for the developer community.", + "select_one": "Select one", + "recommended_structure": "Recommended Structure", + "share_your_stack": "Share Your Stack", + "share_this_configuration": "Share this configuration with others", + "selected_technologies": "Selected Technologies", + "share_link": "Share Link", + "no_technologies_selected_yet": "No technologies selected yet", + "copy_btn": "Copy", + "copied_btn": "Copied", + "reset_all": "Reset all", + "random_stack": "Random stack", + "project_name": "Project Name", + "command_label": "Command", + "selected_stack": "Selected Stack", + "no_technologies_selected": "No technologies selected", + "save_btn": "Save", + "back_btn": "Back", + "builder_badge": "Builder", + "configure_tab": "Configure", + "commands_tab": "Commands", + "preview_tab": "Preview", + "setup_commands": "Setup Commands", + "run_these_commands": "Run these commands in order to set up your project" +} diff --git a/src/locales/es.json b/src/locales/es.json index e69de29..02f5a32 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Apoya Stack Builder", + "support_description": "Ayúdanos a mantener este proyecto gratuito y de código abierto. Tu contribución hace la diferencia.", + "share": "Compartir", + "support": "Soporte", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "Soporte mensual o único", + "buy_me_coffee": "Cómprame un café", + "buy_me_coffee_desc": "Contribución única rápida", + "thank_you_support": "¡Gracias por apoyar el código abierto!", + "features": "Características", + "presets": "Presets", + "start_building": "Comenzar a desarrollar", + "build_faster": "Desarrolla más rápido con el stack adecuado", + "build_your_perfect": "Construye tu", + "tech_stack": "Tech Stack perfecto", + "stop_wasting_time": "Deja de perder tiempo configurando proyectos desde cero. Selecciona tus tecnologías, obtén los comandos perfectos y comienza a desarrollar en segundos.", + "open_builder": "Abrir Builder", + "everything_you_need": "Todo lo que necesitas para comenzar rápido", + "thoughtfully_designed": "Un builder diseñado cuidadosamente para el desarrollo web moderno.", + "curated_stack": "Opciones de Stack curadas", + "choose_battle_tested": "Elige entre tecnologías probadas en batalla en categorías de frontend, backend, database y tooling.", + "smart_compatibility": "Compatibilidad inteligente", + "intelligent_system": "Nuestro sistema inteligente previene selecciones incompatibles y sugiere combinaciones óptimas.", + "instant_commands": "Comandos instantáneos", + "get_ready_to_run": "Obtén comandos CLI listos para ejecutar adaptados a tus selecciones y package manager preferido.", + "project_structure": "Estructura del proyecto", + "view_recommended": "Ver la estructura de carpetas recomendada según tus elecciones de tecnología antes de comenzar.", + "start_with_preset": "Comienza con un preset", + "jump_start_project": "Impulsa tu proyecto con combinaciones favoritas de la comunidad.", + "use_this_preset": "Usa este preset", + "ready_build_great": "¿Listo para construir algo grandioso?", + "join_thousands": "Únete a miles de desarrolladores que usan Stack Builder para comenzar sus proyectos más rápido.", + "launch_builder": "Lanzar Builder", + "view_on_github": "Ver en GitHub", + "built_with_care": "Construido con cuidado para la comunidad de desarrolladores.", + "select_one": "Selecciona uno", + "recommended_structure": "Estructura recomendada", + "share_your_stack": "Comparte tu Stack", + "share_this_configuration": "Comparte esta configuración con otros", + "selected_technologies": "Tecnologías seleccionadas", + "share_link": "Enlace de compartir", + "no_technologies_selected_yet": "Ninguna tecnología seleccionada aún", + "copy_btn": "Copiar", + "copied_btn": "Copiado", + "reset_all": "Reiniciar todo", + "random_stack": "Stack aleatorio", + "project_name": "Nombre del proyecto", + "command_label": "Comando", + "selected_stack": "Stack seleccionado", + "no_technologies_selected": "No hay tecnologías seleccionadas", + "save_btn": "Guardar", + "back_btn": "Atrás", + "builder_badge": "Builder", + "configure_tab": "Configurar", + "commands_tab": "Comandos", + "preview_tab": "Vista previa", + "setup_commands": "Comandos de configuración", + "run_these_commands": "Ejecuta estos comandos en orden para configurar tu proyecto" +} diff --git a/src/locales/fr.json b/src/locales/fr.json index e69de29..daa82e0 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Soutenir Stack Builder", + "support_description": "Aidez-nous à garder ce projet gratuit et open source. Votre contribution fait la différence.", + "share": "Partager", + "support": "Support", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "Support mensuel ou unique", + "buy_me_coffee": "Offrez-moi un café", + "buy_me_coffee_desc": "Contribution unique rapide", + "thank_you_support": "Merci de soutenir l'open source !", + "features": "Fonctionnalités", + "presets": "Presets", + "start_building": "Commencer le développement", + "build_faster": "Développer plus rapidement avec le bon stack", + "build_your_perfect": "Construisez votre", + "tech_stack": "Tech Stack parfait", + "stop_wasting_time": "Arrêtez de perdre du temps à configurer des projets à partir de zéro. Sélectionnez vos technologies, obtenez les commandes parfaites et commencez à développer en quelques secondes.", + "open_builder": "Ouvrir le Builder", + "everything_you_need": "Tout ce dont vous avez besoin pour démarrer rapidement", + "thoughtfully_designed": "Un builder soigneusement conçu pour le développement web moderne.", + "curated_stack": "Options de Stack sélectionnées", + "choose_battle_tested": "Choisissez parmi des technologies éprouvées au combat dans les catégories frontend, backend, database et tooling.", + "smart_compatibility": "Compatibilité intelligente", + "intelligent_system": "Notre système intelligent prévient les sélections incompatibles et suggère des combinaisons optimales.", + "instant_commands": "Commandes instantanées", + "get_ready_to_run": "Obtenez des commandes CLI prêtes à l'exécution adaptées à vos sélections et à votre package manager préféré.", + "project_structure": "Structure du projet", + "view_recommended": "Afficher la structure de dossiers recommandée en fonction de vos choix de technologie avant de commencer.", + "start_with_preset": "Commencer avec un preset", + "jump_start_project": "Lancez rapidement votre projet avec des combinaisons favorites de la communauté.", + "use_this_preset": "Utiliser ce preset", + "ready_build_great": "Prêt à construire quelque chose de formidable ?", + "join_thousands": "Rejoignez des milliers de développeurs qui utilisent Stack Builder pour démarrer leurs projets plus rapidement.", + "launch_builder": "Lancer le Builder", + "view_on_github": "Voir sur GitHub", + "built_with_care": "Construit avec soin pour la communauté des développeurs.", + "select_one": "Sélectionnez-en un", + "recommended_structure": "Structure recommandée", + "share_your_stack": "Partagez votre Stack", + "share_this_configuration": "Partagez cette configuration avec d'autres", + "selected_technologies": "Technologies sélectionnées", + "share_link": "Lien de partage", + "no_technologies_selected_yet": "Aucune technologie sélectionnée pour l'instant", + "copy_btn": "Copier", + "copied_btn": "Copié", + "reset_all": "Réinitialiser tout", + "random_stack": "Stack aléatoire", + "project_name": "Nom du projet", + "command_label": "Commande", + "selected_stack": "Stack sélectionné", + "no_technologies_selected": "Aucune technologie sélectionnée", + "save_btn": "Enregistrer", + "back_btn": "Retour", + "builder_badge": "Builder", + "configure_tab": "Configurer", + "commands_tab": "Commandes", + "preview_tab": "Aperçu", + "setup_commands": "Commandes de configuration", + "run_these_commands": "Exécutez ces commandes dans l'ordre pour configurer votre projet" +} diff --git a/src/locales/hi.json b/src/locales/hi.json index e69de29..583f276 100644 --- a/src/locales/hi.json +++ b/src/locales/hi.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Stack Builder को support करें", + "support_description": "हमें इस project को free और open source रखने में मदद करें। आपका contribution फर्क लाता है।", + "share": "Share करें", + "support": "Support", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "Monthly या one-time support", + "buy_me_coffee": "मुझे coffee खरीद दें", + "buy_me_coffee_desc": "तेज़ one-time contribution", + "thank_you_support": "Open source को support करने के लिए धन्यवाद!", + "features": "Features", + "presets": "Presets", + "start_building": "Development शुरू करें", + "build_faster": "सही stack के साथ तेज़ी से develop करें", + "build_your_perfect": "अपना perfect", + "tech_stack": "Tech Stack बनाएं", + "stop_wasting_time": "Scratch से projects configure करने में समय बर्बाद करना बंद करें। अपनी technologies चुनें, perfect commands पाएं, और seconds में development शुरू करें।", + "open_builder": "Builder खोलें", + "everything_you_need": "तेज़ी से शुरू करने के लिए आपको सब कुछ चाहिए", + "thoughtfully_designed": "Modern web development के लिए सावधानीपूर्वक design किया गया एक builder।", + "curated_stack": "Curated Stack options", + "choose_battle_tested": "Frontend, backend, database और tooling categories में battle-tested technologies से चुनें।", + "smart_compatibility": "Smart compatibility", + "intelligent_system": "हमारी intelligent system incompatible selections को रोकती है और optimal combinations का सुझाव देती है।", + "instant_commands": "Instant commands", + "get_ready_to_run": "अपने selections और पसंदीदा package manager के लिए ready-to-run CLI commands पाएं।", + "project_structure": "Project structure", + "view_recommended": "शुरू करने से पहले अपनी technology choices के आधार पर recommended folder structure देखें।", + "start_with_preset": "एक preset के साथ शुरू करें", + "jump_start_project": "Community-favorite combinations के साथ अपने project को तेज़ी से शुरू करें।", + "use_this_preset": "इस preset का उपयोग करें", + "ready_build_great": "कुछ शानदार बनाने के लिए तैयार?", + "join_thousands": "हज़ारों developers से जुड़ें जो अपने projects तेज़ी से शुरू करने के लिए Stack Builder का उपयोग करते हैं।", + "launch_builder": "Builder launch करें", + "view_on_github": "GitHub पर देखें", + "built_with_care": "Developer community के लिए देखभाल के साथ बनाया गया।", + "select_one": "एक चुनें", + "recommended_structure": "Recommended structure", + "share_your_stack": "अपना Stack share करें", + "share_this_configuration": "इस configuration को दूसरों के साथ share करें", + "selected_technologies": "चुनी गई technologies", + "share_link": "Share link", + "no_technologies_selected_yet": "अभी तक कोई technologies चुनी नहीं गई", + "copy_btn": "Copy करें", + "copied_btn": "Copy किया गया", + "reset_all": "सब reset करें", + "random_stack": "Random stack", + "project_name": "Project का नाम", + "command_label": "Command", + "selected_stack": "चुना गया Stack", + "no_technologies_selected": "कोई technologies चुनी नहीं गईं", + "save_btn": "Save करें", + "back_btn": "वापस", + "builder_badge": "Builder", + "configure_tab": "Configure करें", + "commands_tab": "Commands", + "preview_tab": "Preview", + "setup_commands": "Setup commands", + "run_these_commands": "अपने project को setup करने के लिए इन commands को क्रम में चलाएं" +} diff --git a/src/locales/ja.json b/src/locales/ja.json index e69de29..27135e5 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Stack Builderをサポート", + "support_description": "このプロジェクトを無料およびオープンソースに保つのを支援してください。皆様の貢献が大きな違いを生みます。", + "share": "共有", + "support": "サポート", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "月次または1回限りのサポート", + "buy_me_coffee": "コーヒーをおごってください", + "buy_me_coffee_desc": "迅速な1回限りの寄付", + "thank_you_support": "オープンソースをサポートしていただきありがとうございます!", + "features": "機能", + "presets": "Presets", + "start_building": "開発開始", + "build_faster": "適切なstackでより速く開発", + "build_your_perfect": "あなたの完璧な", + "tech_stack": "Tech Stackを構築", + "stop_wasting_time": "ゼロからプロジェクトを構成するのに時間を無駄にするのを止めてください。テクノロジーを選択し、完璧なコマンドを取得し、数秒で開発を開始します。", + "open_builder": "Builderを開く", + "everything_you_need": "迅速に始めるために必要なすべて", + "thoughtfully_designed": "最新のweb開発のための思慮深く設計されたbuilder。", + "curated_stack": "キュレートされたStackオプション", + "choose_battle_tested": "Frontend、backend、database、toolingカテゴリにわたる、戦闘でテストされたテクノロジーから選択してください。", + "smart_compatibility": "スマート互換性", + "intelligent_system": "当社のintelligent systemは、互換性のない選択を防止し、最適な組み合わせを提案します。", + "instant_commands": "インスタントコマンド", + "get_ready_to_run": "選択とお好みのpackage managerに合わせたready-to-runのCLIコマンドを取得してください。", + "project_structure": "プロジェクト構造", + "view_recommended": "開始する前に、テクノロジーの選択に基づいて推奨folder構造を表示します。", + "start_with_preset": "Presetから始める", + "jump_start_project": "コミュニティのお気に入りの組み合わせであなたのプロジェクトをjump-startしてください。", + "use_this_preset": "このpresetを使用", + "ready_build_great": "何か素晴らしいものを作る準備ができていますか?", + "join_thousands": "Stack Builderを使用してプロジェクトをより速く開始する数千人の開発者に参加してください。", + "launch_builder": "Builderを起動", + "view_on_github": "GitHubで表示", + "built_with_care": "開発者コミュニティのために細心の注意を払って構築されました。", + "select_one": "1つ選択", + "recommended_structure": "推奨構造", + "share_your_stack": "Stackを共有", + "share_this_configuration": "この設定を他の人と共有", + "selected_technologies": "選択されたテクノロジー", + "share_link": "リンク共有", + "no_technologies_selected_yet": "まだテクノロジーが選択されていません", + "copy_btn": "コピー", + "copied_btn": "コピーしました", + "reset_all": "すべてリセット", + "random_stack": "ランダムstack", + "project_name": "プロジェクト名", + "command_label": "コマンド", + "selected_stack": "選択されたStack", + "no_technologies_selected": "テクノロジーが選択されていません", + "save_btn": "保存", + "back_btn": "戻る", + "builder_badge": "Builder", + "configure_tab": "設定", + "commands_tab": "コマンド", + "preview_tab": "プレビュー", + "setup_commands": "セットアップコマンド", + "run_these_commands": "プロジェクトをセットアップするために、これらのコマンドを順番に実行してください" +} diff --git a/src/locales/pt.json b/src/locales/pt.json index e69de29..e099216 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Apoie o Stack Builder", + "support_description": "Ajude-nos a manter este projeto gratuito e de código aberto. Sua contribuição faz diferença.", + "share": "Compartilhar", + "support": "Suporte", + "github_sponsors": "Patrocinadores GitHub", + "github_sponsors_desc": "Suporte mensal ou único", + "buy_me_coffee": "Compre-me um café", + "buy_me_coffee_desc": "Contribuição única e rápida", + "thank_you_support": "Obrigado por apoiar o código aberto!", + "features": "Recursos", + "presets": "Predefinições", + "start_building": "Começar a Construir", + "build_faster": "Construa mais rápido com a stack correta", + "build_your_perfect": "Construa sua Tech", + "tech_stack": "Stack Perfeita", + "stop_wasting_time": "Pare de perder tempo configurando projetos do zero. Selecione suas tecnologias, obtenha os comandos perfeitos e comece a construir em segundos.", + "open_builder": "Abrir Construtor", + "everything_you_need": "Tudo o que você precisa para começar rápido", + "thoughtfully_designed": "Um construtor cuidadosamente projetado para o desenvolvimento web moderno.", + "curated_stack": "Opções de stack recomendadas", + "choose_battle_tested": "Escolha entre tecnologias testadas em batalha nas categorias frontend, backend, banco de dados e ferramentas.", + "smart_compatibility": "Compatibilidade Inteligente", + "intelligent_system": "Nosso sistema inteligente previne seleções incompatíveis e sugere combinações ideais.", + "instant_commands": "Comandos Instantâneos", + "get_ready_to_run": "Obtenha comandos CLI prontos para usar personalizados para suas seleções e gerenciador de pacotes preferido.", + "project_structure": "Estrutura do Projeto", + "view_recommended": "Visualize a estrutura de pasta recomendada com base nas suas escolhas de tecnologia antes de começar.", + "start_with_preset": "Comece com uma predefinição", + "jump_start_project": "Inicie rapidamente seu projeto com combinações favoritas da comunidade.", + "use_this_preset": "Use esta predefinição", + "ready_build_great": "Pronto para construir algo ótimo?", + "join_thousands": "Junte-se a milhares de desenvolvedores que usam Stack Builder para iniciar seus projetos mais rápido.", + "launch_builder": "Iniciar Construtor", + "view_on_github": "Ver no GitHub", + "built_with_care": "Construído com cuidado para a comunidade de desenvolvedores.", + "select_one": "Selecione um", + "recommended_structure": "Estrutura Recomendada", + "share_your_stack": "Compartilhe Sua Stack", + "share_this_configuration": "Compartilhe esta configuração com outros", + "selected_technologies": "Tecnologias Selecionadas", + "share_link": "Link de Compartilhamento", + "no_technologies_selected_yet": "Nenhuma tecnologia selecionada ainda", + "copy_btn": "Copiar", + "copied_btn": "Copiado", + "reset_all": "Redefinir tudo", + "random_stack": "Stack aleatória", + "project_name": "Nome do Projeto", + "command_label": "Comando", + "selected_stack": "Stack Selecionada", + "no_technologies_selected": "Nenhuma tecnologia selecionada", + "save_btn": "Salvar", + "back_btn": "Voltar", + "builder_badge": "Construtor", + "configure_tab": "Configurar", + "commands_tab": "Comandos", + "preview_tab": "Visualizar", + "setup_commands": "Comandos de Configuração", + "run_these_commands": "Execute estes comandos em ordem para configurar seu projeto" +} diff --git a/src/locales/ru.json b/src/locales/ru.json index e69de29..f482524 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "Поддержите Stack Builder", + "support_description": "Помогите нам сохранить этот проект бесплатным и открытым исходным кодом. Ваш вклад имеет значение.", + "share": "Поделиться", + "support": "Поддержка", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "Ежемесячная или разовая поддержка", + "buy_me_coffee": "Купите мне кофе", + "buy_me_coffee_desc": "Быстрый разовый вклад", + "thank_you_support": "Спасибо за поддержку открытого исходного кода!", + "features": "Возможности", + "presets": "Presets", + "start_building": "Начать разработку", + "build_faster": "Разрабатывайте быстрее с правильным stack", + "build_your_perfect": "Постройте свой идеальный", + "tech_stack": "Tech Stack", + "stop_wasting_time": "Прекратите тратить время на настройку проектов с нуля. Выберите свои технологии, получите идеальные команды и начните разработку за секунды.", + "open_builder": "Открыть Builder", + "everything_you_need": "Всё что вам нужно чтобы начать быстро", + "thoughtfully_designed": "Тщательно продуманный builder для современной web-разработки.", + "curated_stack": "Отобранные варианты Stack", + "choose_battle_tested": "Выбирайте из боевых технологий в категориях frontend, backend, database и tooling.", + "smart_compatibility": "Умная совместимость", + "intelligent_system": "Наша intelligent система предотвращает несовместимые варианты и предлагает оптимальные комбинации.", + "instant_commands": "Мгновенные команды", + "get_ready_to_run": "Получите готовые к запуску CLI команды, адаптированные к вашему выбору и предпочтительному package manager.", + "project_structure": "Структура проекта", + "view_recommended": "Посмотрите рекомендуемую структуру папок на основе ваших технологических выборов перед началом.", + "start_with_preset": "Начните с preset", + "jump_start_project": "Быстро запустите свой проект с популярными комбинациями сообщества.", + "use_this_preset": "Использовать этот preset", + "ready_build_great": "Готовы ли вы построить что-то замечательное?", + "join_thousands": "Присоединитесь к тысячам разработчиков, которые используют Stack Builder для более быстрого запуска своих проектов.", + "launch_builder": "Запустить Builder", + "view_on_github": "Просмотр на GitHub", + "built_with_care": "Разработано с заботой о сообществе разработчиков.", + "select_one": "Выберите один", + "recommended_structure": "Рекомендуемая структура", + "share_your_stack": "Поделитесь своим Stack", + "share_this_configuration": "Поделитесь этой конфигурацией с другими", + "selected_technologies": "Выбранные технологии", + "share_link": "Ссылка общего доступа", + "no_technologies_selected_yet": "Технологии еще не выбраны", + "copy_btn": "Копировать", + "copied_btn": "Скопировано", + "reset_all": "Сбросить все", + "random_stack": "Случайный stack", + "project_name": "Имя проекта", + "command_label": "Команда", + "selected_stack": "Выбранный Stack", + "no_technologies_selected": "Технологии не выбраны", + "save_btn": "Сохранить", + "back_btn": "Назад", + "builder_badge": "Builder", + "configure_tab": "Конфигурировать", + "commands_tab": "Команды", + "preview_tab": "Предпросмотр", + "setup_commands": "Команды установки", + "run_these_commands": "Выполните эти команды по порядку, чтобы настроить проект" +} diff --git a/src/locales/zh.json b/src/locales/zh.json index e69de29..b6002c5 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -0,0 +1,60 @@ +{ + "support_stackbuilder": "支持 Stack Builder", + "support_description": "帮助我们保持这个项目免费和开源。您的贡献至关重要。", + "share": "分享", + "support": "支持", + "github_sponsors": "GitHub Sponsors", + "github_sponsors_desc": "月度或一次性支持", + "buy_me_coffee": "给我买杯咖啡", + "buy_me_coffee_desc": "快速一次性捐助", + "thank_you_support": "感谢您对开源的支持!", + "features": "功能", + "presets": "Presets", + "start_building": "开始开发", + "build_faster": "使用正确的stack更快地开发", + "build_your_perfect": "构建您的完美", + "tech_stack": "Tech Stack", + "stop_wasting_time": "停止浪费时间从头配置项目。选择您的技术,获得完美的命令,并在几秒钟内开始开发。", + "open_builder": "打开Builder", + "everything_you_need": "快速启动所需的一切", + "thoughtfully_designed": "为现代web开发精心设计的builder。", + "curated_stack": "精选Stack选项", + "choose_battle_tested": "从frontend、backend、database和tooling类别中经过战斗检验的技术中进行选择。", + "smart_compatibility": "智能兼容性", + "intelligent_system": "我们的intelligent系统可防止不兼容的选择并建议最佳组合。", + "instant_commands": "即时命令", + "get_ready_to_run": "获得根据您的选择和首选package manager定制的现成CLI命令。", + "project_structure": "项目结构", + "view_recommended": "根据您的技术选择查看建议的文件夹结构,然后开始。", + "start_with_preset": "从preset开始", + "jump_start_project": "使用社区最受欢迎的组合快速启动您的项目。", + "use_this_preset": "使用此preset", + "ready_build_great": "准备好构建一些伟大的东西吗?", + "join_thousands": "加入数千名使用Stack Builder更快地启动项目的开发者。", + "launch_builder": "启动Builder", + "view_on_github": "在GitHub上查看", + "built_with_care": "以关怀开发者社区的方式构建。", + "select_one": "选择一个", + "recommended_structure": "推荐结构", + "share_your_stack": "分享您的Stack", + "share_this_configuration": "与他人分享此配置", + "selected_technologies": "选定的技术", + "share_link": "分享链接", + "no_technologies_selected_yet": "尚未选择任何技术", + "copy_btn": "复制", + "copied_btn": "已复制", + "reset_all": "重置全部", + "random_stack": "随机stack", + "project_name": "项目名称", + "command_label": "命令", + "selected_stack": "选定的Stack", + "no_technologies_selected": "未选择任何技术", + "save_btn": "保存", + "back_btn": "返回", + "builder_badge": "Builder", + "configure_tab": "配置", + "commands_tab": "命令", + "preview_tab": "预览", + "setup_commands": "设置命令", + "run_these_commands": "按顺序运行这些命令以设置您的项目" +} diff --git a/src/main.tsx b/src/main.tsx index d895272..927197d 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,13 +4,17 @@ import "./index.css"; import App from "./App.tsx"; import { ThemeProvider } from "./components/theme-provider.tsx"; import { BrowserRouter } from "react-router-dom"; +import { I18nextProvider } from "react-i18next"; +import i18n from "./i18n.ts"; createRoot(document.getElementById("root")!).render( - - - - - + + + + + + + , ); diff --git a/src/pages/Builder.tsx b/src/pages/Builder.tsx index 08d25fd..e0be04a 100644 --- a/src/pages/Builder.tsx +++ b/src/pages/Builder.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from "react"; -import { Link, useSearchParams } from "react-router-dom"; +import { Link, useParams, useSearchParams } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; @@ -49,6 +49,7 @@ import { import { cn } from "@/lib/utils"; import CommandStep from "@/components/command-step"; import { ModeToggle } from "@/components/mode-toggle"; +import { useTranslation } from "react-i18next"; function CategorySection({ category, @@ -61,6 +62,7 @@ function CategorySection({ onSelect: (tech: Technology, category: (typeof categories)[number]) => void; isIncompatible: (tech: Technology) => boolean; }) { + const { t } = useTranslation(); return (
@@ -70,7 +72,7 @@ function CategorySection({ {category.singleSelect && ( - Select one + {t("select_one")} )}
@@ -140,6 +142,7 @@ function FolderStructure({ projectName: string; selections: Set; }) { + const { t } = useTranslation(); const generateStructure = () => { // Helper function to get the correct file extension based on TypeScript selection const getExt = (type: "ts" | "tsx" = "ts"): string => { @@ -384,7 +387,7 @@ function FolderStructure({ return (

- Recommended Structure + {t("recommended_structure")}

@@ -417,7 +420,9 @@ function FolderStructure({ } function ShareDialog({ selections }: { selections: Set }) { + const { t } = useTranslation(); const [copied, setCopied] = useState(false); + const { lang } = useParams(); // Map category IDs to URL parameter names const categoryMap: Record = { @@ -467,8 +472,8 @@ function ShareDialog({ selections }: { selections: Set }) { const baseUrl = typeof window !== "undefined" - ? `${window.location.origin}/builder` - : "http://localhost:3000/builder"; + ? `${window.location.origin}/${lang}/builder` + : `http://stack-builder/${lang}/builder`; return params.toString() ? `${baseUrl}?${params.toString()}` : baseUrl; }; @@ -498,25 +503,21 @@ function ShareDialog({ selections }: { selections: Set }) { return ( - - Share Your Stack - - Share this configuration with others - + {t("share_your_stack")} + {t("share_this_configuration")}
-

Selected Technologies

+

+ {t("selected_technologies")} +

{selectedTechs.length > 0 ? ( selectedTechs.map((tech) => ( @@ -542,26 +543,28 @@ function ShareDialog({ selections }: { selections: Set }) { )) ) : (

- No technologies selected yet + {t("no_technologies_selected_yet")}

)}
- +
@@ -574,6 +577,9 @@ function ShareDialog({ selections }: { selections: Set }) { } export default function BuilderPage() { + const { t } = useTranslation(); + const { lang } = useParams(); + const searchParams = useSearchParams()[0]; const presetParam = searchParams.get("preset"); @@ -746,23 +752,23 @@ export default function BuilderPage() {
- Back + {t("back_btn")}
Logo - StackForge + Stack Builder - Builder + {t("builder_badge")}
@@ -775,7 +781,7 @@ export default function BuilderPage() { - Reset all + {t("reset_all")} @@ -785,13 +791,13 @@ export default function BuilderPage() { - Random stack + {t("random_stack")} @@ -818,7 +824,7 @@ export default function BuilderPage() {
-

- Setup Commands + {t("setup_commands")}

- Run these commands in order to set up your project + {t("run_these_commands")}

{allCommands.map((step, index) => ( diff --git a/src/pages/LandingPage.tsx b/src/pages/LandingPage.tsx index 9b2744a..cff1dac 100644 --- a/src/pages/LandingPage.tsx +++ b/src/pages/LandingPage.tsx @@ -1,5 +1,6 @@ import { useState } from "react"; import { Link } from "react-router-dom"; +import { HashLink } from "react-router-hash-link"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -23,6 +24,7 @@ import { Twitter, Coffee, } from "lucide-react"; +import { useTranslation } from "react-i18next"; const techLogos = [ { name: "React", icon: "react" }, @@ -38,27 +40,23 @@ const techLogos = [ const features = [ { icon: Layers, - title: "Curated Stack Options", - description: - "Choose from battle-tested technologies across frontend, backend, database, and tooling categories.", + title: "curated_stack", + description: "choose_battle_tested", }, { icon: Zap, - title: "Smart Compatibility", - description: - "Our intelligent system prevents incompatible selections and suggests optimal combinations.", + title: "smart_compatibility", + description: "intelligent_system", }, { icon: Terminal, - title: "Instant Commands", - description: - "Get ready-to-run CLI commands tailored to your selections and preferred package manager.", + title: "instant_commands", + description: "get_ready_to_run", }, { icon: Sparkles, - title: "Project Structure", - description: - "View the recommended folder structure based on your technology choices before you start.", + title: "project_structure", + description: "view_recommended", }, ]; @@ -88,25 +86,22 @@ const presets = [ ]; function SupportDialog() { + const { t } = useTranslation(); return ( - Support StackForge - - Help us keep this project free and open source. Your contribution - makes a difference. - + {t("support_stackbuilder")} + {t("support_description")}
Buy Me a Coffee
- Quick one-time contribution + {t("buy_me_coffee_desc")}

- Thank you for supporting open source! + {t("thank_you_support")}

@@ -153,10 +148,11 @@ function SupportDialog() { } export default function LandingPage() { + const { t } = useTranslation(); const [copied, setCopied] = useState(false); const handleCopy = () => { - navigator.clipboard.writeText("npx create-stackforge@latest my-app"); + navigator.clipboard.writeText("npx create-stackbuilder@latest my-app"); setCopied(true); setTimeout(() => setCopied(false), 2000); }; @@ -168,28 +164,30 @@ export default function LandingPage() {
Logo - StackForge + Stack Builder
-

+

{t("built_with_care")}