merge from master

This commit is contained in:
merdiano 2021-12-28 07:58:20 +05:00
parent 4eb0456e7c
commit cd690289dd
24 changed files with 691 additions and 0 deletions

View File

@ -0,0 +1,30 @@
<?php
namespace Webkul\Core\Contracts\Validations;
use Illuminate\Contracts\Validation\Rule;
class AlphaNumericSpace implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('/^[a-zA-Z0-9\s]+$/', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return trans('core::validation.alpha-numeric-space');
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Webkul\Core\Contracts\Validations;
use Illuminate\Contracts\Validation\Rule;
class PhoneNumber implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('%^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$%i', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return trans('core::validation.phone-number');
}
}

View File

@ -0,0 +1,9 @@
<?php
return [
'alpha-numeric-space' => 'The :attribute can only accept alpha, numeric and spaces.',
'code' => 'The :attribute must be valid.',
'decimal' => 'The :attribute must be valid.',
'phone-number' => 'The :attribute must be valid phone number.',
'slug' => 'The :attribute must be valid slug.',
];

View File

@ -0,0 +1,8 @@
<?php
return [
'path-hint' => [
'template' => 'Template',
'parents' => 'Parents'
]
];

View File

@ -0,0 +1,8 @@
<?php
return [
'path-hint' => [
'template' => 'Template',
'parents' => 'Parents'
]
];

View File

@ -0,0 +1,8 @@
<?php
return [
'path-hint' => [
'template' => 'Template',
'parents' => 'Parents'
]
];

View File

@ -0,0 +1,43 @@
<?php
namespace Webkul\Customer\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Webkul\Core\Contracts\Validations\AlphaNumericSpace;
use Webkul\Core\Contracts\Validations\PhoneNumber;
use Webkul\Customer\Rules\VatIdRule;
class CustomerAddressRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'company_name' => [new AlphaNumericSpace],
'first_name' => ['required', new AlphaNumericSpace],
'last_name' => ['required', new AlphaNumericSpace],
'address1' => ['required', 'array'],
'address1.*' => ['required', new AlphaNumericSpace],
'country' => ['required', 'alpha'],
'state' => ['required', 'alpha'],
'city' => ['required'],
'postcode' => ['required', 'numeric'],
'phone' => ['required', new PhoneNumber],
'vat_id' => [new VatIdRule()],
];
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace Webkul\Customer\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Webkul\Core\Contracts\Validations\AlphaNumericSpace;
class CustomerProfileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$id = auth()->guard('customer')->user()->id;
return [
'first_name' => ['required', new AlphaNumericSpace],
'last_name' => ['required', new AlphaNumericSpace],
'gender' => 'required|in:Other,Male,Female',
'date_of_birth' => 'date|before:today',
'email' => 'email|unique:customers,email,' . $id,
'password' => 'confirmed|min:6|required_with:oldpassword',
'oldpassword' => 'required_with:password',
'password_confirmation' => 'required_with:password',
'image.*' => 'mimes:bmp,jpeg,jpg,png,webp',
'phone' => 'numeric',
];
}
}

View File

@ -0,0 +1,65 @@
<div class="account-item-card mt-15 mb-15">
<div class="media-info">
@php
$image = $item->product->getTypeInstance()->getBaseImage($item);
@endphp
<img class="media" src="{{ $image['small_image_url'] }}" alt="" />
<div class="info">
<div class="product-name">
{{ $item->product->name }}
@if (isset($item->additional['attributes']))
<div class="item-options">
@foreach ($item->additional['attributes'] as $attribute)
<b>{{ $attribute['attribute_name'] }} : </b> {{ $attribute['option_label'] }}
</br>
@endforeach
</div>
@endif
</div>
@if ($visibility ?? false)
<div class="mb-2">
<span class="fs16">
{{ __('shop::app.customer.account.wishlist.visibility') }} :
<span class="badge badge-sm {{ $item->shared ? 'badge-success' : 'badge-danger' }}">
{{ $item->shared ? __('shop::app.customer.account.wishlist.public') : __('shop::app.customer.account.wishlist.private') }}
</span>
</span>
</div>
@endif
<span class="stars" style="display: inline">
@for ($i = 1; $i <= $reviewHelper->getAverageRating($item->product); $i++)
<span class="icon star-icon"></span>
@endfor
</span>
</div>
</div>
<div class="operations">
<form id="wishlist-{{ $item->id }}" action="{{ route('customer.wishlist.remove', $item->id) }}" method="POST">
@method('DELETE')
@csrf
</form>
@auth('customer')
<a
class="mb-50"
href="javascript:void(0);"
onclick="document.getElementById('wishlist-{{ $item->id }}').submit();">
<span class="icon trash-icon"></span>
</a>
@endauth
<a href="{{ route('customer.wishlist.move', $item->id) }}" class="btn btn-primary btn-md">
{{ __('shop::app.customer.account.wishlist.move-to-cart') }}
</a>
</div>
</div>
<div class="horizontal-rule mb-10 mt-10"></div>

