From 59561573fcdf5f8c48acf8aa918574fc3ae58f4b Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 26 Jan 2026 12:50:14 +0000 Subject: [PATCH] Autosave: 20260126-125014 --- core/__pycache__/forms.cpython-311.pyc | Bin 26927 -> 28254 bytes core/__pycache__/urls.cpython-311.pyc | Bin 5177 -> 5419 bytes core/__pycache__/views.cpython-311.pyc | Bin 44630 -> 46435 bytes core/forms.py | 12 +- core/templates/core/article_detail.html | 2 +- core/templates/core/contact.html | 2 +- core/templates/core/edit_parcel.html | 205 +++++++++++++++++++ core/templates/core/edit_profile.html | 2 +- core/templates/core/invoice.html | 13 +- core/templates/core/parcel_label.html | 90 +++++--- core/templates/core/password_reset_form.html | 2 +- core/templates/core/privacy_policy.html | 2 +- core/templates/core/profile.html | 2 +- core/templates/core/rate_driver.html | 7 + core/templates/core/register.html | 2 +- core/templates/core/scan_qr.html | 2 +- core/templates/core/shipment_request.html | 2 +- core/templates/core/shipper_dashboard.html | 20 ++ core/templates/core/terms_conditions.html | 2 +- core/templates/core/track.html | 7 + core/templates/core/verify_otp.html | 2 +- core/templates/core/verify_registration.html | 2 +- core/urls.py | 2 + core/views.py | 34 ++- locale/ar/LC_MESSAGES/django.mo | Bin 24360 -> 25762 bytes locale/ar/LC_MESSAGES/django.po | 66 +++++- 26 files changed, 432 insertions(+), 48 deletions(-) create mode 100644 core/templates/core/edit_parcel.html diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 474c9c9b2d20980b7a8070064af8a4ae79f99754..25d2e3b3453a2a1110180643674d65b0965bed1c 100644 GIT binary patch delta 1401 zcmbV~e@t6d6vyv*uV9LOh3Yy+MrABBX1JM!=YvPflqVF}T1s2Hw?a3@++Yk1S;|@j zr_BErL(KH}hyG#0AO46zL-Z{sF45q!m~12CwYynyiW>hj*&m&mF)?QI-q%q}9GZCZ z@;&#Sd+zz(Pu`u+!Vlkr^Fv9hAZ&ECO&l-p`qa5AAe?a;ZGlPHOhz4ihmTRI5D6Jq zPn9K`aJF(Y-jwb5Q?L+iJyxteb>BnDcX=K=dJ^Ek*`7oEsLe__Le|1K8JZK|0&a;s z+A=>uUKIPt1gz7me@(u2^(BnDYQr2xE%QfUgd_q zvHvg}SYzlZ8b(j?yJup&2~ zYt6}>S-I1U#cAv?jU{O;Wy+lyIZfqsPM*%nB@Rzo4otbj+a4-CMx|Z9F}}pL;UYuo z9s~0b?I~FCwo`8)=Z$8)Q8RIfCPrvt()30%-YM#x`kfG8hw!VVjKnYWauQ#dlQ1oi z?4;5YRBAS*=4E{2z$H#H9ll5M3?~T-D@x0`139HTt8|-sKh=*=Jx%pVQ|ZnqQ&izT zO_mSSzkQl4AEp*h9hJ6IsnN8)yvW-YnwRQ$kp0=qReQCDfR9}9xq_AAq7#@dJ)kv& z8;RNIij<3)GGIz;vYTF#WblYv^w!H(Ff@m-t;3Fg2d9bpn1pup2t? z?!a9^gf|C2-?kUZxc$F`xPU(n*5e7S;?i}=m(M@&x~^T5x>>&Lc(q6tu&XOHTBde;3`-7RbH Nc4bAt0mJ_Bzi4erej-j$4#FZ#$a@=X5VqYNg+Cu{ri zsPcf+fviUV-?K>iBFF4jpl^QPF~2VF!_P6IWLOd$tr&Fj69oL{5CT& z#!U7KQ|0w6XQ*I~WGH8>VJ&i=ydgk$a%s5B%3ZJ7^s1?IiE5R^+=4*V6 zVf>r#B>6Bh+Dz6=`Oox^VX{{0HhCvTR?!a(I7kns$#ITqlM5VKH|wV@Wn?=C^2qtg zx6(6M&jOk5o82@1FfxWscFD45JU6)|D}^z5^2@9)uG1iOAi`~OZFV{1>B(QSR|3iT rIkJooH}B2SWHhY=2G9ov?BoQ|De@n|a$k^Dlrc|M%oCezn5PQ>iIS+& diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index ff037fec917711758d344642a1befccb9a5239e4..0a0ef9426c4c6def2a71c7b0c2163133353c8955 100644 GIT binary patch delta 908 zcmZ{iO-vI(6vw;t!3MCqEd{BxSU=K0fdWyQ079X$f=cV6*hnc*YFlK1KwZ8B4{$O> zJ%D2(2M;79&;$<};=vm?4_;=IxyaS4hrN4oX3AbnoXx!b?fd`cWe)qT@wiDkve_yu zbRG1qsgu&K87677`K`p0Rnx!9q-iBDyRR*U7B?&8`N z##*wIBNl(^z@I=!A+ zT+SD}H<*1BtxCfc0~7_imktn?`h^g3$aS=~$gQ*{d3`N=C?CmQTEELtTC43LT1V`+ zY5idDy%v&7jBZP5`Br4xv$OJkvyjBlr9&5iF5?ypd(c~_tE4xC><%xt`vtD!@`geU z@pqrrV^DNZ2q;FF4jpz}*<|M;MQz))6C_SwVGu)y4jlwKj5`9$2h1`4LXb3vPE#1- zI>ZUYjX^Hl{l9RJ3-?Xo--|RW#t=86rqNjNk)}I1n!%9OAxj`@#JKSQ{dBlRh4V1_ zL-`@+N2tEaEsk)0jQS|YIgg@rRo!NS^O!l^yI(`D260amLrjMlftZox#<*#?_u`~J z@R9l`{{#sn88i^8^d&-XDH{QA#0&mgJVEvlSn(Y(_o&T(EqZ=9FJMb3G2O!+xy g4gGM|iA$Vcpx;inxXyWl&9T2^yj95_Ekb|9zgYneUH||9 delta 718 zcmXw%&2JJx7>C*N+O;2aw*?{=2(|{XC2d;MCV3$<%M4 z-=FcC{Mqzs$i}5Uc{X~_rY3h%w+$2Nlb^ja#*?l7H6!OmN2b5F_F!4b=5{lstdh&` zDGs_;aneBVhgQ7p!IDxe$b0!rRnFIxX7^V43n5H=(>KPCnG&e*S&6>DM^Sih}(>NTV85<6b2ZbIjU^vrPkG^yq zRNm}2(-{0J_zC#6tNLURy|CDNLP69Tc8%$UMXsaU4(5s3-Hc(FQ(=z4oED}%xseMo z-HLWB+&9sjC*Flt27{!6L_pH6ak{YF6+BHVnFzF;7!oQZ2qd%^6Rx9=BX<4<HwHEaUh?46+I`0a?p17 z-us<X)rF!()z z`b2VlaFav>9z~K92Cql)&>QTNvRv}LdaLXb8QTw@^h<;UfQ!(L}$to&0kZ;(j$~n$KRNMkc7)77rlVo}uHMrn7#=9-#9&@^X zG+st!jPX_3*83oCATYfG0^>_FSY&ZN3s+5i=yaeehy1Kws7m6-4q#XVLI41Y8emtK z{bGE8ng{BY7w2%~7sfBoCcmlEmxq(cNp@nDn61O?1VIappf`t8{6}<9&0lRGDkQ_oV8!WL=YaU z0;fh?pp$()H=Ui`m;=RJ-RL5Am53`$@F_KoyUAE~r%@njD&KU%Oq}dPc@4=@ZOWM> z@)SGYdXwa+N89cvk$!bgWDIG~fP4wPtWcMkR^bB3MZ(e|OSG<8l4Vc5L?@$))LX;MUW6)MR2jpyYfk+`sc1*?qO3N+>=TC>c@L7>B$t<`R^BaL}NK_Rc1hUD;b`mob_4Mf-8-+bq3zItiRA^YOLp547MikJ>1_0bM!yATwEI)k{QrAGJ ze4EXmmtnnbvTohdGv;$sPSljc@@AB@zn>Ph6~$~taa&P`p`W+yDCsQOwxDalkWN3w z)o-!ysOYTN=I(NLxCbob;+Ba$tB!f1dF8RG74fMRF-v9KQW>>W4mdJ;+%ZR9+>sZx zZs4YKc%a7agI}G3Qsom3}8HFEJUtAfTT@6o+H`T=Xny8_M*`Wgq zuz|)y1Ht!b!^<^kGM&s0KQ{&1DSK?7#A^t1b)zm}j_rh|c-RMKtq<~w?M#?pCk}RJ z>4bLR*7P{HQ=i}#NCqPQi`{pihBjf8(_u&dFsqM9)tbPS{4e$(m}2YEmue7KBWP!` z#wJn*m&%iDj@)%4JX(hr9O)Fg6_{*5Cf`6N+n-=^z-;eI>E3*dL?>0o1b19;$IMl6 zb5&G(t~)1p7`v?f=9C?LC%?_wW$my+MBMD`Nk5ho&0P|kR2H997BiQ}&E-*Z`M12I z+a2SDI4?vE0(}un^(XA!M!4aF1#&}>Dx!M&*jjD|9wG^w$5-GFiXMNR$5-bG`Dh`2 zs&@D-MLXvU(pjjgW^+%>Z;zw+J;FT%yp!qA2-?;98%ikkp>!t+QEV{cA)3PO?Es}o? zToqGz)A|5C)}qO>6)QtTl*@X{|yEsgaNf-v0=JHz$+d{oix{ z=bSq?cV_1OQ`7$7=jG+4KJ{E$dDwpM=!syMPJUUH*Yw_{dwq#Ixu^})Q$iY>Kh|iH z?={5evJ7t%L{q%5;|-o`oK3O=zx0+s}Ia#rNf-0`6g5nx*T_HhYUbzoc{e;NR zh-l)58VY2Jn`(44g?M~e>{O%pm4}+UX@;ko*Ke3d;5UVWZrZMGIbs$OFG*J_j%SmX zS13(eZt9WiHaEO}OTPr~B-bTlr3*@SlbT-P?qu)dmG6@;(p~vyGT^V6hW8+FNI`9I znzdc`^hHD#CGB4Cr@y(bB}VsUTg$rvO7N97Gxh+>4*@TA7|Mq>Q&97=wY`YwAMWbN z(JcSi(L!Z%Rp;^I4Z89)iuYj}0RqVRpJMP8@f~9)mGNsm?ZuDme5z-8=&7Fn*}mnd$jK(3h}c3I4zNN{bx&PDgWYh(h9lJ9S_hl{v$U-QTfB$cLH=( zUKoCc8p3K<18nhh8NLwNfPq~wGTx&3u6`8@TD=HBya;>*q z5#ivm7}dzN$G$6}F#q*|Nn5yMq?RiA!;y8=E64@D z`Qd0arDZke{g3a;#jzL2mcNfpXta{Q{^UV;KsgJctZnuWWmD83fNbvE~2VU{Ey++NSK63FDvfqJg zAJmhI5ssdzp(AqlnZtg6qE86nu0^*N?I SKi(Ax`Bu|rTJR`#srbLfI!WjN diff --git a/core/forms.py b/core/forms.py index 255ed32..86188ba 100644 --- a/core/forms.py +++ b/core/forms.py @@ -254,9 +254,9 @@ class ParcelForm(forms.ModelForm): self.fields['receiver_phone_code'].queryset = Country.objects.exclude(phone_code='').order_by(name_field) self.fields['receiver_phone_code'].label_from_instance = lambda obj: f"{obj.phone_code} ({obj.name})" - # Default Country logic + # Default Country logic (Oman) - Only if not editing oman = Country.objects.filter(name_en='Oman').first() - if oman: + if not self.instance.pk and oman: self.fields['receiver_phone_code'].initial = oman self.fields['pickup_country'].initial = oman self.fields['delivery_country'].initial = oman @@ -283,6 +283,8 @@ class ParcelForm(forms.ModelForm): self.fields['pickup_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by(name_field) except (ValueError, TypeError): pass + elif self.instance.pk and self.instance.pickup_country: + self.fields['pickup_governate'].queryset = Governate.objects.filter(country=self.instance.pickup_country).order_by(name_field) elif oman: self.fields['pickup_governate'].queryset = Governate.objects.filter(country=oman).order_by(name_field) @@ -292,6 +294,8 @@ class ParcelForm(forms.ModelForm): self.fields['pickup_city'].queryset = City.objects.filter(governate_id=gov_id).order_by(name_field) except (ValueError, TypeError): pass + elif self.instance.pk and self.instance.pickup_governate: + self.fields['pickup_city'].queryset = City.objects.filter(governate_id=self.instance.pickup_governate.id).order_by(name_field) # Delivery self.fields['delivery_governate'].queryset = Governate.objects.none() @@ -303,6 +307,8 @@ class ParcelForm(forms.ModelForm): self.fields['delivery_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by(name_field) except (ValueError, TypeError): pass + elif self.instance.pk and self.instance.delivery_country: + self.fields['delivery_governate'].queryset = Governate.objects.filter(country=self.instance.delivery_country).order_by(name_field) elif oman: self.fields['delivery_governate'].queryset = Governate.objects.filter(country=oman).order_by(name_field) @@ -312,6 +318,8 @@ class ParcelForm(forms.ModelForm): self.fields['delivery_city'].queryset = City.objects.filter(governate_id=gov_id).order_by(name_field) except (ValueError, TypeError): pass + elif self.instance.pk and self.instance.delivery_governate: + self.fields['delivery_city'].queryset = City.objects.filter(governate_id=self.instance.delivery_governate.id).order_by(name_field) def clean(self): cleaned_data = super().clean() diff --git a/core/templates/core/article_detail.html b/core/templates/core/article_detail.html index 6cd5e69..2a400ab 100644 --- a/core/templates/core/article_detail.html +++ b/core/templates/core/article_detail.html @@ -7,7 +7,7 @@

