كيفية عرض معلومات العملة في Next.js (Pages Router) الإصدار 16

عرض رموز العملات وأسمائها ورموزها

المشكلة

غالبًا ما تحتاج التطبيقات إلى عرض معلومات العملة دون إظهار سعر فعلي. قد يسرد محدد العملة العملات المتاحة، أو قد تشير الوثائق إلى أسعار الصرف، أو قد يعرض نموذج الدفع العملات المقبولة. مجرد عرض "USD" يكون غامضًا للمستخدمين غير التقنيين، بينما يتطلب ترميز "الدولار الأمريكي" بشكل ثابت ترجمة وصيانة يدوية. رموز العملات مثل "$" غامضة - حيث يمثل نفس الرمز الدولار الأمريكي والكندي والأسترالي. يعتمد التمثيل المناسب على كل من السياق ولغة المستخدم.

الحل

استخدم إمكانيات التنسيق في react-intl لعرض معلومات العملة بالتنسيق الذي يتطابق مع سياقك. للحصول على أسماء العملات الكاملة، استخدم formatDisplayName مع نوع العملة، والذي يقوم تلقائيًا بتوطين أسماء مثل "الدولار الأمريكي" إلى لغة المستخدم. للحصول على الرموز، استخدم Intl.NumberFormat مع formatToParts لاستخراج الرمز المحلي لرمز عملة معين. لرموز ISO، اعرض الرمز مباشرة. يضمن هذا النهج أن تكون مراجع العملة واضحة ومحلية بشكل صحيح دون عمل ترجمة يدوي.

الخطوات

1. إنشاء دالة مساعدة لاستخراج رموز العملات

استخدم Intl.NumberFormat مع formatToParts لاستخراج رمز العملة من رقم منسق.

export function getCurrencySymbol(
  currencyCode: string,
  locale: string,
): string {
  const parts = new Intl.NumberFormat(locale, {
    style: "currency",
    currency: currencyCode,
    currencyDisplay: "narrowSymbol",
  }).formatToParts(0);

  const currencyPart = parts.find((part) => part.type === "currency");
  return currencyPart ? currencyPart.value : currencyCode;
}

يتحكم خيار currencyDisplay في الشكل: "symbol" أو "narrowSymbol" أو "code" أو "name". تُرجع هذه الدالة المساعدة الرمز المحلي لأي رمز عملة.

2. إنشاء مكون لعرض العملة

قم ببناء مكون يعرض معلومات العملة بتنسيقات مختلفة بناءً على وضع العرض.

import { useIntl } from "react-intl";
import { useRouter } from "next/router";
import { getCurrencySymbol } from "../utils/getCurrencySymbol";

interface CurrencyDisplayProps {
  currencyCode: string;
  display: "symbol" | "name" | "code";
}

export default function CurrencyDisplay({
  currencyCode,
  display,
}: CurrencyDisplayProps) {
  const intl = useIntl();
  const router = useRouter();
  const locale = router.locale || "en";

  if (display === "symbol") {
    const symbol = getCurrencySymbol(currencyCode, locale);
    return <span>{symbol}</span>;
  }

  if (display === "name") {
    const name = intl.formatDisplayName(currencyCode, { type: "currency" });
    return <span>{name}</span>;
  }

  return <span>{currencyCode}</span>;
}

تُرجع الطريقة formatDisplayName مع type: 'currency' اسم العملة المترجم. يُكيّف المكون مخرجاته بناءً على خاصية العرض.

3. استخدم المكون في سياقات مختلفة

طبّق مكون عرض العملة حيثما تحتاج إلى إظهار معلومات العملة بدون الأسعار.

import CurrencyDisplay from "../components/CurrencyDisplay";

export default function PaymentOptions() {
  const acceptedCurrencies = ["USD", "EUR", "GBP", "JPY"];

  return (
    <div>
      <h2>Accepted Currencies</h2>
      <ul>
        {acceptedCurrencies.map((code) => (
          <li key={code}>
            <CurrencyDisplay currencyCode={code} display="name" />
            {" ("}
            <CurrencyDisplay currencyCode={code} display="symbol" />
            {")"}
          </li>
        ))}
      </ul>
    </div>
  );
}

يعرض هذا أسماء العملات المترجمة مع رموزها، مثل "الدولار الأمريكي ($)" بالإنجليزية أو "Dollar américain ($)" بالفرنسية، مع التكيف تلقائياً مع لغة المستخدم.