View File

@ -0,0 +1,23 @@
@extends('shop::layouts.master')
@section('page_title')
{{ __('shop::app.customer.account.wishlist.customer-name', ['name' => $customer->name]) }}
@endsection
@section('content-wrapper')
@inject ('reviewHelper', 'Webkul\Product\Helpers\Review')
<div class="account-layout">
<div class="account-head mb-15">
<span class="account-heading">{{ __('shop::app.customer.account.wishlist.customer-name', ['name' => $customer->name]) }}</span>
<div class="horizontal-rule"></div>
</div>
<div class="account-items-list">
@foreach ($items as $item)
@include('shop::customers.account.wishlist.wishlist-product', ['item' => $item])
@endforeach
</div>
</div>
@endsection

View File

@ -0,0 +1,6 @@
<?php
return [
'enter-attribute' => 'Enter :attribute',
'select-attribute' => 'Select :attribute',
];

View File

@ -0,0 +1,6 @@
<?php
return [
'enter-attribute' => 'Enter :attribute',
'select-attribute' => 'Select :attribute',
];

View File

@ -0,0 +1,6 @@
<?php
return [
'enter-attribute' => 'Enter :attribute',
'select-attribute' => 'Select :attribute',
];

View File

@ -0,0 +1,6 @@
<?php
return [
'enter-attribute' => 'Enter :attribute',
'select-attribute' => 'Select :attribute',
];

View File

@ -0,0 +1,6 @@
<?php
return [
'enter-attribute' => 'Enter :attribute',
'select-attribute' => 'Select :attribute',
];

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,65 @@
/*!
* Bootstrap v3.4.1 (https://getbootstrap.com/)
* Copyright 2011-2019 Twitter, Inc.
* Licensed under the MIT license
*/
/*!
* Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2021-02-16
*/
/*!
* Vue.js v2.6.14
* (c) 2014-2021 Evan You
* Released under the MIT License.
*/
/*!
* accounting.js v0.4.1
* Copyright 2014 Open Exchange Rates
*
* Freely distributable under the MIT license.
* Portions of accounting.js are inspired or borrowed from underscore.js
*
* Full details and documentation:
* http://openexchangerates.github.io/accounting.js/
*/
/*!
* jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2021-03-02T17:08Z
*/
/*!
* vue-carousel v0.18.0-alpha
* (c) 2019 todd.beauchamp@ssense.com
* https://github.com/ssense/vue-carousel#readme
*/
/**
* vee-validate v2.2.15
* (c) 2019 Abdelrahman Awad
* @license MIT
*/
/**
* vue-class-component v7.0.1
* (c) 2015-present Evan You
* @license MIT
*/

View File

