From 121c77dd5f7c6da710e1437cc07a062d299ecbfc Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 26 Jan 2026 05:04:37 +0000 Subject: [PATCH] addin driver rating --- core/__pycache__/forms.cpython-311.pyc | Bin 25331 -> 26252 bytes core/__pycache__/models.cpython-311.pyc | Bin 20264 -> 23115 bytes core/__pycache__/urls.cpython-311.pyc | Bin 3711 -> 3780 bytes core/__pycache__/views.cpython-311.pyc | Bin 24075 -> 26341 bytes core/forms.py | 17 +- core/migrations/0017_driverrating.py | 32 + .../0017_driverrating.cpython-311.pyc | Bin 0 -> 2275 bytes core/models.py | 30 +- .../core/emails/password_reset_email.txt | 17 + .../core/emails/password_reset_subject.txt | 2 +- core/templates/core/profile.html | 45 +- core/templates/core/rate_driver.html | 126 +++ core/templates/core/shipper_dashboard.html | 19 +- .../__pycache__/core_tags.cpython-311.pyc | Bin 631 -> 894 bytes core/templatetags/core_tags.py | 9 +- core/urls.py | 5 +- core/views.py | 55 +- locale/ar/LC_MESSAGES/django.mo | Bin 15534 -> 23343 bytes locale/ar/LC_MESSAGES/django.po | 720 +++++++++++++----- 19 files changed, 866 insertions(+), 211 deletions(-) create mode 100644 core/migrations/0017_driverrating.py create mode 100644 core/migrations/__pycache__/0017_driverrating.cpython-311.pyc create mode 100644 core/templates/core/emails/password_reset_email.txt create mode 100644 core/templates/core/rate_driver.html diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index e6a472da42693b7b8c30ac59035d94bd5be99589..ba0c67c20b8a7f0ed753b17210b3aee6fa557c43 100644 GIT binary patch delta 3988 zcmb7HeQZu{XBOJZ>BaG#wF z4>0Obm6dKKy{M%v+JvS88U16ES83g}vR0ZpX<|z?DzT?&+J6;)bPa;PkT&i7&PzfP z3{qe0U(P-E+>dka`JH!t_fOjEH?*=VrKMg6Js;g0j*o30E30x=YGW%qa)V{vWtzk3 zXmc1vXByKt1n$^ z%g0@^l3JEqrbbK|RJHCu>hM~Y=Wn~e)bw>Ms~h#z`LFd~xb($nSE~!&#*LW8a_>kP zqLt^673d2QjJvJkV;Lcjn<6dQtXPU;nYa`NE&E?@b)br;0jvSks0Lrdstq$rtYQ_# zlks#smXJ8Dh)Zrp_cLsxhJBxCYt$xxy;h?R`IoiULR|-_2e=6=&me6rVd;nCB4Lgbi~x!P_y0xQK(dCsSjI}0|eQnYJoqfu2&Z4e-nDe z{ftBhveGI)5KF`jI^tAvmy{{V-cro6uy_UVBLWk);V^bORC8Thmv34U)cWC#%l=9$^2;h9^HmopwNe4Cyq1=^>zH!lxx~ z{VX-Ji+SsxEPa!feQ{ZlGlyM8G|Qbag+%%#gyb0z7a0Q_hK1kWirb703(HSIiVnq0 zb0j4V$x9c*GEP9Tq|TI#_DMnUlw;^9G^5TN|CW3M2Il}c539%?XV@<2q=F06KDGFm{gP4rN;e*66;S51wkR^6$l}4j|30k~QBofi+ zxMn+q6m7B3V?9jQ=PPPIblTazK7XVBtSi?>`rB`z6D8pRohgsFVlZhzO}QIT16Tss zNYE-bL2L#*OJEgkGYlzAb9yv07o)S~oicSeo)F>Acwagrg$wbj>VmyFCBe@SE~%y$9S06G9K06GER2J8o*wCt?;4#b0imk6e7 z3EJJNWW)O0_aJhu`aYyXfC70fqv+@Z7zB|zCXSsU8E84xd28%!3v>@QiG;TUhNP57 z07n5iuDc0{Nk9rP4B$g!Ph!2|J6lU`Mt}m2IfXtBo&so*1RJd=2mu zf``hK(zaabXKF8-pC~iDw)0^n=6G<*tI%8x;PZY5686J&Npc{NRkOlk!CpWi zo_&}sizA7Rly06qo$4)A-xTtdl@p}S5H zSu%@SkK_&eUWhxn7EHvHWE%0RGc=Od(EE*O^Z|`9k#7a_e_>}#(yO2~B?lX$QMyy* z123J_>psIWy!3033KQbjhu$AxLX;OIM4?2-8B0D^USS`a1As^8aUR|I{KrwBW}gid zC}cB_drG>CRC(JW9Nn7X=yvjzSfeYk^Rkof=k&FoZkOSrYp~l2%)a{~0&`|9o-)6S z0NS&LFs*QPyA927_B*>hPKVHs6sd5-vK))kV;qKV6p^OHD85Xu)@$^&AEV@=>jTd` zo%f=%+soFzxjn4&&(#^Q_8Fz*LD~J_j0ZWQDIX&4s+KPKK2Nun)Zm~`&czWjVR$$4f=T^ny3+)pN8bVImD9Z@q35c>!~d-0hn97qq)1hU))STk1`3dRsMtQXr~VIRrOYEf8*W> e$2a(>K=0q59d`LN^6Fur^U2+T{$7Dj_U!-fC|KzL delta 2902 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 E4HNZ4r2qf` diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index e6c22260cf87a6531069b22272846924208a46b5..1c7d029e53276e5715634ca035ca790c83bc1ea0 100644 GIT binary patch delta 670 zcmZY7IZpyX6bJAfVApW0pd51TB8mrI;DsPw;Mv=m5JJL=7*MmWXz5ol^Bu5o3)C-Q z;b$;}%GenTF|pV8giPa`yeWR~KT}NRC-^Lhx1wm_pi-Z;^2LqlBl`VVj<||m-B;&1 z?hd+BMgL91O#)OW!_J^?t`itScZU)Td08=L`7%6f8*? z;8!@$QOWuh&o;w*O?jv3nrvG+DMP+EK@z@kYuh+cYKsCdgYhyLFSi|!Y1@Lqks~p? L;o6EzO~7Tpd&iCg delta 619 zcmZY6OG^S#6bJCRIy2$er1_{!XROT1OnblWskIhrWkdv8C_!OhyKvJw4v%8@Wq=B$=G0Dl47Xe^k{05ZZw^WV!{*? ZrkKr+=W6?m&ArExE?d<}t2~RFegS{udjtRg diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index fdf6df421170ed360d04a0c805b967ea45ca8fb0..b0fc1292ed5f914fa0eb22ed6209ff60556947ea 100644 GIT binary patch delta 5871 zcmbtYeQX@n5#K$Z@6NIB!(Z{&CEoM*If)&|A8`_#m^d*>{1FnH0LRB=bGx=Lxew>< z+DVMVC17X(w-_FX2qjXaLZ}raTCPw8v1&ck!!4gkN(CKjoS9w;!94BQ2RtHNx0voS@vCHFP)nH(U zR0_C55&(BfZ7%rJDU|`^{z2Lj#7> zd)q92fo4DyQ>(v?tf)#tF6-rfr%h zJ|t`h=$tk#`b;N%CYMGeoJ7NQ-!QwGfoO%UW&@5g5zq}J2cZQ(GX=mMib`%r$~uHQ z5RM?A;jrWppAS||nvlenoUSh!7pj>@luDU+{SvcEOAD*RN;*s|te5noV1M+3Jf|ri zJp?L;{KLaCar0yp-oK^)Dt@c*G>qK5X7-7M_+idK9z?k@I#Y62C5xSPP*%NR;?+Z_ zf6qw50hw5lvxVN_+`Nqi;~>0)CKhT*%M=3v@32UGazG*XA?rB8{Rk%!CJ-J%c$mhW zd6^g`5@Zmab2b|IK|0%B6m2U#ZZM4?d6d54s?A~?m~frsCVI_vYXoz^ol9)U!rc5l z9O0758HE2Bq5_;nO?ntu1kf|29N{R!T7<>kKZu0yBe2wiG^*gP^StIjM+fDQ>Lv2g z5e)NG^oz1`9u^dXR&3Gn%{nIqrOj`!uh%<*A(SrVrkZqVJJGXS5ZZE zL?O@8x;2-Q0r`5(EolX46N^MD2rLsGp!@3m{8su#eQzUk|AJd@lvWF_W-AitP3sFy zrKs6QJ?k4x%N%7-M-R39Q#Xw&8z&mshmE?bL&z{67^tVHP~ide)FJ1Q;XJKvZ3PX@ z?H%-DtIPG$QYOtN64eil!z;DfU2Z>GP8^X~va2Zo#i3xA1}%K*#P zvI5tVj+01SUB5aU_b| z7+G)44Fw(0j)RKV7Y<2aUO1$XIDNAngFD;)Deq#%;0@G)M**@I035c6Kxem44zc>5 z#d<#}L_Q{VJC14)yag{rwdT_X(KHOEKpFvjXIaq{b%t0-^ zb9XoNtOf70r2HMuvrfP=(}%AT!kq{ngu4*#Mz{xoof}z&x))zrJr{9QjR2{=og)ji z){R6X0t=;OA-CD?*D|mS>L>7>$aMfgrs3{Vz5is%uo=BckC3lmwmW*UTgCGj4%bsuEjJ%}vKO^c$Bw9gTaAb{(V2fg_&1*HMvdgEg^QIMaN(1S3# z{@iDWKHwiX;l;dRJLAv5^kDS)+fEn^J_8l@<{4g3qhHmm-tZ!S5o*Jw`C0*$!>~{} zpk83)*mH!9NCQ1zSBZ6k*4Jj!$+cPZgHn589|vNV6su%h!rWcEgxSQHGick|dV1~V zQu^3hE9$7|WfJ8Yv3LJ4ojqGuvw<7pQhG&?=7N?P$^Cf>s?!9V>uX&g6<8@<@u*aK_KpqKaM zmn?D%%+EV-+=!~ymeuf_nvoLXxWl=r@i@1*v`SfvjR&`cY-$NT>MDug#z{UaV?*_M3$7D%R!vfS*Sx|@kijcYs)ah57<0x2# zf<7@MghPQ7I%LA9|X|ML!u(8D$(l}+whTMoMqddZEUuQ z@t&@k^e^jIGTadExpn9F14@lRam8X6Z|7oISZEXS?FLHHqAsSXRxP-JIe6CWmtfal0#FcbzdN zTlR(-N8U_MA++pfY}w7rTQP({KvMaVx;LmYafM$vzU0w-O_41Nd>ukLhvGcw{Wb{a?Qs&KLV`zZtG2w)8i{ xHADyR+F@9k!Nd6u;944Ia7?V8Gaz9lednG{wGt1cIYR|<0L*iw2#m^B`ft1=icJ6j delta 4230 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 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 }}? +

+
+ +
+ {% csrf_token %} + + +
+ +
+ {% for radio in form.rating %} + {{ radio.tag }} + + {% endfor %} +
+ {% if form.rating.errors %} +
+ {{ form.rating.errors }} +
+ {% endif %} +
+ + +
+ + {{ form.comment }} + {% if form.comment.errors %} +
+ {{ form.comment.errors }} +
+ {% endif %} +
+ +
+ + + {% trans "Cancel" %} + +
+
+
+
+
+
+
+ + +{% 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 fa341480481c4d47d49bf53bafe634667a53e05e..1b5ffe14b5b7c2de70d469b02476052e24e6ba8c 100644 GIT binary patch delta 532 zcmZutJ4*vW5T4n4csX+k;2K@=j`$QAwr zAL!5U2Uu9h{R6v*h=+wZdy*pRu=DLVGrQl;?1%cL=dLZw1hU%uuD6I6xv`@bMVH`$ zi#`PCAWF`B7ATGqsE&%jfMZ>gx1?Q>-=$1~qjSC9*9~3e;N-MLrBqEwIUxs0U;8xXgND1~^93Cp_Ib%5^_vH1AD(svUUFpnib?1x;3F*5hMfWYqouBETj900)~i>i_@% 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 bb0625bdd4eb4877522d459d11d9219f4f8f9487..3ae2ad199f0912cc1523be8abedda6f08154c97d 100644 GIT binary patch literal 23343 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 " "&& 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 "البحث عن شحنات"