{{ article.title }}

diff --git a/core/templates/core/contact.html b/core/templates/core/contact.html index 578976a..45fbd76 100644 --- a/core/templates/core/contact.html +++ b/core/templates/core/contact.html @@ -11,7 +11,7 @@ diff --git a/core/templates/core/edit_parcel.html b/core/templates/core/edit_parcel.html new file mode 100644 index 0000000..34f66d9 --- /dev/null +++ b/core/templates/core/edit_parcel.html @@ -0,0 +1,205 @@ +{% extends 'base.html' %} +{% load static %} +{% load i18n %} + +{% block content %} +
+
+
+ + + +
+
+

{% trans "Edit Shipment" %}

+ {{ parcel.tracking_number }} +
+ +
+ {% csrf_token %} +
+ +
+ + {{ form.description }} + {% if form.description.errors %} +
{{ form.description.errors }}
+ {% endif %} +
+
+ + {{ form.weight }} + {% if form.weight.errors %} +
{{ form.weight.errors }}
+ {% endif %} +
+
+ + {{ form.price }} + {% if form.price.errors %} +
{{ form.price.errors }}
+ {% endif %} +
+ + +
+

{% trans "Pickup Details" %}

+
+
+ + {{ form.pickup_country }} + {% if form.pickup_country.errors %} +
{{ form.pickup_country.errors }}
+ {% endif %} +
+
+ + {{ form.pickup_governate }} + {% if form.pickup_governate.errors %} +
{{ form.pickup_governate.errors }}
+ {% endif %} +
+
+ + {{ form.pickup_city }} + {% if form.pickup_city.errors %} +
{{ form.pickup_city.errors }}
+ {% endif %} +
+
+ + {{ form.pickup_address }} + {% if form.pickup_address.errors %} +
{{ form.pickup_address.errors }}
+ {% endif %} +
+ + +
+

