UNPKG

@reliverse/rse-sdk

Version:

@reliverse/rse-sdk allows you to create new plugins for @reliverse/rse CLI, interact with reliverse.org, and even extend your own CLI functionality (you may also try @reliverse/dler-sdk for this case).

103 lines (102 loc) 2.96 kB
import path from "@reliverse/pathkit"; import { ensuredir } from "@reliverse/relifso"; import fs from "@reliverse/relifso"; import { relinka } from "@reliverse/relinka"; async function isI18nAlreadySetup(projectPath) { const checkPaths = [ "src/app/[locale]", "src/app/[lang]", "src/i18n", "src/locales", "src/translations", "src/config/i18n.ts", "src/utils/i18n.ts" ]; for (const checkPath of checkPaths) { if (await fs.pathExists(path.join(projectPath, checkPath))) { return true; } } return false; } export async function setupI18nFiles(projectPath) { try { if (await isI18nAlreadySetup(projectPath)) { relinka( "info", "i18n is already set up in this project, skipping setup." ); return; } await ensuredir(projectPath); const layoutPath = path.join(projectPath, "src/app/layout.tsx"); if (!await fs.pathExists(layoutPath)) { await ensuredir(path.dirname(layoutPath)); const layoutContent = ` import { dir } from "i18next"; import { languages } from "../.."; import { useTranslation } from "../i18n"; import { type Metadata } from "next"; export async function generateMetadata(): Promise<Metadata> { return { title: "Internationalized App", description: "App with i18n support", }; } export default function RootLayout({ children, params: { lang }, }: { children: React.ReactNode; params: { lang: string }; }) { return ( <html lang={lang} dir={dir(lang)}> <body>{children}</body> </html> ); } export function generateStaticParams() { return languages.map((lang) => ({ lang })); }`; await fs.writeFile(layoutPath, layoutContent); relinka("success", "Generated i18n layout file"); } const pagePath = path.join(projectPath, "src/app/page.tsx"); if (!await fs.pathExists(pagePath)) { const pageContent = ` import { useTranslation } from "../i18n"; export default async function Home() { const { t } = await useTranslation(); return ( <main> <h1>{t("welcome")}</h1> </main> ); }`; await fs.writeFile(pagePath, pageContent); relinka("success", "Generated i18n page file"); } const i18nConfigPath = path.join(projectPath, "src/config/i18n.ts"); if (!await fs.pathExists(i18nConfigPath)) { await ensuredir(path.dirname(i18nConfigPath)); const i18nConfigContent = ` export const languages = ["en", "es", "fr"]; export const defaultLanguage = "en"; export const languageNames = { en: "English", es: "Espa\xF1ol", fr: "Fran\xE7ais", } as const;`; await fs.writeFile(i18nConfigPath, i18nConfigContent); relinka("success", "Generated i18n configuration"); } relinka("success", "Internationalization was successfully integrated."); } catch (error) { relinka( "error", `Error during i18n setup: ${error instanceof Error ? error.message : String(error)}` ); throw error; } }