@ -0,0 +1 @@
(()=>{"use strict";var e,r,t,o={},n={};function i(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={id:e,exports:{}};return o[e].call(t.exports,t,t.exports,i),t.exports}i.m=o,e=[],i.O=(r,t,o,n)=>{if(!t){var f=1/0;for(c=0;c<e.length;c++){for(var[t,o,n]=e[c],l=!0,u=0;u<t.length;u++)(!1&n||f>=n)&&Object.keys(i.O).every((e=>i.O[e](t[u])))?t.splice(u--,1):(l=!1,n<f&&(f=n));if(l){e.splice(c--,1);var a=o();void 0!==a&&(r=a)}}return r}n=n||0;for(var c=e.length;c>0&&e[c-1][2]>n;c--)e[c]=e[c-1];e[c]=[t,o,n]},i.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return i.d(r,{a:r}),r},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var n=Object.create(null);i.r(n);var f={};r=r||[null,t({}),t([]),t(t)];for(var l=2&o&&e;"object"==typeof l&&!~r.indexOf(l);l=t(l))Object.getOwnPropertyNames(l).forEach((r=>f[r]=()=>e[r]));return f.default=()=>e,i.d(n,f),n},i.d=(e,r)=>{for(var t in r)i.o(r,t)&&!i.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},i.e=()=>Promise.resolve(),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={929:0,166:0,362:0};i.O.j=r=>0===e[r];var r=(r,t)=>{var o,n,[f,l,u]=t,a=0;if(f.some((r=>0!==e[r]))){for(o in l)i.o(l,o)&&(i.m[o]=l[o]);if(u)var c=u(i)}for(r&&r(t);a<f.length;a++)n=f[a],i.o(e,n)&&e[n]&&e[n][0](),e[f[a]]=0;return i.O(c)},t=self.webpackChunk=self.webpackChunk||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})();

View File

@ -0,0 +1,65 @@
<div class="col-12 lg-card-container list-card product-card row">
<div class="product-image">
<a
title="{{ $item->product->name }}"
href="{{ route('shop.productOrCategory.index', $item->product->url_key) }}">
<img
src="{{ productimage()->getProductBaseImage($item->product)['medium_image_url'] }}"
:onerror="`this.src='${this.$root.baseUrl}/vendor/webkul/ui/assets/images/product/large-product-placeholder.png'`" alt="" />
<div class="quick-view-in-list">
</div>
</a>
</div>
<div class="product-information">
<div class="p-2">
<div class="product-name">
<a
href="{{ route('shop.productOrCategory.index', $item->product->url_key) }}"
title="{{ $item->product->name }}" class="unset">
<span class="fs16">{{ $item->product->name }}</span>
</a>
@if (isset($item->product->additional['attributes']))
<div class="item-options">
@foreach ($item->product->additional['attributes'] as $attribute)
<b>{{ $attribute['attribute_name'] }} : </b> {{ $attribute['option_label'] }}
</br>
@endforeach
</div>
@endif
</div>
<div class="product-price">
@include ('shop::products.price', ['product' => $item->product])
</div>
<div class="cart-wish-wrap mt5">
@if ($visibility ?? false)
<div class="mb-2">
<span class="fs16">
{{ __('shop::app.customer.account.wishlist.visibility') }} :
<span class="badge {{ $item->shared ? 'badge-success' : 'badge-danger' }}">
{{ $item->shared ? __('shop::app.customer.account.wishlist.public') : __('shop::app.customer.account.wishlist.private') }}
</span>
</span>
</div>
@endif
<div>
@include('shop::products.add-to-cart', [
'reloadPage' => true,
'addWishlistClass' => 'pl10',
'product' => $item->product,
'addToCartBtnClass' => 'medium-padding',
'showCompare' => core()->getConfigData('general.content.shop.compare_option') == "1" ? true : false,
])
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,23 @@
@extends('shop::layouts.master')
@section('page_title')
{{ __('shop::app.customer.account.wishlist.customer-name', ['name' => $customer->name]) }}
@endsection
@section('content-wrapper')
<div class="container p-5">
<div class="row">
<div class="col-12">
<div class="wishlist-container">
<h2 class="text-center">
{{ __('shop::app.customer.account.wishlist.customer-name', ['name' => $customer->name]) }}
</h2>
@foreach ($items as $item)
@include('shop::customers.account.wishlist.wishlist-product', ['item' => $item])
@endforeach
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'ليس هناك حساب مسجل بهذه البيانات!',
'throttle' => 'تم محاولة تسجيل الدخول عدة مرات! الرجاء المحاولة مرة أخرى خلاي :seconds ثواني.',
];

View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; السابق',
'next' => 'التالي &raquo;',
];

View File