{% trans "Delivery Details" %}

+
+
+ + {{ form.delivery_country }} + {% if form.delivery_country.errors %} +
{{ form.delivery_country.errors }}
+ {% endif %} +
+
+ + {{ form.delivery_governate }} + {% if form.delivery_governate.errors %} +
{{ form.delivery_governate.errors }}
+ {% endif %} +
+
+ + {{ form.delivery_city }} + {% if form.delivery_city.errors %} +
{{ form.delivery_city.errors }}
+ {% endif %} +
+
+ + {{ form.delivery_address }} + {% if form.delivery_address.errors %} +
{{ form.delivery_address.errors }}
+ {% endif %} +
+ + +
+

{% trans "Receiver Details" %}

+
+
+ + {{ form.receiver_name }} + {% if form.receiver_name.errors %} +
{{ form.receiver_name.errors }}
+ {% endif %} +
+
+ +
+
+ {{ form.receiver_phone_code }} +
+
+ {{ form.receiver_phone }} +
+
+ {% if form.receiver_phone_code.errors %} +
{{ form.receiver_phone_code.errors }}
+ {% endif %} + {% if form.receiver_phone.errors %} +
{{ form.receiver_phone.errors }}
+ {% endif %} +
+ +
+ {% trans "Cancel" %} + +
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/edit_profile.html b/core/templates/core/edit_profile.html index 0037256..d7135cc 100644 --- a/core/templates/core/edit_profile.html +++ b/core/templates/core/edit_profile.html @@ -11,7 +11,7 @@ diff --git a/core/templates/core/invoice.html b/core/templates/core/invoice.html index b79ab24..236a659 100644 --- a/core/templates/core/invoice.html +++ b/core/templates/core/invoice.html @@ -4,14 +4,15 @@ - Invoice {{ parcel.tracking_number }} + {% trans "Invoice" %} {{ parcel.tracking_number }} @@ -225,4 +230,4 @@
- + \ No newline at end of file diff --git a/core/templates/core/parcel_label.html b/core/templates/core/parcel_label.html index 40a0982..efaff35 100644 --- a/core/templates/core/parcel_label.html +++ b/core/templates/core/parcel_label.html @@ -3,109 +3,147 @@ - Label {{ parcel.tracking_number }} + {% trans "Label" %} {{ parcel.tracking_number }} diff --git a/core/templates/core/password_reset_form.html b/core/templates/core/password_reset_form.html index beb531f..0b19459 100644 --- a/core/templates/core/password_reset_form.html +++ b/core/templates/core/password_reset_form.html @@ -36,7 +36,7 @@ diff --git a/core/templates/core/privacy_policy.html b/core/templates/core/privacy_policy.html index 0d8fad5..3a1921d 100644 --- a/core/templates/core/privacy_policy.html +++ b/core/templates/core/privacy_policy.html @@ -5,7 +5,7 @@

