الربط بين الصفحات المترجمة

الحفاظ على المستخدمين في اللغة التي اختاروها

المشكلة

عندما تكون رموز اللغة جزءًا من عنوان URL، يصبح إنشاء روابط داخلية أمرًا معقدًا. رابط بسيط مثل <a href="/about"> يكون خاطئًا، لأنه يكسر المسار المترجم، ويرسل المستخدم من /fr/contact إلى /about بدلاً من /fr/about. وهذا يخرج المستخدم من اللغة التي اختارها.

الحل

إنشاء مكون غلاف مخصص حول مكون Link الخاص بـ Next.js. سيستخدم هذا المكون الجديد خطاف useParams للحصول على اللغة الحالية من عنوان URL وإضافتها تلقائيًا في بداية أي href يستقبله، مما يضمن أن جميع الروابط الداخلية مترجمة بشكل صحيح.

الخطوات

قم بإنشاء ملف جديد app/components/LocalizedLink.tsx. يجب أن يكون هذا مكون عميل لاستخدام خطاف useParams.

// app/components/LocalizedLink.tsx
'use client';

import Link from 'next/link';
import { useParams } from 'next/navigation';
import type { ComponentProps } from 'react';

type LinkProps = ComponentProps<typeof Link>;

export default function LocalizedLink({ href, ...rest }: LinkProps) {
  const params = useParams();
  const lang = params.lang as string;

  let localizedHref = href;

  // Check if href is a string and needs prefixing
  if (typeof href === 'string' && href.startsWith('/')) {
    localizedHref = `/${lang}${href}`;
  } else if (
    typeof href === 'object' &&
    href !== null &&
    href.pathname?.startsWith('/')
  ) {
    // Re-create the object with a prefixed pathname
    localizedHref = {
      ...href,
      pathname: `/${lang}${href.pathname}`,
    };
  }
  // Absolute URLs or other cases are passed through

  return <Link href={localizedHref} {...rest} />;
}

يستورد هذا المكون خصائص Link القياسية. ويتحقق مما إذا كان href عبارة عن سلسلة نصية (مثل /about) أو كائن (مثل { pathname: '/about' }) ويضيف بذكاء lang الحالية (مثل es) في بدايتها.

2. استخدم المكون في صفحاتك

الآن، في صفحاتك، قم باستيراد LocalizedLink بدلاً من next/link القياسي. يمكنك استخدامه تمامًا كما تستخدم مكون Link العادي، ولكن دون القلق بشأن بادئة اللغة.

// app/[lang]/page.tsx
import LocalizedLink from '@/app/components/LocalizedLink';

export default function Home({ params }: { params: { lang: string } }) {
  return (
    <div>
      <h1>Home page</h1>
      <p>Current language: {params.lang}</p>
      
      <nav>
        <ul>
          <li>
            {/* This will render as /en/about or /es/about, etc. */}
            <LocalizedLink href="/about">About page</LocalizedLink>
          </li>
          <li>
            {/* This also works */}
            <LocalizedLink href={{ pathname: '/contact' }}>
              Contact page
            </LocalizedLink>
          </li>
        </ul>
      </nav>
    </div>
  );
}

استخدام <LocalizedLink href="/about"> الآن يعرض بشكل صحيح رابطًا إلى /{current_lang}/about، مما يبقي المستخدم ضمن اللغة المختارة أثناء تنقله في موقعك.