diff --git a/README.md b/README.md index 18caa3d..c610b54 100644 --- a/README.md +++ b/README.md @@ -2,83 +2,72 @@ # Stack Builder -O **Stack Builder** é uma ferramenta para montar rapidamente o setup de um projeto. Você escolhe a stack e as tecnologias desejadas, e a aplicação gera comandos prontos para copiar e colar no terminal, agilizando o início do desenvolvimento. +**Stack Builder** is a tool designed to quickly set up a project environment. You choose the stack and desired technologies, and the application generates ready-to-use commands that you can copy and paste into the terminal, speeding up the start of development. -Além disso, o Stack Builder sugere uma estrutura de pastas organizada, seguindo boas práticas para cada stack escolhida. +In addition, Stack Builder suggests an organized folder structure, following best practices for each selected stack. -## 🚀 Demonstração +## 🚀 Demo -Confira abaixo uma prévia visual do Stack Builder em ação: +Check out a visual preview of Stack Builder in action below: -### Edição de texto com formatação +### Editing with Formatting ![Demonstração1](/docs/Demontração%201.gif) -A interface permite selecionar opções de stack e visualizar rapidamente os comandos e a estrutura recomendada para o projeto. +The interface allows you to select stack options and quickly view the commands and the recommended project structure. -## 📦 Funcionalidades +## 📦 Features -- ✅ Geração automática de comandos para setup do projeto -- ✅ Sugestão de estrutura de pastas baseada em boas práticas -- ✅ Interface responsiva e amigável -- ✅ Temas com estilização moderna via TailwindCSS e shadcn/ui -- ✅ Ícones interativos com lucide-react -- ✅ Suporte para 10 idiomas -- 🔧 Construído com Next.js + TypeScript, garantindo performance e escalabilidade -- 🔧 Código limpo com padronização via Biome +- ✅ Automatic generation of setup commands +- ✅ Folder structure suggestions based on best practices +- ✅ Responsive and user-friendly interface +- ✅ Modern themed styling with TailwindCSS and shadcn/ui +- ✅ Interactive icons with lucide-react +- ✅ Support for 10 languages +- 🔧 Built with Vite + React + TypeScript, ensuring performance and scalability +- 🔧 Clean code with standardization via ESLint -## 🛠️ Tecnologias Utilizadas +## 🛠️ Technologies Used -- **Linguagem/Framework:** +- **Language/Framework:** - [TypeScript](https://www.typescriptlang.org/) - - [React](https://react.dev/) com [Vite](https://vite.dev/) + - [React](https://react.dev/) with [Vite](https://vite.dev/) -- **Gerenciamento de estado:** - - [Zustand](https://zustand-demo.pmnd.rs/) - -- **Estilização:** +- **Styling:** - [TailwindCSS](https://tailwindcss.com/) - [shadcn/ui](https://ui.shadcn.com/) -- **Ícones:** +- **Icons:** - [lucide-react](https://lucide.dev/) -- **Formatação & Qualidade de Código:** +- **Formatting & Code Quality:** - [ESLint](https://eslint.org/) - [Prettier](https://prettier.io/) -- **Outras ferramentas:** - - [Git](https://git-scm.com/) & [GitHub](https://github.com/) +- **Other tools:** + - [Git](https://git-scm.com/) and [GitHub](https://github.com/) -## ⚙ Instalação +## ⚙ Installation -Para rodar o projeto localmente, siga os passos abaixo. +To run the project locally, follow the steps below. > [!NOTE] -> **Dica**: Antes de começar, certifique-se de ter o **Node.js** instalado na versão mais recente. +> **Tip**: Before starting, make sure you have **Node.js** installed in the latest version. -1. Clone o repositório: +1. Clone the repository: ```bash git clone https://github.com/FelipeRicard0/stack-builder.git ``` -2. Instale as dependências: +2. Install dependencies: ```bash pnpm install ``` -3. Rode o projeto: +3. Run the project: ```bash 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 +## License -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. +Distributed under a custom non-commercial use license. See [`LICENSE`](https://github.com/FelipeRicard0/stack-builder/blob/main/LICENSE) for more information. diff --git a/docs/Capa.png b/docs/Capa.png new file mode 100644 index 0000000..be9e757 Binary files /dev/null and b/docs/Capa.png differ diff --git a/index.html b/index.html index af8d2bb..b5200ae 100644 --- a/index.html +++ b/index.html @@ -4,10 +4,10 @@ - stack-builder + Stack Builder diff --git a/package.json b/package.json index e71a9ae..c2e2db3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "stack-builder", "private": true, - "version": "0.5.0", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite", @@ -16,8 +16,10 @@ "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", + "@types/react-router-hash-link": "^2.4.9", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "i18next": "^25.8.0", "lucide-react": "^0.563.0", "react": "^19.2.0", "react-dom": "^19.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d2d043..44a33ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,12 +26,18 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.2.8 version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@types/react-router-hash-link': + specifier: ^2.4.9 + version: 2.4.9 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 clsx: specifier: ^2.1.1 version: 2.1.1 + i18next: + specifier: ^25.8.0 + version: 25.8.0(typescript@5.9.3) lucide-react: specifier: ^0.563.0 version: 0.563.0(react@19.2.4) @@ -1059,6 +1065,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1070,6 +1079,15 @@ packages: peerDependencies: '@types/react': ^19.2.0 + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router-hash-link@2.4.9': + resolution: {integrity: sha512-zl/VMj+lfJZhvjOAQXIlBVPNKSK+/fRG8AUHhlP9++LhlA2ziLeTmbRxIMJI3PCiCTS+W/FosEoDRoNOGH0OzA==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + '@types/react@19.2.10': resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} @@ -2763,6 +2781,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/history@4.7.11': {} + '@types/json-schema@7.0.15': {} '@types/node@24.10.9': @@ -2773,6 +2793,23 @@ snapshots: dependencies: '@types/react': 19.2.10 + '@types/react-router-dom@5.3.3': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.10 + '@types/react-router': 5.1.20 + + '@types/react-router-hash-link@2.4.9': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.10 + '@types/react-router-dom': 5.3.3 + + '@types/react-router@5.1.20': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.10 + '@types/react@19.2.10': dependencies: csstype: 3.2.3 diff --git a/src/App.tsx b/src/App.tsx index 8300e81..3035ae3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,50 @@ -import { Route, Routes } from "react-router-dom"; +import { Navigate, Route, Routes, useParams } from "react-router-dom"; import Buildpage from "./pages/Builder"; import LandingPage from "./pages/LandingPage"; +import i18n from "./i18n"; +import { useEffect } from "react"; + +function LangLayout() { + const { lang } = useParams(); + + const supported = [ + "ar", + "bn", + "en", + "es", + "fr", + "hi", + "ja", + "pt", + "ru", + "zh", + ]; + const validLang = supported.includes(String(lang)) ? lang : "en"; + + useEffect(() => { + 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/components/theme-provider.tsx b/src/components/theme-provider.tsx index e18440d..7dc566d 100644 --- a/src/components/theme-provider.tsx +++ b/src/components/theme-provider.tsx @@ -23,7 +23,7 @@ const ThemeProviderContext = createContext(initialState); export function ThemeProvider({ children, defaultTheme = "system", - storageKey = "vite-ui-theme", + storageKey = "stack-builder-theme", ...props }: ThemeProviderProps) { const [theme, setTheme] = useState( 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/lib/command-generator.ts b/src/lib/command-generator.ts index 76432b0..7bf677c 100644 --- a/src/lib/command-generator.ts +++ b/src/lib/command-generator.ts @@ -4,29 +4,15 @@ export type CommandStep = { description?: string; }; -/** - * Valida seleções para detectar dependências conflitantes ou redundantes. - * - * @param selections - Set de strings representando as tecnologias selecionadas - * @returns Array de strings contendo avisos sobre conflitos ou incompatibilidades - * - * @example - * ```ts - * const warnings = validateSelections(new Set(["biome", "eslint"])); - * // Retorna: ["Biome e ESLint podem conflitar. Recomenda-se escolher apenas um."] - * ``` - */ export function validateSelections(selections: Set): string[] { const warnings: string[] = []; - // Verificar linters conflitantes if (selections.has("biome") && selections.has("eslint")) { warnings.push( "Biome e ESLint podem conflitar. Recomenda-se escolher apenas um.", ); } - // Verificar múltiplos ORMs const orms = ["drizzle", "prisma", "mongoose"]; const selectedOrms = orms.filter((orm) => selections.has(orm)); if (selectedOrms.length > 1) { @@ -35,21 +21,18 @@ export function validateSelections(selections: Set): string[] { ); } - // Verificar múltiplos gerenciadores de Git hooks if (selections.has("husky") && selections.has("lefthook")) { warnings.push( "Husky e Lefthook são ambos gerenciadores de Git hooks. Escolha apenas um.", ); } - // Verificar Auth.js sem Next.js if (selections.has("authjs") && !selections.has("nextjs")) { warnings.push( "Auth.js (next-auth) é projetado principalmente para Next.js.", ); } - // Verificar múltiplos routers const routers = ["tanstack-router", "react-router"]; const selectedRouters = routers.filter((router) => selections.has(router)); if (selectedRouters.length > 1) { @@ -58,23 +41,9 @@ export function validateSelections(selections: Set): string[] { ); } - // Verificar TanStack Router sem framework adequado - if ( - selections.has("tanstack-router") && - !selections.has("tanstack-start") && - !selections.has("nextjs") && - !selections.has("react-router") - ) { - // TanStack Router é para React, então está ok se houver React base - // Este aviso só será mostrado se nenhum framework React estiver selecionado - } - return warnings; } -/** - * Constantes para agrupamentos de frameworks e tecnologias. - */ const FRAMEWORKS_WITH_TAILWIND = [ "nextjs", "expo-uniwind", @@ -88,44 +57,10 @@ const FRAMEWORKS_WITH_TAILWIND = [ "nuxt", ]; -// Constantes documentadas para referência futura -// const NODE_FRAMEWORKS = ["express", "fastify", "hono", "elysia"]; -// const EXPO_FRAMEWORKS = ["expo-bare", "expo-uniwind", "expo-unistyles"]; -// const FRONTEND_FRAMEWORKS = [ -// "nextjs", -// "tanstack-router", -// "react-router", -// "tanstack-start", -// "nuxt", -// "astro", -// "svelte", -// "solid", -// ]; - -/** - * Verifica se o set de seleções contém qualquer uma das opções fornecidas. - * - * @param selections - Set de strings representando as seleções - * @param options - Array de strings para verificar - * @returns true se qualquer opção estiver em selections - */ function hasAnySelection(selections: Set, options: string[]): boolean { return options.some((option) => selections.has(option)); } -/** - * Gera uma lista de passos de comando para configurar um projeto baseado nas seleções do usuário. - * - * @param projectName - Nome do projeto a ser criado - * @param selections - Set de strings representando as tecnologias selecionadas - * @returns Array de objetos CommandStep contendo label, command e description - * - * @example - * ```ts - * const steps = generateCommands("my-app", new Set(["nextjs", "typescript", "tailwindcss"])); - * // Retorna comandos para criar um projeto Next.js com TypeScript e Tailwind - * ``` - */ export function generateCommands( projectName: string, selections: Set, @@ -163,20 +98,15 @@ export function generateCommands( ? "yarn add -D" : "bun add -d"; - // Track if initialization includes cd (for manual mkdir cases) let needsSeparateCd = false; - // Helper to check if using Tailwind (for prettier-plugin-tailwindcss) const usesTailwind = hasAnySelection(selections, FRAMEWORKS_WITH_TAILWIND) || selections.has("tailwindcss"); - // 1. Project initialization if (selections.has("nextjs")) { - // Build Next.js command with only selected options let nextCmd = `${pmx === "npx" ? "npx" : pm} create${pmx === "npx" ? "-" : " "}next-app@latest ${projectName}`; - // Add conditional flags based on user selections const flags: string[] = []; flags.push(selections.has("typescript") ? "--typescript" : "--js"); @@ -219,7 +149,6 @@ export function generateCommands( }); needsSeparateCd = true; } else if (selections.has("solid")) { - // Usar template ts se TypeScript selecionado, caso contrário js const solidTemplate = selections.has("typescript") ? "ts" : "js"; const description = selections.has("typescript") ? "Initialize a new Solid project with TypeScript" @@ -239,7 +168,6 @@ export function generateCommands( }); needsSeparateCd = true; } else if (selections.has("tanstack-router")) { - // Usar template react-ts se TypeScript selecionado, caso contrário react const viteTemplate = selections.has("typescript") ? "react-ts" : "react"; const description = selections.has("typescript") ? "Initialize a new React project with Vite and TypeScript" @@ -252,7 +180,6 @@ export function generateCommands( }); needsSeparateCd = true; } else if (selections.has("react-router")) { - // Usar template react-ts se TypeScript selecionado, caso contrário react const viteTemplate = selections.has("typescript") ? "react-ts" : "react"; const description = selections.has("typescript") ? "Initialize a new React project with Vite and TypeScript" @@ -290,7 +217,6 @@ export function generateCommands( }); needsSeparateCd = true; } else if (selections.has("express") || selections.has("fastify")) { - // For Express/Fastify, combine mkdir + cd + init + folder structure into one step const initCmd = pm === "npm" ? `npm init -y` @@ -306,9 +232,8 @@ export function generateCommands( description: "Create a new Node.js project directory with recommended structure and initialize package.json", }); - needsSeparateCd = false; // Already included cd + needsSeparateCd = false; } else { - // Generic initialization - combine mkdir + cd + init const initCmd = pm === "npm" ? `npm init -y` @@ -322,10 +247,9 @@ export function generateCommands( command: `mkdir ${projectName} && cd ${projectName} && ${initCmd}`, description: "Create a new project directory and initialize package.json", }); - needsSeparateCd = false; // Already included cd + needsSeparateCd = false; } - // 2. Create server structure for monorepo (frontend + backend) const isMonorepo = (selections.has("nextjs") || selections.has("tanstack-router") || @@ -345,7 +269,6 @@ export function generateCommands( }); } - // 3. Navigate to project (only if not already included in init command) if (!isMonorepo && needsSeparateCd) { steps.push({ label: "Navigate to project", @@ -354,11 +277,9 @@ export function generateCommands( }); } - // 4. Additional dependencies based on selections const deps: string[] = []; const devDeps: string[] = []; - // Router dependencies if (selections.has("tanstack-router") && !selections.has("tanstack-start")) { deps.push("@tanstack/react-router"); devDeps.push("@tanstack/router-plugin"); @@ -368,7 +289,6 @@ export function generateCommands( deps.push("react-router-dom"); } - // Backend framework (if not already included) if (selections.has("hono") && !steps[0].command.includes("hono")) { deps.push("hono"); } @@ -403,7 +323,6 @@ export function generateCommands( ); } - // Database & ORM if (selections.has("drizzle")) { deps.push("drizzle-orm"); devDeps.push("drizzle-kit"); @@ -449,7 +368,6 @@ export function generateCommands( } if (selections.has("authjs")) { - // Use next-auth v5 (stable) - anteriormente era beta deps.push("next-auth"); } @@ -457,9 +375,7 @@ export function generateCommands( deps.push("lucia", "@lucia-auth/adapter-drizzle"); } - // UI Libraries if (selections.has("shadcn")) { - // shadcn is installed via CLI, but we need the base deps deps.push("class-variance-authority", "clsx", "tailwind-merge"); } @@ -475,7 +391,6 @@ export function generateCommands( deps.push("@ark-ui/react"); } - // Payments if (selections.has("stripe")) { deps.push("stripe", "@stripe/stripe-js"); } @@ -484,7 +399,6 @@ export function generateCommands( deps.push("@polar-sh/nextjs"); } - // Validation if (selections.has("zod")) { deps.push("zod"); } @@ -493,49 +407,42 @@ export function generateCommands( deps.push("valibot"); } - // TypeScript (Abordagem Minimalista) if (selections.has("typescript")) { - // Lista de frameworks que JÁ instalam TypeScript via CLI const frameworkInstallsTS = (selections.has("nextjs") && - steps[0]?.command.includes("--typescript")) || // create-next-app --typescript - selections.has("nuxt") || // nuxi init (sempre TS) - selections.has("astro") || // create astro (inclui TS) - selections.has("tanstack-start") || // create-tanstack-app (inclui TS) + steps[0]?.command.includes("--typescript")) || + selections.has("nuxt") || + selections.has("astro") || + selections.has("tanstack-start") || (selections.has("tanstack-router") && - steps[0]?.command.includes("react-ts")) || // vite react-ts + steps[0]?.command.includes("react-ts")) || (selections.has("react-router") && - steps[0]?.command.includes("react-ts")) || // vite react-ts - (selections.has("svelte") && steps[0]?.command.includes("sv create")) || // sv create instala TS - (selections.has("solid") && steps[0]?.command.includes("templates/ts")); // Solid ts template + steps[0]?.command.includes("react-ts")) || + (selections.has("svelte") && steps[0]?.command.includes("sv create")) || + (selections.has("solid") && steps[0]?.command.includes("templates/ts")); - // Só instalar typescript se o framework NÃO instalou if (!frameworkInstallsTS) { devDeps.push("typescript"); } - // Lista de frameworks que JÃ instalam @types/node via CLI const frameworkInstallsTypesNode = (selections.has("nextjs") && - steps[0]?.command.includes("--typescript")) || // create-next-app --typescript - selections.has("nuxt") || // nuxi init - selections.has("astro") || // create astro - selections.has("tanstack-start") || // create-tanstack-app - (selections.has("hono") && steps[0]?.command.includes("create hono")) || // hono CLI - (selections.has("elysia") && steps[0]?.command.includes("create elysia")); // elysia CLI - - // Projetos que NÃO precisam de @types/node (React Native) + steps[0]?.command.includes("--typescript")) || + selections.has("nuxt") || + selections.has("astro") || + selections.has("tanstack-start") || + (selections.has("hono") && steps[0]?.command.includes("create hono")) || + (selections.has("elysia") && steps[0]?.command.includes("create elysia")); + const isReactNative = selections.has("expo-bare") || selections.has("expo-uniwind") || selections.has("expo-unistyles"); - // Instalar @types/node apenas se: 1. Não é React Native 2. Framework não instalou if (!isReactNative && !frameworkInstallsTypesNode) { devDeps.push("@types/node"); } - // tsx e tsc-alias: APENAS para backends puros que precisam executar TS diretamente const needsRuntimeTS = selections.has("express") || selections.has("fastify") || @@ -547,12 +454,10 @@ export function generateCommands( } } - // Tailwind CSS (Abordagem Minimalista) if (selections.has("tailwindcss") && !selections.has("nextjs")) { devDeps.push("tailwindcss", "@tailwindcss/vite"); } - // Tooling if (selections.has("biome") && !selections.has("nextjs")) { devDeps.push("@biomejs/biome"); } @@ -563,7 +468,6 @@ export function generateCommands( if (selections.has("prettier")) { devDeps.push("prettier"); - // Only add tailwind plugin if using Tailwind CSS if (usesTailwind || selections.has("tailwindcss")) { devDeps.push("prettier-plugin-tailwindcss"); } @@ -596,7 +500,6 @@ export function generateCommands( deps.push("react-native-unistyles"); } - // Add dependency installation steps if (deps.length > 0) { steps.push({ label: "Install dependencies", @@ -605,7 +508,6 @@ export function generateCommands( }); } - // Install dev dependencies (excluding packages already installed by framework CLIs) if (devDeps.length > 0) { steps.push({ label: "Install dev dependencies", @@ -615,7 +517,6 @@ export function generateCommands( }); } - // 4. Setup commands if (selections.has("shadcn")) { steps.push({ label: "Initialize shadcn/ui", @@ -638,8 +539,6 @@ export function generateCommands( }); } - // Tailwind CSS is configured automatically - no initialization needed - if (selections.has("prisma")) { steps.push({ label: "Initialize Prisma", @@ -672,7 +571,6 @@ export function generateCommands( }); } - // 5. Git initialization if (selections.has("git-init")) { steps.push({ label: "Initialize Git", @@ -684,20 +582,6 @@ export function generateCommands( return steps; } -/** - * Gera um único comando de inicialização de projeto. - * Retorna apenas o comando primário para criar o projeto, sem etapas adicionais. - * - * @param projectName - Nome do projeto a ser criado - * @param selections - Set de strings representando as tecnologias selecionadas - * @returns String contendo o comando de inicialização do projeto - * - * @example - * ```ts - * const cmd = generateSingleCommand("my-app", new Set(["nextjs", "typescript"])); - * // Retorna: "npx create-next-app@latest my-app --app --src-dir ..." - * ``` - */ export function generateSingleCommand( projectName: string, selections: Set, @@ -718,9 +602,7 @@ export function generateSingleCommand( ? "yarn dlx" : "bunx"; - // Return the primary creation command if (selections.has("nextjs")) { - // Build Next.js command with only selected options const nextCmd = `${pmx === "npx" ? "npx" : pm} create${pmx === "npx" ? "-" : " "}next-app@latest ${projectName}`; const flags: string[] = []; 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..fc5687c 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..966915e 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"; @@ -31,7 +31,6 @@ import { Check, RotateCcw, Shuffle, - Save, Share2, ChevronRight, Settings, @@ -49,6 +48,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 +61,7 @@ function CategorySection({ onSelect: (tech: Technology, category: (typeof categories)[number]) => void; isIncompatible: (tech: Technology) => boolean; }) { + const { t } = useTranslation(); return (
@@ -70,7 +71,7 @@ function CategorySection({ {category.singleSelect && ( - Select one + {t("select_one")} )}
@@ -140,6 +141,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 +386,7 @@ function FolderStructure({ return (

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

@@ -417,7 +419,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 +471,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 +502,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 +542,28 @@ function ShareDialog({ selections }: { selections: Set }) { )) ) : (

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

)}
- +
@@ -574,6 +576,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 +751,23 @@ export default function BuilderPage() {
- Back + {t("back_btn")}
Logo - StackForge + Stack Builder - Builder + {t("builder_badge")}
@@ -775,7 +780,7 @@ export default function BuilderPage() { - Reset all + {t("reset_all")} @@ -785,13 +790,13 @@ export default function BuilderPage() { - Random stack + {t("random_stack")} @@ -818,7 +823,7 @@ export default function BuilderPage() {
@@ -920,25 +910,24 @@ export default function BuilderPage() { className="data-[state=active]:bg-secondary gap-2" > - Configure + {t("configure_tab")} - Commands + {t("commands_tab")} - Preview + {t("preview_tab")}
-

- 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..85cfaad 100644 --- a/src/pages/LandingPage.tsx +++ b/src/pages/LandingPage.tsx @@ -1,5 +1,5 @@ -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, @@ -18,11 +18,12 @@ import { Sparkles, Terminal, Zap, - Copy, - Check, Twitter, - Coffee, + Menu, + X, } from "lucide-react"; +import { useTranslation } from "react-i18next"; +import { useState } from "react"; const techLogos = [ { name: "React", icon: "react" }, @@ -38,27 +39,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 +85,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("github_sponsors_desc")}

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

@@ -153,58 +131,76 @@ function SupportDialog() { } export default function LandingPage() { - const [copied, setCopied] = useState(false); - - const handleCopy = () => { - navigator.clipboard.writeText("npx create-stackforge@latest my-app"); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; + const { t } = useTranslation(); + const [menu, setMenu] = useState(false); + const [visible, setVisible] = useState(false); return ( <> -
+
Logo - - StackForge + + Stack Builder
-
- - - + {window.innerWidth <= 640 && ( + + )}
@@ -221,17 +217,17 @@ export default function LandingPage() { } > - Build faster with the right stack + {t("build_faster")}

- Build Your Perfect + {t("build_your_perfect")}
- Tech Stack + {t("tech_stack")}

- Stop wasting time configuring projects from scratch. Select your - technologies, get the perfect commands, and start building in - seconds. + {t("stop_wasting_time")}

- + -
@@ -299,10 +278,10 @@ export default function LandingPage() {

- Everything you need to start fast + {t("everything_you_need")}

- A thoughtfully designed builder for modern web development. + {t("thoughtfully_designed")}

@@ -315,10 +294,10 @@ export default function LandingPage() {

- {feature.title} + {t(feature.title)}

- {feature.description} + {t(feature.description)}

))} @@ -329,10 +308,10 @@ export default function LandingPage() {

- Start with a preset + {t("start_with_preset")}

- Jump-start your project with community-favorite combinations. + {t("jump_start_project")}

@@ -340,7 +319,7 @@ export default function LandingPage() { {presets.map((preset) => (

@@ -358,7 +337,7 @@ export default function LandingPage() { ))}

- Use this preset + {t("use_this_preset")}
@@ -370,16 +349,13 @@ export default function LandingPage() {

- Ready to build something great? + {t("ready_build_great")}

-

- Join thousands of developers who use StackForge to start their - projects faster. -

+

{t("join_thousands")}

- + @@ -390,7 +366,7 @@ export default function LandingPage() { >
@@ -404,10 +380,10 @@ export default function LandingPage() {
- StackForge + Stack Builder
-

- Built with care for the developer community. +

+ {t("built_with_care")}