Next.js Integration

UrduMagic works seamlessly with Next.js App Router and Pages Router, supporting both Client-Side Magic Mode and Server-Side Rendering (SSR).


1. Client-Side Magic Mode (App Router)

To enable automatic whole-page DOM translation with a floating toggle button, initialize UrduMagic inside a Client Component:

Create UrduMagicInit.tsx

tsx
'use client';

import { useEffect } from 'react';
import { UrduMagic } from 'urdumagic';

export function UrduMagicInit() {
  useEffect(() => {
    const instance = UrduMagic.init({
      defaultLang: 'en',
      modes: ['en', 'ur', 'roman'],
      showSwitcher: true, // Injects floating toggle button
    });

    return () => instance.destroy();
  }, []);

  return null;
}

Add to Root Layout (app/layout.tsx)

tsx
import { UrduMagicInit } from '@/components/UrduMagicInit';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        {children}
        <UrduMagicInit />
      </body>
    </html>
  );
}

2. Server-Side Rendering (SSR) & Server Components

For pre-rendering translated HTML on the server or translating API responses before sending to the client, use renderToString from urdumagic/server:

tsx
import { renderToString } from 'urdumagic/server';

export default async function BlogPostPage({ params }: { params: { slug: string; lang?: string } }) {
  const { lang = 'ur' } = params;
  const post = await getBlogPost(params.slug);

  // Translates raw HTML on the server and applies dir="rtl"
  const translatedHtml = await renderToString(post.contentHtml, lang as 'ur' | 'roman' | 'en');

  return (
    <article className="prose max-w-2xl mx-auto p-6">
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: translatedHtml }} />
    </article>
  );
}

3. Static Params Generation (SSG)

You can generate localized static pages at build time:

ts
import { generateUrduParams } from 'urdumagic/next';

export async function generateStaticParams() {
  return generateUrduParams(); // Returns [{ lang: 'en' }, { lang: 'ur' }, { lang: 'roman' }]
}