diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc
index e6a472d..ba0c67c 100644
Binary files a/core/__pycache__/forms.cpython-311.pyc and b/core/__pycache__/forms.cpython-311.pyc differ
diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc
index 20493b5..c173f30 100644
Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ
diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc
index e6c2226..1c7d029 100644
Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ
diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc
index fdf6df4..b0fc129 100644
Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ
diff --git a/core/forms.py b/core/forms.py
index dfaccd8..a54caaa 100644
--- a/core/forms.py
+++ b/core/forms.py
@@ -2,7 +2,7 @@ from django import forms
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from django.utils.translation import get_language
-from .models import Profile, Parcel, Country, Governate, City
+from .models import Profile, Parcel, Country, Governate, City, DriverRating
class ContactForm(forms.Form):
name = forms.CharField(max_length=100, label=_("Name"), widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('Your Name')}))
@@ -321,4 +321,17 @@ class ParcelForm(forms.ModelForm):
if phone_code and phone_number:
if not phone_number.startswith(phone_code.phone_code):
cleaned_data['receiver_phone'] = f"{phone_code.phone_code}{phone_number}"
- return cleaned_data
\ No newline at end of file
+ return cleaned_data
+
+class DriverRatingForm(forms.ModelForm):
+ class Meta:
+ model = DriverRating
+ fields = ['rating', 'comment']
+ widgets = {
+ 'rating': forms.RadioSelect(attrs={'class': 'rating-stars'}),
+ 'comment': forms.Textarea(attrs={'class': 'form-control', 'rows': 4, 'placeholder': _('Write your review here...')}),
+ }
+ labels = {
+ 'rating': _('Rating'),
+ 'comment': _('Comment'),
+ }
diff --git a/core/migrations/0017_driverrating.py b/core/migrations/0017_driverrating.py
new file mode 100644
index 0000000..f719279
--- /dev/null
+++ b/core/migrations/0017_driverrating.py
@@ -0,0 +1,32 @@
+# Generated by Django 5.2.7 on 2026-01-26 04:58
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0016_country_phone_code'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='DriverRating',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('rating', models.PositiveSmallIntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')], verbose_name='Rating')),
+ ('comment', models.TextField(blank=True, verbose_name='Comment')),
+ ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
+ ('driver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_ratings', to=settings.AUTH_USER_MODEL, verbose_name='Driver')),
+ ('parcel', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rating', to='core.parcel', verbose_name='Parcel')),
+ ('shipper', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='given_ratings', to=settings.AUTH_USER_MODEL, verbose_name='Shipper')),
+ ],
+ options={
+ 'verbose_name': 'Driver Rating',
+ 'verbose_name_plural': 'Driver Ratings',
+ },
+ ),
+ ]
diff --git a/core/migrations/__pycache__/0017_driverrating.cpython-311.pyc b/core/migrations/__pycache__/0017_driverrating.cpython-311.pyc
new file mode 100644
index 0000000..61f33fd
Binary files /dev/null and b/core/migrations/__pycache__/0017_driverrating.cpython-311.pyc differ
diff --git a/core/models.py b/core/models.py
index 7f57570..2f2c56f 100644
--- a/core/models.py
+++ b/core/models.py
@@ -79,6 +79,19 @@ class Profile(models.Model):
def __str__(self):
return f"{self.user.username} - {self.get_role_display()}"
+
+ def get_average_rating(self):
+ if self.role != 'car_owner':
+ return None
+ ratings = self.user.received_ratings.all()
+ if not ratings:
+ return 0
+ return sum(r.rating for r in ratings) / len(ratings)
+
+ def get_rating_count(self):
+ if self.role != 'car_owner':
+ return 0
+ return self.user.received_ratings.count()
class Meta:
verbose_name = _('Profile')
@@ -241,4 +254,19 @@ class Testimonial(models.Model):
class Meta:
verbose_name = _('Testimonial')
verbose_name_plural = _('Testimonials')
- ordering = ['-created_at']
\ No newline at end of file
+ ordering = ['-created_at']
+
+class DriverRating(models.Model):
+ parcel = models.OneToOneField(Parcel, on_delete=models.CASCADE, related_name='rating', verbose_name=_('Parcel'))
+ driver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_ratings', verbose_name=_('Driver'))
+ shipper = models.ForeignKey(User, on_delete=models.CASCADE, related_name='given_ratings', verbose_name=_('Shipper'))
+ rating = models.PositiveSmallIntegerField(_('Rating'), choices=[(i, str(i)) for i in range(1, 6)])
+ comment = models.TextField(_('Comment'), blank=True)
+ created_at = models.DateTimeField(_('Created At'), auto_now_add=True)
+
+ def __str__(self):
+ return f"Rating {self.rating} for {self.driver.username} by {self.shipper.username}"
+
+ class Meta:
+ verbose_name = _('Driver Rating')
+ verbose_name_plural = _('Driver Ratings')
diff --git a/core/templates/core/emails/password_reset_email.txt b/core/templates/core/emails/password_reset_email.txt
new file mode 100644
index 0000000..0927723
--- /dev/null
+++ b/core/templates/core/emails/password_reset_email.txt
@@ -0,0 +1,17 @@
+{% load i18n %}
+{% trans "Reset Your Password" %}
+
+{% trans "Hello," %}
+
+{% trans "You are receiving this email because you requested a password reset for your account at" %} {{ site_name }}.
+
+{% trans "Please go to the following page and choose a new password:" %}
+
+{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
+
+{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}
+
+{% trans "Thanks," %}
+{% trans "The" %} {{ site_name }} {% trans "Team" %}
+
+{% trans "If you did not request this, please ignore this email." %}
diff --git a/core/templates/core/emails/password_reset_subject.txt b/core/templates/core/emails/password_reset_subject.txt
index fb089be..52188ef 100644
--- a/core/templates/core/emails/password_reset_subject.txt
+++ b/core/templates/core/emails/password_reset_subject.txt
@@ -1 +1 @@
-{% trans "Password reset on" %} {{ site_name }}
\ No newline at end of file
+{% load i18n %}{% trans "Password reset on" %} {{ site_name }}
\ No newline at end of file
diff --git a/core/templates/core/profile.html b/core/templates/core/profile.html
index 44f8e41..e836d7a 100644
--- a/core/templates/core/profile.html
+++ b/core/templates/core/profile.html
@@ -60,6 +60,49 @@
{{ profile.address|default:"-" }}
+
+
+ {% if profile.role == 'car_owner' %}
+
+
+
{% trans "Driver Rating" %}
+
+
{{ profile.get_average_rating|default:"0.0"|floatformat:1 }}
+
+
+
+
+
+ {{ profile.get_rating_count }} {% trans "reviews" %}
+
+
+
+
+ {% if reviews %}
+
+ {% for review in reviews %}
+
+
+
+ {{ review.shipper.first_name }}
+ {{ review.created_at|date:"M d, Y" }}
+
+
+ {{ review.rating }}
+
+
+ {% if review.comment %}
+
{{ review.comment }}
+ {% endif %}
+
+ {% endfor %}
+
+ {% else %}
+
{% trans "No reviews yet." %}
+ {% endif %}
+
+ {% endif %}
+
@@ -75,4 +118,4 @@
border-radius: 8px;
}
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/core/templates/core/rate_driver.html b/core/templates/core/rate_driver.html
new file mode 100644
index 0000000..4b18d6c
--- /dev/null
+++ b/core/templates/core/rate_driver.html
@@ -0,0 +1,126 @@
+{% extends 'base.html' %}
+{% load i18n static core_tags %}
+
+{% block content %}
+
+
+
+
+
+
+
{% trans "Rate Your Experience" %}
+
+ {% trans "How was the service provided by" %}
+ {{ parcel.carrier.username }}?
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/core/templates/core/shipper_dashboard.html b/core/templates/core/shipper_dashboard.html
index 3522058..0d706f0 100644
--- a/core/templates/core/shipper_dashboard.html
+++ b/core/templates/core/shipper_dashboard.html
@@ -1,5 +1,5 @@
{% extends 'base.html' %}
-{% load i18n %}
+{% load i18n core_tags %}
{% block content %}
@@ -84,10 +84,12 @@
{% trans "Carrier" %} |
{% trans "Bid/Price" %} |
{% trans "Status" %} |
+
{% trans "Action" %} |
{% for parcel in history_parcels %}
+ {% get_rating parcel as rating %}
| {{ parcel.created_at|date:"Y-m-d" }} |
#{{ parcel.tracking_number }} |
@@ -105,6 +107,19 @@
{{ parcel.get_status_display }}
+
+ {% if parcel.status == 'delivered' and parcel.carrier %}
+ {% if not rating %}
+
+ {% trans "Rate Driver" %}
+
+ {% else %}
+
+ {{ rating.rating }}
+
+ {% endif %}
+ {% endif %}
+ |
{% endfor %}
@@ -120,4 +135,4 @@
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/core/templatetags/__pycache__/core_tags.cpython-311.pyc b/core/templatetags/__pycache__/core_tags.cpython-311.pyc
index fa34148..1b5ffe1 100644
Binary files a/core/templatetags/__pycache__/core_tags.cpython-311.pyc and b/core/templatetags/__pycache__/core_tags.cpython-311.pyc differ
diff --git a/core/templatetags/core_tags.py b/core/templatetags/core_tags.py
index 2dae0de..423fc0d 100644
--- a/core/templatetags/core_tags.py
+++ b/core/templatetags/core_tags.py
@@ -1,8 +1,15 @@
from django import template
-from core.models import PlatformProfile
+from core.models import PlatformProfile, DriverRating
register = template.Library()
@register.simple_tag
def get_platform_profile():
return PlatformProfile.objects.first()
+
+@register.simple_tag
+def get_rating(parcel):
+ try:
+ return parcel.rating
+ except:
+ return None
\ No newline at end of file
diff --git a/core/urls.py b/core/urls.py
index b551e47..1d462ac 100644
--- a/core/urls.py
+++ b/core/urls.py
@@ -12,7 +12,8 @@ urlpatterns = [
# Password Reset URLs
path('password-reset/', auth_views.PasswordResetView.as_view(
template_name='core/password_reset_form.html',
- email_template_name='core/emails/password_reset_email.html',
+ email_template_name='core/emails/password_reset_email.txt',
+ html_email_template_name='core/emails/password_reset_email.html',
subject_template_name='core/emails/password_reset_subject.txt',
success_url='/password-reset/done/'
), name='password_reset'),
@@ -48,4 +49,4 @@ urlpatterns = [
path('profile/', views.profile_view, name='profile'),
path('profile/edit/', views.edit_profile, name='edit_profile'),
path('profile/verify-otp/', views.verify_otp_view, name='verify_otp'),
-]
\ No newline at end of file
+]
diff --git a/core/views.py b/core/views.py
index 61920ea..0160bae 100644
--- a/core/views.py
+++ b/core/views.py
@@ -3,8 +3,8 @@ from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
-from .models import Parcel, Profile, Country, Governate, City, OTPVerification, PlatformProfile, Testimonial
-from .forms import UserRegistrationForm, ParcelForm, ContactForm, UserProfileForm
+from .models import Parcel, Profile, Country, Governate, City, OTPVerification, PlatformProfile, Testimonial, DriverRating
+from .forms import UserRegistrationForm, ParcelForm, ContactForm, UserProfileForm, DriverRatingForm
from django.utils.translation import gettext_lazy as _
from django.utils.translation import get_language
from django.contrib import messages
@@ -319,7 +319,15 @@ def contact(request):
@login_required
def profile_view(request):
- return render(request, 'core/profile.html', {'profile': request.user.profile})
+ profile = request.user.profile
+ reviews = []
+ if profile.role == 'car_owner':
+ reviews = request.user.received_ratings.all().order_by('-created_at')
+
+ return render(request, 'core/profile.html', {
+ 'profile': profile,
+ 'reviews': reviews
+ })
@login_required
def edit_profile(request):
@@ -425,4 +433,43 @@ def verify_otp_view(request):
except OTPVerification.DoesNotExist:
messages.error(request, _("Invalid code."))
- return render(request, 'core/verify_otp.html')
\ No newline at end of file
+ return render(request, 'core/verify_otp.html')
+
+@login_required
+def rate_driver(request, parcel_id):
+ parcel = get_object_or_404(Parcel, id=parcel_id)
+
+ # Validation
+ if parcel.shipper != request.user:
+ messages.error(request, _("You are not authorized to rate this shipment."))
+ return redirect('dashboard')
+
+ if parcel.status != 'delivered':
+ messages.error(request, _("You can only rate delivered shipments."))
+ return redirect('dashboard')
+
+ if not parcel.carrier:
+ messages.error(request, _("No driver was assigned to this shipment."))
+ return redirect('dashboard')
+
+ if hasattr(parcel, 'rating'):
+ messages.info(request, _("You have already rated this shipment."))
+ return redirect('dashboard')
+
+ if request.method == 'POST':
+ form = DriverRatingForm(request.POST)
+ if form.is_valid():
+ rating = form.save(commit=False)
+ rating.parcel = parcel
+ rating.driver = parcel.carrier
+ rating.shipper = request.user
+ rating.save()
+ messages.success(request, _("Thank you for your feedback!"))
+ return redirect('dashboard')
+ else:
+ form = DriverRatingForm()
+
+ return render(request, 'core/rate_driver.html', {
+ 'form': form,
+ 'parcel': parcel
+ })
diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo
index bb0625b..3ae2ad1 100644
Binary files a/locale/ar/LC_MESSAGES/django.mo and b/locale/ar/LC_MESSAGES/django.mo differ
diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po
index bfabe6f..7cc2de5 100644
--- a/locale/ar/LC_MESSAGES/django.po
+++ b/locale/ar/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2026-01-25 16:24+0000\n"
+"POT-Creation-Date: 2026-01-26 05:03+0000\n"
"PO-Revision-Date: 2026-01-25 07:13+0000\n"
"Last-Translator: Gemini\n"
"Language-Team: Arabic\n"
@@ -18,48 +18,50 @@ msgstr ""
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
-#: core/admin.py:18 core/models.py:84
+#: core/admin.py:21 core/models.py:98
msgid "Profiles"
msgstr "الملفات الشخصية"
-#: core/admin.py:30
+#: core/admin.py:52
+msgid "Export Selected to CSV"
+msgstr "تصدير المحدد إلى CSV"
+
+#: core/admin.py:56
msgid "General Info"
msgstr "معلومات عامة"
-#: core/admin.py:33
+#: core/admin.py:59
msgid "Policies"
msgstr "السياسات"
-#: core/admin.py:36
+#: core/admin.py:62
msgid "Payment Configuration"
msgstr "إعدادات الدفع"
-#: core/admin.py:39
+#: core/admin.py:65
msgid "WhatsApp Configuration (Wablas Gateway)"
msgstr "إعدادات واتساب (بوابة Wablas)"
-#: core/admin.py:41
+#: core/admin.py:67
msgid ""
"Configure your Wablas API connection. Use \"Test WhatsApp Configuration\" to "
"verify."
msgstr ""
"قم بتكوين اتصال Wablas API الخاص بك. استخدم \"اختبار إعدادات واتساب\" للتحقق."
-#: core/admin.py:108
+#: core/admin.py:134
msgid "Test WhatsApp"
msgstr "اختبار واتساب"
-#: core/admin.py:110
-#, fuzzy
-#| msgid "Email"
+#: core/admin.py:136
msgid "Test Email"
-msgstr "البريد الإلكتروني"
+msgstr "اختبار البريد الإلكتروني"
-#: core/admin.py:112
+#: core/admin.py:138
msgid "Actions"
msgstr "إجراءات"
-#: core/admin.py:123
+#: core/admin.py:149
msgid "Tools"
msgstr "أدوات"
@@ -71,8 +73,8 @@ msgstr "الاسم"
msgid "Your Name"
msgstr "اسمك"
-#: core/forms.py:9 core/forms.py:18 core/forms.py:29 core/forms.py:91
-#: core/forms.py:98 core/templates/core/profile.html:41
+#: core/forms.py:9 core/forms.py:21 core/forms.py:32 core/forms.py:110
+#: core/forms.py:119 core/templates/core/profile.html:41
msgid "Email"
msgstr "البريد الإلكتروني"
@@ -104,327 +106,400 @@ msgstr "تأكيد كلمة المرور"
msgid "Register as"
msgstr "التسجيل كـ"
-#: core/forms.py:17 core/forms.py:93 core/models.py:71 core/models.py:158
+#: core/forms.py:18 core/forms.py:112
+msgid "Code"
+msgstr "الرمز"
+
+#: core/forms.py:19 core/forms.py:113 core/models.py:72 core/models.py:172
msgid "Phone Number"
msgstr "رقم الهاتف"
-#: core/forms.py:18 core/forms.py:98
+#: core/forms.py:21 core/forms.py:119
msgid "WhatsApp"
msgstr "واتساب"
-#: core/forms.py:18
+#: core/forms.py:21
msgid "Verify via"
msgstr "التحقق بواسطة"
-#: core/forms.py:20 core/forms.py:113 core/models.py:25 core/models.py:29
-#: core/models.py:75
+#: core/forms.py:23 core/forms.py:134 core/models.py:26 core/models.py:30
+#: core/models.py:76
msgid "Country"
msgstr "الدولة"
-#: core/forms.py:21 core/forms.py:114 core/models.py:43 core/models.py:47
-#: core/models.py:76
+#: core/forms.py:24 core/forms.py:135 core/models.py:44 core/models.py:48
+#: core/models.py:77
msgid "Governate"
msgstr "المحافظة"
-#: core/forms.py:22 core/forms.py:115 core/models.py:61 core/models.py:77
+#: core/forms.py:25 core/forms.py:136 core/models.py:62 core/models.py:78
msgid "City"
msgstr "المدينة"
-#: core/forms.py:28
+#: core/forms.py:31
msgid "Username"
msgstr "اسم المستخدم"
-#: core/forms.py:30 core/forms.py:89
+#: core/forms.py:33 core/forms.py:108
msgid "First Name"
msgstr "الاسم الأول"
-#: core/forms.py:31 core/forms.py:90
+#: core/forms.py:34 core/forms.py:109
msgid "Last Name"
msgstr "اسم العائلة"
-#: core/forms.py:70
+#: core/forms.py:78
msgid "Passwords don't match"
msgstr "كلمات المرور غير متطابقة"
-#: core/forms.py:94 core/models.py:73 core/models.py:157
+#: core/forms.py:115 core/models.py:74 core/models.py:171
#: core/templates/core/profile.html:59
msgid "Address"
msgstr "العنوان"
-#: core/forms.py:95 core/models.py:72
+#: core/forms.py:116 core/models.py:73
msgid "Profile Picture"
msgstr "الصورة الشخصية"
-#: core/forms.py:99
+#: core/forms.py:120
msgid "Verify changes via"
msgstr "التحقق من التغييرات عبر"
-#: core/forms.py:167
+#: core/forms.py:204
+msgid "Receiver Code"
+msgstr "رمز المستلم"
+
+#: core/forms.py:215
msgid "What are you sending?"
msgstr "ماذا سترسل؟"
-#: core/forms.py:174 core/forms.py:179
+#: core/forms.py:222 core/forms.py:227
msgid "Street/Building"
msgstr "الشارع/المبنى"
-#: core/forms.py:185
+#: core/forms.py:233
msgid "Package Description"
msgstr "وصف الطرد"
-#: core/forms.py:186 core/models.py:116
+#: core/forms.py:234 core/models.py:130
msgid "Weight (kg)"
msgstr "الوزن (كجم)"
-#: core/forms.py:187
-msgid "Shipping Price (OMR)"
-msgstr "سعر الشحن (ر.ع)"
+#: core/forms.py:235
+msgid "Your Offer Price (Bid) (OMR)"
+msgstr "عرض سعرك (المزايدة) (ر.ع)"
-#: core/forms.py:188 core/models.py:120
+#: core/forms.py:236 core/models.py:134
msgid "Pickup Country"
msgstr "دولة الاستلام"
-#: core/forms.py:189 core/models.py:121
+#: core/forms.py:237 core/models.py:135
msgid "Pickup Governate"
msgstr "محافظة الاستلام"
-#: core/forms.py:190 core/models.py:122
+#: core/forms.py:238 core/models.py:136
msgid "Pickup City"
msgstr "مدينة الاستلام"
-#: core/forms.py:191
+#: core/forms.py:239
msgid "Pickup Address (Street/Building)"
msgstr "عنوان الاستلام (الشارع/المبنى)"
-#: core/forms.py:192 core/models.py:126
+#: core/forms.py:240 core/models.py:140
msgid "Delivery Country"
msgstr "دولة التوصيل"
-#: core/forms.py:193 core/models.py:127
+#: core/forms.py:241 core/models.py:141
msgid "Delivery Governate"
msgstr "محافظة التوصيل"
-#: core/forms.py:194 core/models.py:128
+#: core/forms.py:242 core/models.py:142
msgid "Delivery City"
msgstr "مدينة التوصيل"
-#: core/forms.py:195
+#: core/forms.py:243
msgid "Delivery Address (Street/Building)"
msgstr "عنوان التوصيل (الشارع/المبنى)"
-#: core/forms.py:196 core/models.py:131
+#: core/forms.py:244 core/models.py:145
msgid "Receiver Name"
msgstr "اسم المستلم"
-#: core/forms.py:197 core/models.py:132
+#: core/forms.py:245 core/models.py:146
msgid "Receiver Phone"
msgstr "هاتف المستلم"
-#: core/models.py:12 core/models.py:30 core/models.py:48
+#: core/forms.py:332
+msgid "Write your review here..."
+msgstr "اكتب تقييمك هنا..."
+
+#: core/forms.py:335 core/models.py:263 core/templates/core/rate_driver.html:23
+msgid "Rating"
+msgstr "التقييم"
+
+#: core/forms.py:336 core/models.py:264 core/templates/core/rate_driver.html:41
+msgid "Comment"
+msgstr "التعليق"
+
+#: core/models.py:12 core/models.py:31 core/models.py:49 core/models.py:228
msgid "Name (English)"
msgstr "الاسم (إنجليزي)"
-#: core/models.py:13 core/models.py:31 core/models.py:49
+#: core/models.py:13 core/models.py:32 core/models.py:50 core/models.py:229
msgid "Name (Arabic)"
msgstr "الاسم (عربي)"
-#: core/models.py:26
+#: core/models.py:14
+msgid "Phone Code"
+msgstr "رمز الهاتف"
+
+#: core/models.py:14
+msgid "e.g. +968"
+msgstr "مثال +968"
+
+#: core/models.py:27
msgid "Countries"
msgstr "الدول"
-#: core/models.py:44
+#: core/models.py:45
msgid "Governates"
msgstr "المحافظات"
-#: core/models.py:62
+#: core/models.py:63
msgid "Cities"
msgstr "المدن"
-#: core/models.py:66 core/models.py:112
+#: core/models.py:67 core/models.py:126 core/models.py:262
msgid "Shipper"
msgstr "شاحن"
-#: core/models.py:67
+#: core/models.py:68
msgid "Car Owner"
msgstr "صاحب سيارة"
-#: core/models.py:69
+#: core/models.py:70
msgid "User"
msgstr "مستخدم"
-#: core/models.py:70
+#: core/models.py:71
msgid "Role"
msgstr "الدور"
-#: core/models.py:83
+#: core/models.py:97
msgid "Profile"
msgstr "الملف الشخصي"
-#: core/models.py:98
+#: core/models.py:112
msgid "Pending Pickup"
msgstr "في انتظار الاستلام"
-#: core/models.py:99
+#: core/models.py:113
msgid "Picked Up"
msgstr "تم الاستلام"
-#: core/models.py:100
+#: core/models.py:114
msgid "In Transit"
msgstr "في الطريق"
-#: core/models.py:101
+#: core/models.py:115
msgid "Delivered"
msgstr "تم التوصيل"
-#: core/models.py:102
+#: core/models.py:116
msgid "Cancelled"
msgstr "ملغي"
-#: core/models.py:106
+#: core/models.py:120
msgid "Pending"
msgstr "قيد الانتظار"
-#: core/models.py:107
+#: core/models.py:121
msgid "Paid"
msgstr "مدفوع"
-#: core/models.py:108
+#: core/models.py:122
msgid "Failed"
msgstr "فشل"
-#: core/models.py:111
+#: core/models.py:125
msgid "Tracking Number"
msgstr "رقم التتبع"
-#: core/models.py:113 core/templates/core/shipper_dashboard.html:44
+#: core/models.py:127 core/templates/core/shipper_dashboard.html:58
+#: core/templates/core/shipper_dashboard.html:84
msgid "Carrier"
msgstr "الناقل"
-#: core/models.py:115
+#: core/models.py:129 core/templates/core/shipper_dashboard.html:83
msgid "Description"
msgstr "الوصف"
-#: core/models.py:116
+#: core/models.py:130
msgid "Weight in kg"
msgstr "الوزن بالكيلوجرام"
-#: core/models.py:117
+#: core/models.py:131
msgid "Price (OMR)"
msgstr "السعر (ر.ع)"
-#: core/models.py:123
+#: core/models.py:137
msgid "Pickup Address"
msgstr "عنوان الاستلام"
-#: core/models.py:129
+#: core/models.py:143
msgid "Delivery Address"
msgstr "عنوان التوصيل"
-#: core/models.py:134 core/templates/core/index.html:30
+#: core/models.py:148 core/templates/core/driver_dashboard.html:108
+#: core/templates/core/index.html:30
+#: core/templates/core/shipper_dashboard.html:86
msgid "Status"
msgstr "الحالة"
-#: core/models.py:135
+#: core/models.py:149
msgid "Payment Status"
msgstr "حالة الدفع"
-#: core/models.py:136
+#: core/models.py:150
msgid "Thawani Session ID"
msgstr "معرف جلسة ثواني"
-#: core/models.py:138
+#: core/models.py:152 core/models.py:265
msgid "Created At"
msgstr "أنشئ في"
-#: core/models.py:139
+#: core/models.py:153
msgid "Updated At"
msgstr "حدث في"
-#: core/models.py:150
+#: core/models.py:164 core/models.py:260
msgid "Parcel"
msgstr "طرد"
-#: core/models.py:151
+#: core/models.py:165
msgid "Parcels"
msgstr "طرود"
-#: core/models.py:154
+#: core/models.py:168
msgid "Platform Name"
msgstr "اسم المنصة"
-#: core/models.py:155
+#: core/models.py:169
msgid "Logo"
msgstr "الشعار"
-#: core/models.py:156
+#: core/models.py:170
msgid "Slogan"
msgstr "الشعار اللفظي"
-#: core/models.py:159
+#: core/models.py:173
msgid "Registration Number"
msgstr "رقم السجل التجاري"
-#: core/models.py:160
+#: core/models.py:174
msgid "VAT Number"
msgstr "الرقم الضريبي"
-#: core/models.py:161 core/templates/base.html:232
+#: core/models.py:175 core/templates/base.html:232
#: core/templates/core/privacy_policy.html:11
msgid "Privacy Policy"
msgstr "سياسة الخصوصية"
-#: core/models.py:162 core/templates/core/terms_conditions.html:11
+#: core/models.py:176 core/templates/core/terms_conditions.html:11
msgid "Terms and Conditions"
msgstr "الشروط والأحكام"
-#: core/models.py:165
+#: core/models.py:179
msgid "Wablas API Token"
msgstr "رمز Wablas API"
-#: core/models.py:165
+#: core/models.py:179
msgid "Your Wablas API Token."
msgstr "رمز Wablas API الخاص بك."
-#: core/models.py:166
+#: core/models.py:180
msgid "Wablas Domain"
msgstr "نطاق Wablas"
-#: core/models.py:166
+#: core/models.py:180
msgid "The Wablas API domain (e.g., https://deu.wablas.com)."
msgstr "نطاق Wablas API (مثال: https://deu.wablas.com)."
-#: core/models.py:167
+#: core/models.py:181
msgid "Wablas Secret Key"
msgstr "مفتاح Wablas السري"
-#: core/models.py:167
+#: core/models.py:181
msgid "Your Wablas API Secret Key (if required)."
msgstr "مفتاح Wablas API السري الخاص بك (إذا لزم الأمر)."
-#: core/models.py:170
+#: core/models.py:184
msgid "Enable Payment"
msgstr "تفعيل الدفع"
-#: core/models.py:170
+#: core/models.py:184
msgid "Toggle to enable or disable payments on the platform."
msgstr "تبديل لتفعيل أو تعطيل المدفوعات على المنصة."
-#: core/models.py:194 core/models.py:195
+#: core/models.py:208 core/models.py:209
msgid "Platform Profile"
msgstr "ملف تعريف المنصة"
-#: core/models.py:199
+#: core/models.py:213
msgid "Profile Update"
msgstr "تحديث الملف الشخصي"
-#: core/models.py:200
+#: core/models.py:214
msgid "Password Reset"
msgstr "إعادة تعيين كلمة المرور"
-#: core/models.py:201
-#, fuzzy
-#| msgid "Registration Number"
+#: core/models.py:215
msgid "Registration"
-msgstr "رقم السجل التجاري"
+msgstr "التسجيل"
+
+#: core/models.py:230
+msgid "Role (English)"
+msgstr "الدور (إنجليزي)"
+
+#: core/models.py:231
+msgid "Role (Arabic)"
+msgstr "الدور (عربي)"
+
+#: core/models.py:232
+msgid "Testimony (English)"
+msgstr "الشهادة (إنجليزي)"
+
+#: core/models.py:233
+msgid "Testimony (Arabic)"
+msgstr "الشهادة (عربي)"
+
+#: core/models.py:234
+msgid "Image"
+msgstr "صورة"
+
+#: core/models.py:235
+msgid "Active"
+msgstr "نشط"
+
+#: core/models.py:255
+msgid "Testimonial"
+msgstr "شهادة"
+
+#: core/models.py:256
+msgid "Testimonials"
+msgstr "الشهادات"
+
+#: core/models.py:261
+msgid "Driver"
+msgstr "السائق"
+
+#: core/models.py:271 core/templates/core/profile.html:68
+msgid "Driver Rating"
+msgstr "تقييم السائق"
+
+#: core/models.py:272
+msgid "Driver Ratings"
+msgstr "تقييمات السائق"
#: core/templates/admin/core/platformprofile/test_email.html:11
#: core/templates/admin/core/platformprofile/test_whatsapp.html:11
@@ -448,10 +523,8 @@ msgid "Dashboard"
msgstr "لوحة التحكم"
#: core/templates/base.html:115
-#, fuzzy
-#| msgid "Admin"
msgid "Admin Panel"
-msgstr "المسؤول"
+msgstr "لوحة الإدارة"
#: core/templates/base.html:118 core/templates/core/profile.html:4
#: core/templates/core/profile.html:21
@@ -468,11 +541,12 @@ msgid "Logout"
msgstr "تسجيل الخروج"
#: core/templates/base.html:132 core/templates/core/login.html:4
-#: core/templates/core/login.html:32
+#: core/templates/core/login.html:46
msgid "Login"
msgstr "تسجيل الدخول"
-#: core/templates/base.html:135 core/templates/core/register.html:4
+#: core/templates/base.html:135 core/templates/core/login.html:50
+#: core/templates/core/register.html:4
msgid "Register"
msgstr "تسجيل"
@@ -505,12 +579,12 @@ msgstr "قانوني"
msgid "Terms & Conditions"
msgstr "الشروط والأحكام"
-#: core/templates/base.html:241
+#: core/templates/base.html:241 core/templates/core/emails/base_email.html:86
msgid "All rights reserved."
msgstr "جميع الحقوق محفوظة."
#: core/templates/core/article_detail.html:10
-#: core/templates/core/contact.html:14 core/templates/core/login.html:14
+#: core/templates/core/contact.html:14
#: core/templates/core/privacy_policy.html:8
#: core/templates/core/register.html:14
#: core/templates/core/terms_conditions.html:8
@@ -542,54 +616,89 @@ msgid "Available Shipments"
msgstr "الشحنات المتوفرة"
#: core/templates/core/driver_dashboard.html:13
-msgid "My Deliveries"
-msgstr "توصيلاتي"
+msgid "Active Deliveries"
+msgstr "عمليات التوصيل النشطة"
-#: core/templates/core/driver_dashboard.html:27
+#: core/templates/core/driver_dashboard.html:16
+#: core/templates/core/shipper_dashboard.html:17
+msgid "Transaction History"
+msgstr "سجل المعاملات"
+
+#: core/templates/core/driver_dashboard.html:30
msgid "Pickup"
msgstr "الاستلام"
-#: core/templates/core/driver_dashboard.html:28
+#: core/templates/core/driver_dashboard.html:31
msgid "Delivery"
msgstr "التوصيل"
-#: core/templates/core/driver_dashboard.html:30
+#: core/templates/core/driver_dashboard.html:34
msgid "Weight"
msgstr "الوزن"
-#: core/templates/core/driver_dashboard.html:35
+#: core/templates/core/driver_dashboard.html:39
+msgid "Shipper's Offer (Bid)"
+msgstr "عرض الشاحن"
+
+#: core/templates/core/driver_dashboard.html:45
msgid "Accept Shipment"
msgstr "قبول الشحنة"
-#: core/templates/core/driver_dashboard.html:43
+#: core/templates/core/driver_dashboard.html:53
msgid "No shipments available at the moment."
msgstr "لا توجد شحنات متوفرة حالياً."
-#: core/templates/core/driver_dashboard.html:60
+#: core/templates/core/driver_dashboard.html:70
+#: core/templates/core/driver_dashboard.html:106
#: core/templates/core/index.html:35
-#: core/templates/core/shipper_dashboard.html:25
+#: core/templates/core/shipper_dashboard.html:39
msgid "To"
msgstr "إلى"
-#: core/templates/core/driver_dashboard.html:61
-#: core/templates/core/shipper_dashboard.html:43
+#: core/templates/core/driver_dashboard.html:71
+#: core/templates/core/shipper_dashboard.html:57
msgid "Receiver"
msgstr "المستلم"
-#: core/templates/core/driver_dashboard.html:72
+#: core/templates/core/driver_dashboard.html:82
msgid "Update"
msgstr "تحديث"
-#: core/templates/core/driver_dashboard.html:80
+#: core/templates/core/driver_dashboard.html:90
msgid "You haven't accepted any shipments yet."
msgstr "لم تقبل أي شحنات بعد."
+#: core/templates/core/driver_dashboard.html:103
+#: core/templates/core/shipper_dashboard.html:81
+msgid "Date"
+msgstr "التاريخ"
+
+#: core/templates/core/driver_dashboard.html:104
+#: core/templates/core/shipper_dashboard.html:82
+msgid "Tracking ID"
+msgstr "رقم التتبع"
+
+#: core/templates/core/driver_dashboard.html:105
+#: core/templates/core/index.html:34
+#: core/templates/core/shipper_dashboard.html:38
+msgid "From"
+msgstr "من"
+
+#: core/templates/core/driver_dashboard.html:107
+msgid "Price"
+msgstr "السعر"
+
+#: core/templates/core/driver_dashboard.html:133
+msgid "No completed deliveries yet."
+msgstr "لا توجد عمليات توصيل مكتملة بعد."
+
#: core/templates/core/edit_profile.html:14
msgid "Back to Profile"
msgstr "العودة إلى الملف الشخصي"
#: core/templates/core/edit_profile.html:36
-#: core/templates/core/shipment_request.html:130
+#: core/templates/core/rate_driver.html:55
+#: core/templates/core/shipment_request.html:140
#: core/templates/core/verify_otp.html:31
msgid "Cancel"
msgstr "إلغاء"
@@ -600,18 +709,89 @@ msgstr "حفظ وتحقق"
#: core/templates/core/edit_profile.html:55
#: core/templates/core/register.html:59
-#: core/templates/core/shipment_request.html:151
+#: core/templates/core/shipment_request.html:161
msgid "Select Governate"
msgstr "اختر المحافظة"
#: core/templates/core/edit_profile.html:56
#: core/templates/core/edit_profile.html:74
#: core/templates/core/register.html:60 core/templates/core/register.html:78
-#: core/templates/core/shipment_request.html:152
-#: core/templates/core/shipment_request.html:170
+#: core/templates/core/shipment_request.html:162
+#: core/templates/core/shipment_request.html:180
msgid "Select City"
msgstr "اختر المدينة"
+#: core/templates/core/emails/password_reset_email.html:5
+#: core/templates/core/emails/password_reset_email.txt:2
+msgid "Reset Your Password"
+msgstr "إعادة تعيين كلمة المرور"
+
+#: core/templates/core/emails/password_reset_email.html:7
+#: core/templates/core/emails/password_reset_email.txt:4
+msgid "Hello,"
+msgstr "مرحباً،"
+
+#: core/templates/core/emails/password_reset_email.html:9
+#: core/templates/core/emails/password_reset_email.txt:6
+msgid ""
+"You are receiving this email because you requested a password reset for your "
+"account at"
+msgstr "تتلقى هذه الرسالة لأنك طلبت إعادة تعيين كلمة المرور لحسابك في"
+
+#: core/templates/core/emails/password_reset_email.html:11
+msgid "Please click the button below to choose a new password:"
+msgstr "يرجى النقر على الزر أدناه لاختيار كلمة مرور جديدة:"
+
+#: core/templates/core/emails/password_reset_email.html:14
+#: core/templates/core/password_reset_form.html:4
+#: core/templates/core/password_reset_form.html:19
+msgid "Reset Password"
+msgstr "إعادة تعيين كلمة المرور"
+
+#: core/templates/core/emails/password_reset_email.html:17
+msgid ""
+"If the button above doesn't work, verify that you entered your username "
+"correctly and try pasting this link into your browser:"
+msgstr ""
+"إذا لم يعمل الزر أعلاه، تحقق من إدخال اسم المستخدم الخاص بك بشكل صحيح وحاول "
+"لصق هذا الرابط في متصفحك:"
+
+#: core/templates/core/emails/password_reset_email.html:21
+msgid "Your username is:"
+msgstr "اسم المستخدم الخاص بك هو:"
+
+#: core/templates/core/emails/password_reset_email.html:23
+#: core/templates/core/emails/password_reset_email.txt:17
+msgid "If you did not request this, please ignore this email."
+msgstr "إذا لم تطلب ذلك، يرجى تجاهل هذا البريد الإلكتروني."
+
+#: core/templates/core/emails/password_reset_email.html:25
+#: core/templates/core/emails/password_reset_email.txt:14
+msgid "Thanks,"
+msgstr "شكراً،"
+
+#: core/templates/core/emails/password_reset_email.html:25
+#: core/templates/core/emails/password_reset_email.txt:15
+msgid "The"
+msgstr "فريق"
+
+#: core/templates/core/emails/password_reset_email.html:25
+#: core/templates/core/emails/password_reset_email.txt:15
+msgid "Team"
+msgstr ""
+
+#: core/templates/core/emails/password_reset_email.txt:8
+msgid "Please go to the following page and choose a new password:"
+msgstr "يرجى الذهاب إلى الصفحة التالية واختيار كلمة مرور جديدة:"
+
+#: core/templates/core/emails/password_reset_email.txt:12
+msgid "Your username, in case you've forgotten:"
+msgstr "اسم المستخدم الخاص بك، في حال نسيته:"
+
+#: core/templates/core/emails/password_reset_subject.txt:1
+msgid "Password reset on"
+msgstr "إعادة تعيين كلمة المرور في"
+
#: core/templates/core/index.html:10
msgid "Small Shipments,"
msgstr "شحنات صغيرة،"
@@ -644,11 +824,6 @@ msgstr "أدخل رقم التتبع (مثال: 5A2B...)"
msgid "Track"
msgstr "تتبع"
-#: core/templates/core/index.html:34
-#: core/templates/core/shipper_dashboard.html:24
-msgid "From"
-msgstr "من"
-
#: core/templates/core/index.html:42
msgid "Enter your 10-character tracking ID to see live updates."
msgstr "أدخل رقم التتبع المكون من 10 أرقام لرؤية التحديثات المباشرة."
@@ -687,37 +862,125 @@ msgstr "توصيل آمن"
msgid "Track your parcel in real-time until it reaches its destination safely."
msgstr "تتبع طردك في الوقت الفعلي حتى يصل إلى وجهته بأمان."
-#: core/templates/core/index.html:92
+#: core/templates/core/index.html:94
+msgid "What Our Users Say"
+msgstr "ماذا يقول مستخدمونا"
+
+#: core/templates/core/index.html:95
+msgid "Real stories from our community"
+msgstr "قصص حقيقية من مجتمعنا"
+
+#: core/templates/core/index.html:124
msgid "Ready to join the movement?"
msgstr "مستعد للانضمام إلينا؟"
-#: core/templates/core/index.html:95
+#: core/templates/core/index.html:127
msgid "I want to send a parcel"
msgstr "أريد إرسال طرد"
-#: core/templates/core/index.html:96
+#: core/templates/core/index.html:128
msgid "Become a Shipper"
msgstr "كن شاحناً"
-#: core/templates/core/index.html:99
+#: core/templates/core/index.html:131
msgid "I have a car and want to earn"
msgstr "لدي سيارة وأريد كسب المال"
-#: core/templates/core/index.html:100
+#: core/templates/core/index.html:132
msgid "Become a Driver"
msgstr "كن سائقاً"
-#: core/templates/core/login.html:20
-msgid "Login to masarX"
-msgstr "تسجيل الدخول إلى مسارX"
+#: core/templates/core/login.html:21
+msgid "Welcome Back"
+msgstr "أهلاً بعودتك"
-#: core/templates/core/login.html:35
+#: core/templates/core/login.html:22
+msgid "Please login to your account"
+msgstr "يرجى تسجيل الدخول إلى حسابك"
+
+#: core/templates/core/login.html:42
+msgid "Forgot Password?"
+msgstr "هل نسيت كلمة المرور؟"
+
+#: core/templates/core/login.html:49
msgid "Don't have an account?"
msgstr "ليس لديك حساب؟"
-#: core/templates/core/login.html:35
-msgid "Register here"
-msgstr "سجل هنا"
+#: core/templates/core/password_reset_complete.html:4
+msgid "Password Reset Complete"
+msgstr "اكتمل إعادة تعيين كلمة المرور"
+
+#: core/templates/core/password_reset_complete.html:16
+msgid "Password Changed!"
+msgstr "تم تغيير كلمة المرور!"
+
+#: core/templates/core/password_reset_complete.html:18
+msgid "Your password has been set. You may go ahead and log in now."
+msgstr "تم تعيين كلمة المرور الخاصة بك. يمكنك المضي قدماً وتسجيل الدخول الآن."
+
+#: core/templates/core/password_reset_complete.html:21
+msgid "Log In"
+msgstr "تسجيل الدخول"
+
+#: core/templates/core/password_reset_confirm.html:4
+msgid "New Password"
+msgstr "كلمة المرور الجديدة"
+
+#: core/templates/core/password_reset_confirm.html:14
+msgid "Set New Password"
+msgstr "تعيين كلمة مرور جديدة"
+
+#: core/templates/core/password_reset_confirm.html:15
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"يرجى إدخال كلمة المرور الجديدة مرتين حتى نتمكن من التحقق من كتابتها بشكل "
+"صحيح."
+
+#: core/templates/core/password_reset_confirm.html:32
+msgid "Change Password"
+msgstr "تغيير كلمة المرور"
+
+#: core/templates/core/password_reset_done.html:4
+msgid "Email Sent"
+msgstr "تم إرسال البريد الإلكتروني"
+
+#: core/templates/core/password_reset_done.html:16
+msgid "Check Your Email"
+msgstr "تفقد بريدك الإلكتروني"
+
+#: core/templates/core/password_reset_done.html:18
+msgid ""
+"We've sent you instructions on how to reset your password. If an account "
+"exists with the email you entered, you will receive them shortly."
+msgstr ""
+"لقد أرسلنا لك تعليمات حول كيفية إعادة تعيين كلمة المرور الخاصة بك. إذا كان "
+"هناك حساب بالبريد الإلكتروني الذي أدخلته، فستتلقاها قريباً."
+
+#: core/templates/core/password_reset_done.html:21
+msgid "If you don't receive an email, please check your spam folder."
+msgstr ""
+"إذا لم تتلق بريداً إلكترونياً، يرجى التحقق من مجلد الرسائل غير المرغوب فيها."
+
+#: core/templates/core/password_reset_done.html:24
+msgid "Return to Login"
+msgstr "العودة إلى تسجيل الدخول"
+
+#: core/templates/core/password_reset_form.html:20
+msgid ""
+"Enter your email address and we'll send you a link to reset your password."
+msgstr ""
+"أدخل عنوان بريدك الإلكتروني وسنرسل لك رابطاً لإعادة تعيين كلمة المرور الخاصة "
+"بك."
+
+#: core/templates/core/password_reset_form.html:34
+msgid "Send Reset Link"
+msgstr "إرسال رابط إعادة التعيين"
+
+#: core/templates/core/password_reset_form.html:39
+msgid "Back to Login"
+msgstr "العودة إلى تسجيل الدخول"
#: core/templates/core/privacy_policy.html:16
msgid "Privacy Policy not available yet."
@@ -736,6 +999,26 @@ msgstr "الهاتف"
msgid "Location"
msgstr "الموقع"
+#: core/templates/core/profile.html:76
+msgid "reviews"
+msgstr "تقييمات"
+
+#: core/templates/core/profile.html:101
+msgid "No reviews yet."
+msgstr "لا توجد تقييمات بعد."
+
+#: core/templates/core/rate_driver.html:11
+msgid "Rate Your Experience"
+msgstr "قيم تجربتك"
+
+#: core/templates/core/rate_driver.html:13
+msgid "How was the service provided by"
+msgstr "كيف كانت الخدمة المقدمة من"
+
+#: core/templates/core/rate_driver.html:52
+msgid "Submit Review"
+msgstr "إرسال التقييم"
+
#: core/templates/core/register.html:20
msgid "Join masarX"
msgstr "انضم إلى مسارX"
@@ -768,7 +1051,7 @@ msgstr "تفاصيل التوصيل"
msgid "Receiver Details"
msgstr "تفاصيل المستلم"
-#: core/templates/core/shipment_request.html:131
+#: core/templates/core/shipment_request.html:141
msgid "Submit Request"
msgstr "إرسال الطلب"
@@ -780,22 +1063,44 @@ msgstr "شحناتي"
msgid "New Shipment"
msgstr "شحنة جديدة"
-#: core/templates/core/shipper_dashboard.html:37
+#: core/templates/core/shipper_dashboard.html:14
+msgid "Active Shipments"
+msgstr "الشحنات النشطة"
+
+#: core/templates/core/shipper_dashboard.html:51
msgid "Pay Now"
msgstr "ادفع الآن"
-#: core/templates/core/shipper_dashboard.html:44
+#: core/templates/core/shipper_dashboard.html:58
msgid "Waiting for pickup"
msgstr "في انتظار الاستلام"
-#: core/templates/core/shipper_dashboard.html:52
-msgid "You haven't sent any shipments yet."
-msgstr "لم ترسل أي شحنات بعد."
+#: core/templates/core/shipper_dashboard.html:66
+msgid "You have no active shipments."
+msgstr "ليس لديك شحنات نشطة."
-#: core/templates/core/shipper_dashboard.html:53
+#: core/templates/core/shipper_dashboard.html:67
msgid "Send your first shipment"
msgstr "أرسل أول شحنة لك"
+#: core/templates/core/shipper_dashboard.html:85
+msgid "Bid/Price"
+msgstr "العرض/السعر"
+
+#: core/templates/core/shipper_dashboard.html:87
+#, fuzzy
+#| msgid "Actions"
+msgid "Action"
+msgstr "إجراءات"
+
+#: core/templates/core/shipper_dashboard.html:114
+msgid "Rate Driver"
+msgstr "قيم السائق"
+
+#: core/templates/core/shipper_dashboard.html:132
+msgid "No completed transactions yet."
+msgstr "لا توجد معاملات مكتملة بعد."
+
#: core/templates/core/terms_conditions.html:16
msgid "Terms and Conditions not available yet."
msgstr "الشروط والأحكام غير متوفرة بعد."
@@ -821,8 +1126,8 @@ msgstr ""
"تغييراتك."
#: core/templates/core/verify_otp.html:27
-#: core/templates/core/verify_registration.html:27 core/views.py:63
-#: core/views.py:330
+#: core/templates/core/verify_registration.html:27 core/views.py:67
+#: core/views.py:373
msgid "Verification Code"
msgstr "رمز التحقق"
@@ -832,125 +1137,146 @@ msgstr "تحقق وحفظ"
#: core/templates/core/verify_registration.html:4
#: core/templates/core/verify_registration.html:31
-#, fuzzy
-#| msgid "Create Account"
msgid "Verify Account"
-msgstr "إنشاء حساب"
+msgstr "التحقق من الحساب"
#: core/templates/core/verify_registration.html:14
-#, fuzzy
-#| msgid "Register"
msgid "Back to Register"
-msgstr "تسجيل"
+msgstr "العودة إلى التسجيل"
#: core/templates/core/verify_registration.html:20
-#, fuzzy
-#| msgid "Verification Code"
msgid "Account Verification"
-msgstr "رمز التحقق"
+msgstr "تفعيل الحساب"
#: core/templates/core/verify_registration.html:22
-#, fuzzy
-#| msgid ""
-#| "We have sent a verification code to your selected contact method. Please "
-#| "enter it below to save your changes."
msgid ""
"We have sent a verification code to verify your account. Please enter it "
"below to complete registration."
-msgstr ""
-"لقد أرسلنا رمز التحقق إلى وسيلة الاتصال المحددة. يرجى إدخاله أدناه لحفظ "
-"تغييراتك."
+msgstr "لقد أرسلنا رمز التحقق لتفعيل حسابك. يرجى إدخاله أدناه لإكمال التسجيل."
-#: core/views.py:34
+#: core/views.py:35
msgid "Parcel not found."
msgstr "الطرد غير موجود."
-#: core/views.py:60 core/views.py:324
+#: core/views.py:64 core/views.py:367
msgid "Verification code sent to WhatsApp."
msgstr "تم إرسال رمز التحقق إلى واتساب."
-#: core/views.py:69 core/views.py:336
+#: core/views.py:70
+msgid "Welcome to Masar!"
+msgstr "مرحباً بك في مسار!"
+
+#: core/views.py:73 core/views.py:379
msgid "Verification code sent to email."
msgstr "تم إرسال رمز التحقق إلى البريد الإلكتروني."
-#: core/views.py:79
-#, fuzzy
-#| msgid "Session expired. Please try again."
+#: core/views.py:83
msgid "Session expired or invalid."
-msgstr "انتهت صلاحية الجلسة. يرجى المحاولة مرة أخرى."
+msgstr "انتهت صلاحية الجلسة أو أنها غير صالحة."
-#: core/views.py:107
-#, fuzzy
-#| msgid "Profile updated successfully!"
+#: core/views.py:111
msgid "Account verified successfully!"
-msgstr "تم تحديث الملف الشخصي بنجاح!"
+msgstr "تم التحقق من الحساب بنجاح!"
-#: core/views.py:110 core/views.py:389
+#: core/views.py:114 core/views.py:432
msgid "Invalid or expired code."
msgstr "الرمز غير صالح أو منتهي الصلاحية."
-#: core/views.py:112 core/views.py:391
+#: core/views.py:116 core/views.py:434
msgid "Invalid code."
msgstr "رمز غير صالح."
-#: core/views.py:137
+#: core/views.py:165
msgid "Only shippers can request shipments."
msgstr "فقط الشاحنين يمكنهم طلب شحنات."
-#: core/views.py:150
+#: core/views.py:178
msgid "Shipment requested successfully! Tracking ID: "
msgstr "تم طلب الشحنة بنجاح! رقم التتبع: "
-#: core/views.py:160
+#: core/views.py:188
msgid "Only car owners can accept shipments."
msgstr "فقط أصحاب السيارات يمكنهم قبول الشحنات."
-#: core/views.py:171
+#: core/views.py:206
msgid "You have accepted the shipment!"
msgstr "لقد قبلت الشحنة!"
-#: core/views.py:186
+#: core/views.py:221
msgid "Status updated successfully!"
msgstr "تم تحديث الحالة بنجاح!"
-#: core/views.py:194
+#: core/views.py:229
msgid "Payments are currently disabled by the administrator."
msgstr "المدفوعات معطلة حالياً من قبل المسؤول."
-#: core/views.py:211
+#: core/views.py:246
msgid "Could not initiate payment. Please try again later."
msgstr "تعذر بدء الدفع. يرجى المحاولة مرة أخرى لاحقاً."
-#: core/views.py:230
+#: core/views.py:265
msgid "Payment successful! Your shipment is now active."
msgstr "تم الدفع بنجاح! شحنتك نشطة الآن."
-#: core/views.py:232
+#: core/views.py:267
msgid "Payment status is pending or failed. Please check your dashboard."
msgstr "حالة الدفع معلقة أو فشلت. يرجى التحقق من لوحة التحكم."
-#: core/views.py:238
+#: core/views.py:273
msgid "Payment was cancelled."
msgstr "تم إلغاء الدفع."
-#: core/views.py:277
+#: core/views.py:312
msgid "Your message has been sent successfully!"
msgstr "تم إرسال رسالتك بنجاح!"
-#: core/views.py:279
+#: core/views.py:314
msgid "There was an error sending your message. Please try again later."
msgstr "حدث خطأ أثناء إرسال رسالتك. يرجى المحاولة مرة أخرى لاحقاً."
-#: core/views.py:383
+#: core/views.py:376
+msgid "Profile Update Verification"
+msgstr "التحقق من تحديث الملف الشخصي"
+
+#: core/views.py:426
msgid "Profile updated successfully!"
msgstr "تم تحديث الملف الشخصي بنجاح!"
-#: core/views.py:386
+#: core/views.py:429
msgid "Session expired. Please try again."
msgstr "انتهت صلاحية الجلسة. يرجى المحاولة مرة أخرى."
-#~ msgid "Hello"
-#~ msgstr "مرحباً"
+#: core/views.py:444
+msgid "You are not authorized to rate this shipment."
+msgstr "غير مصرح لك بتقييم هذه الشحنة."
+
+#: core/views.py:448
+msgid "You can only rate delivered shipments."
+msgstr "يمكنك تقييم الشحنات المسلمة فقط."
+
+#: core/views.py:452
+msgid "No driver was assigned to this shipment."
+msgstr "لم يتم تعيين سائق لهذه الشحنة."
+
+#: core/views.py:456
+msgid "You have already rated this shipment."
+msgstr "لقد قمت بتقييم هذه الشحنة بالفعل."
+
+#: core/views.py:467
+msgid "Thank you for your feedback!"
+msgstr "شكراً لملاحظاتك!"
+
+#~ msgid "Shipping Price (OMR)"
+#~ msgstr "سعر الشحن (ر.ع)"
+
+#~ msgid "Login to masarX"
+#~ msgstr "تسجيل الدخول إلى مسارX"
+
+#~ msgid "Register here"
+#~ msgstr "سجل هنا"
+
+#~ msgid "You haven't sent any shipments yet."
+#~ msgstr "لم ترسل أي شحنات بعد."
#~ msgid "Find Loads"
#~ msgstr "البحث عن شحنات"