@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'يجب أن تتكون كلمة المرور من ستة أحرف على الأقل وأن تتطابق مع حقل تأكيدها!',
'reset' => 'تم أعادة تعيين كلمة المرور!',
'sent' => 'تم ارسال بريد الكتروني اليك به رابط إعادة تعيين كلمة المرور!',
'token' => 'كود إعادة تعيين كلمة المرور هذا غير صالح!',
'user' => "لم نجد مستخدم مسجل لدينا بهذا البريد الألكتروني!",
];

View File

@ -0,0 +1,179 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'يجب أن تقوم بقبول :attribute.',
'active_url' => ':attribute ليس رابط صالح.',
'after' => ':attribute يجب أن يكون بعد :date.',
'after_or_equal' => ':attribute يجب أن تكون مساوية أو بعد تاريخ :date.',
'alpha' => ':attribute لا يجوز أن تحتوي إلا على حروف.',
'alpha_dash' => ':attribute لا يجوز أن تحتوي إلا على حروف وأرقام وشرطات وشرطات سفلية.',
'alpha_num' => ':attribute لا يجوز أن تحتوي إلا على أحرف وأرقام.',
'array' => ':attribute يجب أن تكون مصفوفة/قائمة.',
'before' => ':attribute يجب أن يكون قبل :date.',
'before_or_equal' => ':attribute يجب أن تكون مساوية أو قبل تاريخ :date.',
'between' => [
'numeric' => ':attribute يجب أن يكون من :min إلى :max.',
'file' => ':attribute يجب أن يكون من :min إلى :max كيلو بايت.',
'string' => ':attribute يجب أن يكون من :min إلى :max حرف.',
'array' => ':attribute يجب أن يكون من :min إلى :max عنصر.',
],
'boolean' => ':attribute يجب أن تكون true أو false.',
'confirmed' => 'تأكيد :attribute لا يتطابق.',
'date' => ':attribute ليس تاريخ صالح.',
'date_format' => ':attribute لا يطابق الفورمات/الترتيب :format',
'different' => ':attribute و :other يجب أن يكونوا مختلفين.',
'digits' => ':attribute يجب أن يكون :digits أرقام.',
'digits_between' => ':attribute يجب أن يكون رقم من :min إلى :max.',
'dimensions' => ':attribute ليس لديها أبعاد صورة صحيحة.',
'distinct' => ':attribute يحتوي على قيمة مكررة.',
'email' => ':attribute يجب أن يكون بريد إلكتروني صالح.',
'exists' => ':attribute المختار هذا غير صالح.',
'file' => ':attribute يجب أن يكون ملف.',
'filled' => ':attribute يجب أن يحتوي على قيمة.',
'gt' => [
'numeric' => ':attribute يجب أن يكون أكبر من :value.',
'file' => ':attribute يجب أن يكون أكبر من :value كيلو بايت.',
'string' => ':attribute يجب أن يكون أكبر من :value حروف.',
'array' => ':attribute يجب أن يكون لديه أكبر من :value عناصر.',
],
'gte' => [
'numeric' => ':attribute يجب أن يكون أكبر من أو يساوي :value.',
'file' => ':attribute يجب أن يكون أكبر من أو يساوي :value كيلو بايت.',
'string' => ':attribute يجب أن يكون أكبر من أو يساوي :value حروف.',
'array' => ':attribute يجب أن يكون لدية :value عناصر أو أكثر.',
],
'image' => ':attribute يجب أن تكون صورة.',
'in' => ':attribute المحدد هذا غير صالح.',
'in_array' => 'حقل :attribute ليس موجود في :other.',
'integer' => ':attribute يجب أن يكون رقم صحيح.',
'ip' => ':attribute يجب أن يكون عنوان IP صالح.',
'ipv4' => ':attribute يجب أن يكون عنوان IPv4 صالح.',
'ipv6' => ':attribute يجب أن يكون عنوان IPv6 صالح.',
'json' => ':attribute يجب أن يكون نص JSON صالح.',
'lt' => [
'numeric' => ':attribute يجب أن يكون أقل من :value.',
'file' => ':attribute يجب أن يكون أقل من :value كيلو بايت.',
'string' => ':attribute يجب أن يكون أقل من :value حروف.',
'array' => ':attribute يجب أن يكون لديه أقل من :value عناصر.',
],
'lte' => [
'numeric' => ':attribute يجب أن يكون أقل من أو يساوي :value.',
'file' => ':attribute يجب أن يكون أقل من أو يساوي :value كيلو بايت.',
'string' => ':attribute يجب أن يكون أقل من أو يساوي :value حروف.',
'array' => ':attribute يجب أن يكون لدية :value عناصر أو أقل.',
],
'max' => [
'numeric' => ':attribute يجب أن لا تكون أكبر من :max.',
'file' => ':attribute يجب أن لا تكون أكبر من :max كيلو بايت.',
'string' => ':attribute يجب أن لا تكون أكبر من :max حرووف.',
'array' => ':attribute يجب أن لا تحتوى على أكبر من :max عنصر.',
],
'mimes' => ':attribute يجب أن يكون ملف بواحد من هذه الأمتدادات :values.',
'mimetypes' => ':attribute يجب أن يكون ملف بواحد من هذه الأمتدادات :values.',
'min' => [
'numeric' => ':attribute يجب أن يكون علي الأقل :min.',
'file' => ':attribute يجب أن يكون علي الأقل :min كيلو بايت.',
'string' => ':attribute يجب أن يكون علي الأقل :min حروف.',
'array' => ':attribute يجب أن يكون علي الأقل :min عنصر.',
],
'not_in' => ':attribute المختارة غير صالحة.',
'not_regex' => 'تنسيق :attribute هذا غير صالح.',
'numeric' => ':attribute يجب أن يكون رقم.',
'present' => 'حقل :attribute مطلوب.',
'regex' => 'تنسيق :attribute هذا غير صالح.',
'required' => 'حقل :attribute مطلوب.',
'required_if' => 'حقل :attribute مطلوب عندما تكون قيمة :other هي :value.',
'required_unless' => 'حقل :attribute مطلوب ما لم يكن :other في :values.',
'required_with' => 'حقل :attribute مطلوب في وجود :values.',
'required_with_all' => 'حقل :attribute مطلوب في وجود :values.',
'required_without' => 'حقل :attribute مطلوب في عدم وجود :values.',
'required_without_all' => 'حقل :attribute مطلوب عند عدم وجود أياً من :values.',
'same' => ':attribute و :other يجب أن يكونوا متساويين.',
'size' => [
'numeric' => ':attribute يجب أن يكون :size.',
'file' => ':attribute يجب أن يكون :size كيلو بايت.',
'string' => ':attribute يجب أن يكون :size حروف.',
'array' => ':attribute يجب أن تحتوي على :size عنصر.',
],
'string' => ':attribute يجب أن يكون نص.',
'timezone' => ':attribute يجب أن تكون منطقة صالحة.',
'unique' => ':attribute مسجل مسبقاً.',
'uploaded' => 'فشلت عملية رفع :attribute.',
'url' => 'تنسيق :attribute غير صالح.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [
'name' => 'الأسم',
'username' => 'اسم المستخدم',
'email' => 'البريد الألكتروني',
'first_name' => 'الأسم الأول',
'last_name' => 'الأسم الأخير',
'password' => 'كلمة المرور',
'password_confirmation' => 'تكرار كلمة المرور',
'city' => 'المدينة',
'country' => 'الدولة',
'address' => 'العنوان',
'phone' => 'رقم الهاتف',
'mobile' => 'رقم الهاتف النقال',
'age' => 'السن',
'sex' => 'الجنس',
'gender' => 'النوع',
'day' => 'اليوم',
'month' => 'الشهر',
'year' => 'السنة',
'hour' => 'الساعة',
'minute' => 'الدقيقة',
'second' => 'الثانية',
'title' => 'العنوان',
'text' => 'النص',
'content' => 'المحتوى',
'description' => 'الوصف',
'excerpt' => 'المقتطفات',
'date' => 'التاريخ',
'time' => 'الوقت',
'available' => 'موجود',
'size' => 'الحجم',
'terms' => 'المصطلحات',
'province' => 'المحافظة',
],
];