اذهب إلى المحتوى
  • 0

laravel localization

Hafsa Aly

السؤال

السلام عليكم

استعمل في التطبيق الترجمة ياستخدام laravel spatie translation

اذا كان لدي عمودين فقط في ال db  اخزن قيمتهم باستخدام json  اسم المنتج ووصف المنتج (لغة عربية  لغة اجنبية)

لاقي الاعمدة قيم لاتحتاج الى ترجمة  اولا كيف اقوم بتخزينهم في الdb  ومن ثم كيف اعرضهم في تطبيقي

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

ستحتاجين تعريف هاذين العمودين في خاصية translatable التي تستعملها السمة HasTranslations كالتالي:

public $translatable = ['name' ,'description'];

انتبهي الى أن هاته الأعمدة يجب ان تكون من نوع longText لتسع تخزين كائنات الجيسون داخلها.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لتخزين الأعمدة التي لا تحتاج إلى ترجمة ، يمكنك استخدام عمودين عاديين في جدول قاعدة البيانات الخاص بك. أما بالنسبة للأعمدة التي تحتاج إلى ترجمة (اسم المنتج ووصف المنتج)، فيمكنك استخدام تنسيق JSON لتخزين القيم باللغة العربية والإنجليزية.

لتخزين القيم في الجدول، يمكنك استخدام ميزة تحويل البيانات إلى JSON المتاحة في Laravel باستخدام الدالة json_encode() ، على سبيل المثال:

$product = new Product;
$product->name = '{
    "en": "English product name",
    "ar": "اسم المنتج باللغة العربية"
}';
$product->description = '{
    "en": "English product description",
    "ar": "وصف المنتج باللغة العربية"
}';
$product->save();

وعندما تقوم بإرجاع القيم من الجدول، يمكنك استخدام دالة json_decode() لتحويل القيم إلى صيغة مفهومة، على سبيل المثال:

$product = Product::find(1);
$name = json_decode($product->name, true);
$description = json_decode($product->description, true);
echo $name['en']; // English product name
echo $name['ar']; // اسم المنتج باللغة العربية
echo $description['en']; // English product description
echo $description['ar']; // وصف المنتج باللغة العربية

يمكنك استخدام حزمة Laravel Spatie Translation لإدارة الترجمة في تطبيقك، وهي تسمح لك بتخزين النصوص في جدول منفصل والوصول إليها بسهولة باستخدام واجهة API مميزة. 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

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

على سبيل المثال، يمكن إنشاء عمود "product_name" و "product_description" في الجدول الخاص بالمنتجات في قاعدة البيانات. يمكن تخزين النص المترجم لكل لغة باستخدام JSON على النحو التالي:

{
  "ar": "اسم المنتج",
  "en": "Product Name"
}

يمكن تحديد القيمة المخزنة باستخدام العنصر الفرعي "ar" للغة العربية والعنصر الفرعي "en" للغة الإنجليزية.

لعرض القيم في تطبيقك، يمكنك استخدام حزمة "spatie/laravel-translatable" في Laravel لترجمة النصوص بسهولة. يمكنك استخدام الوظيفة "translatable()" لتحديد الأعمدة التي تحتوي على النص المترجم واستخدام الدالة "translate()" للوصول إلى النص المترجم للغة المحددة. على سبيل المثال:

$product = Product::find(1);

// الحصول على اسم المنتج بلغة معينة
$productName = $product->translate('ar')->product_name;

يمكنك أيضًا استخدام الوظيفة "locale()" للتحقق من اللغة الحالية المستخدمة في التطبيق وعرض النص المترجم باللغة المناسبة تلقائيًا.

$product = Product::find(1);

// الحصول على اسم المنتج باللغة الحالية في التطبيق
$productName = $product->translate(app()->getLocale())->product_name;

يمكن استخدام هذا النهج لعرض الوصف المترجم للمنتجات أيضًا.

وسأشرح لك المزيد

وتخزين البيانات المتعلقة باللغات في قاعدة البيانات يمكن أن يكون تحديًا في تطبيقات الويب متعددة اللغات. إذا كان لديك عمودين فقط في جدول قاعدة البيانات واحد يتعلق بالاسم والآخر بالوصف، وتريد ترجمة قيمهما للغات المختلفة، فيمكن استخدام حزمة "spatie/laravel-translatable" في Laravel.

قبل البدء في الاستخدام، يجب تثبيت الحزمة باستخدام مدير الحزم composer، باستخدام الأمر التالي:

composer require spatie/laravel-translatable

يمكن تحويل العمود الذي يحتوي على الاسم والعمود الذي يحتوي على الوصف إلى حقول قابلة للترجمة باستخدام خاصية "translatable" من الحزمة، على النحو التالي:

use Spatie\Translatable\HasTranslations;

class Product extends Model
{
    use HasTranslations;

    public $translatable = ['product_name', 'product_description'];

    // ...
}

تم تحويل العمودين "product_name" و "product_description" إلى حقول قابلة للترجمة باستخدام الخاصية "translatable".

بعد ذلك، يمكن إدخال البيانات المتعلقة بالترجمة في قاعدة البيانات باستخدام تنسيق JSON المعتمد من Laravel، كما أوضحته في إجابتي السابقة. يمكن الوصول إلى قيمة الحقل المترجم باستخدام الدالة "translate()"، على النحو التالي:

$product = Product::find(1);

// الحصول على اسم المنتج بلغة معينة
$productName = $product->translate('ar')->product_name;

// الحصول على وصف المنتج بلغة معينة
$productDescription = $product->translate('ar')->product_description;

إذا كنت تريد عرض النص المترجم للغة المحددة في تطبيقك، يمكن استخدام الدالة "locale()" للتحقق من اللغة الحالية للمستخدم وعرض النص المترجم باللغة المناسبة، على النحو التالي:

$product = Product::find(1);

//
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 19 ساعة قال Mustafa Suleiman:

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

على سبيل المثال، يمكن إنشاء عمود "product_name" و "product_description" في الجدول الخاص بالمنتجات في قاعدة البيانات. يمكن تخزين النص المترجم لكل لغة باستخدام JSON على النحو التالي:

{
  "ar": "اسم المنتج",
  "en": "Product Name"
}

يمكن تحديد القيمة المخزنة باستخدام العنصر الفرعي "ar" للغة العربية والعنصر الفرعي "en" للغة الإنجليزية.

لعرض القيم في تطبيقك، يمكنك استخدام حزمة "spatie/laravel-translatable" في Laravel لترجمة النصوص بسهولة. يمكنك استخدام الوظيفة "translatable()" لتحديد الأعمدة التي تحتوي على النص المترجم واستخدام الدالة "translate()" للوصول إلى النص المترجم للغة المحددة. على سبيل المثال:

$product = Product::find(1);

// الحصول على اسم المنتج بلغة معينة
$productName = $product->translate('ar')->product_name;

يمكنك أيضًا استخدام الوظيفة "locale()" للتحقق من اللغة الحالية المستخدمة في التطبيق وعرض النص المترجم باللغة المناسبة تلقائيًا.

$product = Product::find(1);

// الحصول على اسم المنتج باللغة الحالية في التطبيق
$productName = $product->translate(app()->getLocale())->product_name;

يمكن استخدام هذا النهج لعرض الوصف المترجم للمنتجات أيضًا.

وسأشرح لك المزيد

وتخزين البيانات المتعلقة باللغات في قاعدة البيانات يمكن أن يكون تحديًا في تطبيقات الويب متعددة اللغات. إذا كان لديك عمودين فقط في جدول قاعدة البيانات واحد يتعلق بالاسم والآخر بالوصف، وتريد ترجمة قيمهما للغات المختلفة، فيمكن استخدام حزمة "spatie/laravel-translatable" في Laravel.

قبل البدء في الاستخدام، يجب تثبيت الحزمة باستخدام مدير الحزم composer، باستخدام الأمر التالي:

composer require spatie/laravel-translatable

يمكن تحويل العمود الذي يحتوي على الاسم والعمود الذي يحتوي على الوصف إلى حقول قابلة للترجمة باستخدام خاصية "translatable" من الحزمة، على النحو التالي:

use Spatie\Translatable\HasTranslations;

class Product extends Model
{
    use HasTranslations;

    public $translatable = ['product_name', 'product_description'];

    // ...
}

تم تحويل العمودين "product_name" و "product_description" إلى حقول قابلة للترجمة باستخدام الخاصية "translatable".

بعد ذلك، يمكن إدخال البيانات المتعلقة بالترجمة في قاعدة البيانات باستخدام تنسيق JSON المعتمد من Laravel، كما أوضحته في إجابتي السابقة. يمكن الوصول إلى قيمة الحقل المترجم باستخدام الدالة "translate()"، على النحو التالي:

$product = Product::find(1);

// الحصول على اسم المنتج بلغة معينة
$productName = $product->translate('ar')->product_name;

// الحصول على وصف المنتج بلغة معينة
$productDescription = $product->translate('ar')->product_description;

إذا كنت تريد عرض النص المترجم للغة المحددة في تطبيقك، يمكن استخدام الدالة "locale()" للتحقق من اللغة الحالية للمستخدم وعرض النص المترجم باللغة المناسبة، على النحو التالي:

$product = Product::find(1);

//

اكثر من رائع شكرا لك ولكن يبقى لي كيفية عمل  store  لل request  القادم اليا من  create product   للمنتج المترجم والغير مترجم

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 5‏/3‏/2023 at 10:14 قال Hafsa Aly:

