@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
JavaScript
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;
}
}