{% trans "Privacy Policy" %}

diff --git a/core/templates/core/profile.html b/core/templates/core/profile.html index e836d7a..5bcb89e 100644 --- a/core/templates/core/profile.html +++ b/core/templates/core/profile.html @@ -11,7 +11,7 @@ diff --git a/core/templates/core/rate_driver.html b/core/templates/core/rate_driver.html index bcee138..2591107 100644 --- a/core/templates/core/rate_driver.html +++ b/core/templates/core/rate_driver.html @@ -5,6 +5,13 @@
+ + +
diff --git a/core/templates/core/register.html b/core/templates/core/register.html index b8a9a96..1904d83 100644 --- a/core/templates/core/register.html +++ b/core/templates/core/register.html @@ -11,7 +11,7 @@ diff --git a/core/templates/core/scan_qr.html b/core/templates/core/scan_qr.html index dcd8f93..ebf49b2 100644 --- a/core/templates/core/scan_qr.html +++ b/core/templates/core/scan_qr.html @@ -25,7 +25,7 @@ diff --git a/core/templates/core/shipment_request.html b/core/templates/core/shipment_request.html index 93884bd..8c50555 100644 --- a/core/templates/core/shipment_request.html +++ b/core/templates/core/shipment_request.html @@ -9,7 +9,7 @@ diff --git a/core/templates/core/shipper_dashboard.html b/core/templates/core/shipper_dashboard.html index fbcaf70..f7a87a5 100644 --- a/core/templates/core/shipper_dashboard.html +++ b/core/templates/core/shipper_dashboard.html @@ -61,6 +61,17 @@
+ {% if parcel.status == 'pending' %} + + {% endif %} + {% if parcel.payment_status == 'pending' %} {% if payments_enabled %} @@ -126,6 +137,15 @@
+ {% if parcel.status == 'pending' %} + + + + + + + {% endif %} + diff --git a/core/templates/core/terms_conditions.html b/core/templates/core/terms_conditions.html index a8545cb..58ce6cf 100644 --- a/core/templates/core/terms_conditions.html +++ b/core/templates/core/terms_conditions.html @@ -5,7 +5,7 @@

