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

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

المشكلة

عندما تكون رموز اللغة جزءًا من عنوان 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، مما يحافظ على بقاء المستخدم ضمن اللغة المختارة أثناء التنقل في موقعك.