سؤال

لدي موقع ويب ASP.Net يستخدم قاعدة بيانات MySQL للواجهة الخلفية.الموقع عبارة عن نظام تجارة إلكترونية باللغة الإنجليزية، ونتطلع إلى إمكانية ترجمته إلى حوالي خمس لغات أخرى (الفرنسية والإسبانية وغيرها).سوف نقوم بتعيين مترجمين بشريين للقيام بالترجمة - لقد بحثنا في الخدمات الآلية ولكنها ليست جيدة بما فيه الكفاية.

النص الثابت الموجود على الموقع (على سبيل المثال:يمكن بسهولة تقديم العناوين والأزرار وما إلى ذلك) بلغات متعددة عبر ميزات الترجمة المضمنة في .Net (ملفات resx وما إلى ذلك).

الشيء الذي لست متأكدًا منه هو أفضل السبل لتخزين واسترجاع المحتوى متعدد اللغات في قاعدة البيانات.على سبيل المثال، يوجد جدول منتجات يتضمن هذه الحقول...

  • معرف المنتج (كثافة العمليات)
  • معرف الفئة (كثافة العمليات)
  • العنوان (فارتشار)
  • ملخص (فارشار)
  • الوصف (النص)
  • الميزات (النص)

يجب أن يكون نص العنوان والملخص والوصف والميزات متاحًا بجميع اللغات المختلفة.

فيما يلي الخياران اللذان توصلت إليهما ...

إنشاء حقل إضافي لكل لغةعلى سبيل المثال، يمكن أن يكون لدينا titleEn وtitleFr وtitleEs وما إلى ذلك لجميع اللغات، ونكرر ذلك لجميع أعمدة النص.سنقوم بعد ذلك بتعديل الكود الخاص بنا لاستخدام الحقل المناسب اعتمادًا على اللغة المحددة.يبدو هذا أمرًا مبتذلاً بعض الشيء، وقد يؤدي أيضًا إلى ظهور بعض الطاولات الكبيرة جدًا.وأيضًا، إذا أردنا إضافة لغات إضافية في المستقبل، فسوف يستغرق الأمر وقتًا طويلاً لإضافة المزيد من الأعمدة.

استخدم جدول البحثيمكننا إنشاء جدول جديد بالتنسيق التالي...

textId | languageId | content
-------------------------------
10     | EN         | Car
10     | FR         | Voiture
10     | ES         | Coche
11     | EN         | Bike
11     | FR         | Vélo

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

سأكون ممتنًا جدًا لأية اقتراحات حول أفضل طريقة لتحقيق ذلك!هل هناك أي إرشادات "لأفضل الممارسات" هناك؟هل قام أحد بهذا من قبل؟

هل كانت مفيدة؟

المحلول

في حالتك، أوصي باستخدام جدولين:

Product
-------------------------------
ProductID  |  Price   |  Stock 
-------------------------------
10         |   10     |   15


ProductLoc
-----------------------------------------------
ProductID  | Lang   | Name      |  Description
-----------------------------------------------
 10        |  EN    | Bike      |  Excellent Bike 
 10        |  ES    | Bicicleta |  Excelente bici 

بهذه الطريقة يمكنك استخدام:

SELECT * FROM 
Product LEFT JOIN ProductLoc ON Product.ProductID = ProductLoc.ProductID 
                               AND ProductLoc.Lang = @CurrentLang

(الانضمام الأيسر فقط في حالة عدم وجود سجل للغة الحالية في جدول ProductLoc)

نصائح أخرى

ليست فكرة جيدة مجرد إضافة أعمدة جديدة إلى الجدول الموجود.سيكون من الصعب حقًا إضافة لغة جديدة في الميزة.يعد جدول البحث أفضل بكثير ولكن أعتقد أنه قد تواجه مشكلة في الأداء بسبب عدد السجلات المترجمة.

أعتقد أن الحل الأفضل هو الحصول على جدول مشترك:

products: id, categoryid, 

ونفس الجداول لكل لغة

products_en, products_de: product_id (fk), title, price, description, ...

ما عليك سوى الاختيار من الجدول المشترك والانضمام إلى الجدول بلغتك.الميزة هي أنه يمكنك تحديد السعر والفئة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top