{% trans "Terms and Conditions" %}

diff --git a/core/templates/core/track.html b/core/templates/core/track.html index 0dcae19..b791efa 100644 --- a/core/templates/core/track.html +++ b/core/templates/core/track.html @@ -7,6 +7,13 @@
+ + +

{% trans "Track Your Shipment" %}

diff --git a/core/templates/core/verify_otp.html b/core/templates/core/verify_otp.html index 71d3309..2b70ea5 100644 --- a/core/templates/core/verify_otp.html +++ b/core/templates/core/verify_otp.html @@ -11,7 +11,7 @@ diff --git a/core/templates/core/verify_registration.html b/core/templates/core/verify_registration.html index c35a57b..8dc9648 100644 --- a/core/templates/core/verify_registration.html +++ b/core/templates/core/verify_registration.html @@ -11,7 +11,7 @@ diff --git a/core/urls.py b/core/urls.py index 1a0424f..0286564 100644 --- a/core/urls.py +++ b/core/urls.py @@ -34,6 +34,8 @@ urlpatterns = [ path('dashboard/', views.dashboard, name='dashboard'), path('scan-qr/', views.scan_qr_view, name='scan_qr'), path('shipment-request/', views.shipment_request, name='shipment_request'), + path('parcel//edit/', views.edit_parcel, name='edit_parcel'), + path('parcel//cancel/', views.cancel_parcel, name='cancel_parcel'), path('track/', views.track_parcel, name='track'), path('accept-parcel//', views.accept_parcel, name='accept_parcel'), path('update-status//', views.update_status, name='update_status'), diff --git a/core/views.py b/core/views.py index a33f5c2..7006de7 100644 --- a/core/views.py +++ b/core/views.py @@ -848,4 +848,36 @@ def update_parcel_status_ajax(request): return JsonResponse({'success': True}) except Exception as e: - return JsonResponse({'success': False, 'error': str(e)}) \ No newline at end of file + return JsonResponse({'success': False, 'error': str(e)}) + +@login_required +def edit_parcel(request, parcel_id): + parcel = get_object_or_404(Parcel, id=parcel_id, shipper=request.user) + + if parcel.status != 'pending': + messages.error(request, _("You can only edit pending shipments.")) + return redirect('dashboard') + + if request.method == 'POST': + form = ParcelForm(request.POST, instance=parcel) + if form.is_valid(): + form.save() + messages.success(request, _("Shipment updated successfully.")) + return redirect('dashboard') + else: + form = ParcelForm(instance=parcel) + + return render(request, 'core/edit_parcel.html', {'form': form, 'parcel': parcel}) + +@login_required +def cancel_parcel(request, parcel_id): + parcel = get_object_or_404(Parcel, id=parcel_id, shipper=request.user) + + if parcel.status != 'pending': + messages.error(request, _("You can only cancel pending shipments.")) + else: + parcel.status = 'cancelled' + parcel.save() + messages.success(request, _("Shipment cancelled successfully.")) + + return redirect('dashboard') diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index 84a3de1f4cb9ecac7d408f1329a68630c1583ab3..143d59f733b24a9ad1b3f8ab1e0064ad979ef53b 100644 GIT binary patch delta 8057 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 diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index ec3afaf..c84ef06 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -772,7 +772,8 @@ msgstr "مرحباً،" msgid "" "You are receiving this email because you requested a password reset for your " "account at" -msgstr "تتلقى هذه الرسالة لأنك طلبت إعادة تعيين كلمة المرور لحسابك في" +msgstr "" +"تتلقى هذه الرسالة لأنك طلبت إعادة تعيين كلمة المرور لحسابك في" #: core/templates/core/emails/password_reset_email.html:11 msgid "Please click the button below to choose a new password:" @@ -879,7 +880,8 @@ msgstr "أدرج طردك" #: core/templates/core/index.html:64 msgid "" "Enter shipment details, weight, and delivery addresses. It's quick and easy." -msgstr "أدخل تفاصيل الشحنة والوزن وعناوين التوصيل. إنه سريع وسهل." +msgstr "" +"أدخل تفاصيل الشحنة والوزن وعناوين التوصيل. إنه سريع وسهل." #: core/templates/core/index.html:72 msgid "Connect with Driver" @@ -888,7 +890,8 @@ msgstr "تواصل مع السائق" #: core/templates/core/index.html:73 msgid "" "A verified car owner near you picks up the parcel and starts the journey." -msgstr "يقوم صاحب سيارة تم التحقق منه بالقرب منك باستلام الطرد وبدء الرحلة." +msgstr "" +"يقوم صاحب سيارة تم التحقق منه بالقرب منك باستلام الطرد وبدء الرحلة." #: core/templates/core/index.html:81 msgid "Secure Delivery" @@ -1330,3 +1333,60 @@ msgstr "لا توجد شحنات بعد. ابدأ الشحن الآن!" msgid "Shipments" msgstr "شحنات" + +msgid "Track Shipment" +msgstr "تتبع الشحنة" + +msgid "Track Your Shipment" +msgstr "تتبع شحنتك" + +msgid "Enter Tracking ID (e.g. TRK123456789)" +msgstr "أدخل رقم التتبع (مثال: TRK123456789)" + +msgid "Shipment Status" +msgstr "حالة الشحنة" + +msgid "Order Placed" +msgstr "تم الطلب" + +msgid "On the Way" +msgstr "في الطريق" + +msgid "Current Status" +msgstr "الحالة الحالية" + +msgid "Last Updated" +msgstr "آخر تحديث" + +msgid "Enter your tracking number above to see shipment details." +msgstr "أدخل رقم التتبع أعلاه لرؤية تفاصيل الشحنة." + +msgid "Label" +msgstr "الملصق" + +msgid "Invoice" +msgstr "الفاتورة" + +msgid "Edit" +msgstr "تعديل" + +msgid "Edit Shipment" +msgstr "تعديل الشحنة" + +msgid "Cancel Shipment" +msgstr "إلغاء الشحنة" + +msgid "Print Label" +msgstr "طباعة الملصق" + +msgid "Are you sure you want to cancel this shipment?" +msgstr "هل أنت متأكد أنك تريد إلغاء هذه الشحنة؟" + +msgid "Point your camera at the Parcel Label QR Code" +msgstr "وجه الكاميرا نحو رمز الاستجابة السريعة (QR) الخاص بالملصق" + +msgid "Scan QR Code" +msgstr "مسح رمز الاستجابة السريعة" + +msgid "Tracking No" +msgstr "رقم التتبع"