اكثر من رائع شكرا لك ولكن يبقى لي كيفية عمل  store  لل request  القادم اليا من  create product   للمنتج المترجم والغير مترجم

ارجو الرد

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 5‏/3‏/2023 at 10:14 قال Hafsa Aly:

اكثر من رائع شكرا لك ولكن يبقى لي كيفية عمل  store  لل request  القادم اليا من  create product   للمنتج المترجم والغير مترجم

يمكنك تنفيز المطلوب باتباع الخطوات التالية:

قم بإنشاء ملف الترجمة لكل لغة تريد دعمها في مجلد اللغات الخاص بالتطبيق، على سبيل المثال:

resources/lang/en/products.php
resources/lang/ar/products.php

يجب أن يحتوي كل ملف لغة على مفاتيح الترجمة وقيمها المقابلة.

قم بإنشاء ملف اللغة الافتراضية في config/app.php، مثل:

'locale' => 'en',

قم بتثبيت حزمة laravel-translatable لإضافة دعم الترجمة لنموذج المنتج Product.

انشئ مودل Product واستخدم السمة Translatable المقدمة من laravel-translatable لإضافة الحقول المترجمة:

use Spatie\Translatable\HasTranslations;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasTranslations;

    public $translatable = ['name', 'description'];

    protected $fillable = ['name', 'description'];
}

في ملف الـ ProductController، قم بتحقق من صحة البيانات التي تم إرسالها من قبل المستخدم باستخدام الطريقة validate المدمجة في Laravel:

public function store(Request $request)
{
    $validatedData = $request->validate([
        'name' => 'required',
        'description' => 'required',
    ]);

    $product = Product::create($validatedData);

    return redirect()->route('products.index');
}

يمكنك إضافة حقول اللغة في النموذج الخاص بـ create باستخدام دالة translatable المتاحة في laravel-translatable:

<form method="POST" action="{{ route('products.store') }}">
    @csrf
    <label for="name">Name</label>
    <input type="text" name="name" id="name" value="{{ old('name') }}" required>

    @foreach(config('translatable.locales') as $locale)
        <label for="name_{{ $locale }}">Name ({{ strtoupper($locale) }})</label>
        <input type="text" name="name_{{ $locale }}" id="name_{{ $locale }}" value="{{ old('name_'.$locale) }}">
    @endforeach

    <label for="description">Description</label>
    <textarea name="description" id="description" required>{{ old('description') }}</textarea>

    @foreach(config('translatable.locales') as $locale)
        <label for="description_{{ $
locale }}">Description ({{ strtoupper($locale) }})</label>
<textarea name="description_{{ $locale }}" id="description_{{ $locale }}">{{ old('description_'.$locale) }}</textarea>
@endforeach

   <button type="submit">Create</button>
   </form>
   ```

هذا الشكل سيظهر حقول اللغة التي تم تعريفها في نموذج Product، وسيتم حفظ القيم المدخلة لهذه الحقول في جدول اللغات المترجمة product_translations.

لاستخراج القيم المترجمة لـ Product في الصفحات الأخرى، يمكنك استخدام دالة getTranslation المتاحة في laravel-translatable، مثل:

{{ $product->getTranslation('name', 'en') }}

هذا الشكل سيسترجع اسم المنتج المترجم باللغة الإنجليزية.

يمكنك استخدام الدالة trans المدمجة في Laravel لترجمة النصوص في الصفحات، مثل:

{{ __('products.name') }}

هذا الشكل سيسترجع النص المترجم لـ "Name" الموجود في ملف الترجمة.

في حالة إرسال النموذج، يجب تخزين القيم المدخلة في جدول اللغات المترجمة product_translations. يمكنك القيام بذلك باستخدام دالة setTranslation المتاحة في laravel-translatable، مثل:

$product->setTranslation('name', 'en', $request->input('name_en'));
$product->setTranslation('name', 'ar', $request->input('name_ar'));
$product->setTranslation('description', 'en', $request->input('description_en'));
$product->setTranslation('description', 'ar', $request->input('description_ar'));
$product->save();

هذا الشكل يضيف القيم المدخلة لحقول اللغة المختلفة في جدول product_translations الخاص بـ Product.

يمكنك عرض جميع المنتجات الموجودة في النظام مع قيمها المترجمة باستخدام الدالة translated المتاحة في laravel-translatable، مثل:

@foreach($products as $product)
    <h2>{{ $product->translated('name') }}</h2>
    <p>{{ $product->translated('description') }}</p>
@endforeach

هذا الشكل سيعرض جميع المنتجات الموجودة في النظام مع اسم المنتج ووصفه المترجم.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...