adding thwani gateway

This commit is contained in:
Flatlogic Bot 2026-01-25 07:26:38 +00:00
parent f69cb03bdb
commit 0e850fd80b
19 changed files with 579 additions and 111 deletions

View File

@ -189,3 +189,5 @@ if EMAIL_USE_SSL:
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
LOGIN_REDIRECT_URL = 'dashboard'
LOGOUT_REDIRECT_URL = 'index'

View File

@ -1,7 +1,7 @@
from django import forms from django import forms
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from .models import Profile from .models import Profile, Parcel
class UserRegistrationForm(forms.ModelForm): class UserRegistrationForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput, label=_("Password")) password = forms.CharField(widget=forms.PasswordInput, label=_("Password"))
@ -36,4 +36,25 @@ class UserRegistrationForm(forms.ModelForm):
role=self.cleaned_data['role'], role=self.cleaned_data['role'],
phone_number=self.cleaned_data['phone_number'] phone_number=self.cleaned_data['phone_number']
) )
return user return user
class ParcelForm(forms.ModelForm):
class Meta:
model = Parcel
fields = ['description', 'weight', 'pickup_address', 'delivery_address', 'receiver_name', 'receiver_phone']
widgets = {
'description': forms.Textarea(attrs={'rows': 3, 'class': 'form-control', 'placeholder': _('What are you sending?')}),
'weight': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}),
'pickup_address': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('123 Street, City')}),
'delivery_address': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('456 Avenue, City')}),
'receiver_name': forms.TextInput(attrs={'class': 'form-control'}),
'receiver_phone': forms.TextInput(attrs={'class': 'form-control'}),
}
labels = {
'description': _('Package Description'),
'weight': _('Weight (kg)'),
'pickup_address': _('Pickup Address'),
'delivery_address': _('Delivery Address'),
'receiver_name': _('Receiver Name'),
'receiver_phone': _('Receiver Phone'),
}

View File

@ -1,4 +1,4 @@
{% load i18n static %} {% load i18n static i18n_urls %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
{% get_language_info for LANGUAGE_CODE as lang %} {% get_language_info for LANGUAGE_CODE as lang %}
<!DOCTYPE html> <!DOCTYPE html>
@ -39,6 +39,10 @@
margin-left: auto !important; margin-left: auto !important;
margin-right: 0 !important; margin-right: 0 !important;
} }
.dropdown-menu-end {
left: 0 !important;
right: auto !important;
}
</style> </style>
{% endif %} {% endif %}
@ -58,6 +62,9 @@
<a class="nav-link px-3" href="{% url 'index' %}#how-it-works">{% trans "How it Works" %}</a> <a class="nav-link px-3" href="{% url 'index' %}#how-it-works">{% trans "How it Works" %}</a>
</li> </li>
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li class="nav-item">
<a class="nav-link px-3" href="{% url 'dashboard' %}">{% trans "Dashboard" %}</a>
</li>
<li class="nav-item"> <li class="nav-item">
<span class="nav-link text-white-50">{% trans "Hello" %}, {{ user.username }}</span> <span class="nav-link text-white-50">{% trans "Hello" %}, {{ user.username }}</span>
</li> </li>
@ -84,9 +91,10 @@
{% get_available_languages as LANGUAGES %} {% get_available_languages as LANGUAGES %}
{% for lang_code, lang_name in LANGUAGES %} {% for lang_code, lang_name in LANGUAGES %}
<li> <li>
{% translate_url lang_code as the_redirect_url %}
<form action="{% url 'set_language' %}" method="post"> <form action="{% url 'set_language' %}" method="post">
{% csrf_token %} {% csrf_token %}
<input name="next" type="hidden" value="{{ request.path }}"> <input name="next" type="hidden" value="{{ the_redirect_url|default:'/' }}">
<input name="language" type="hidden" value="{{ lang_code }}"> <input name="language" type="hidden" value="{{ lang_code }}">
<button type="submit" class="dropdown-item {% if LANGUAGE_CODE == lang_code %}active{% endif %}"> <button type="submit" class="dropdown-item {% if LANGUAGE_CODE == lang_code %}active{% endif %}">
{{ lang_name }} {{ lang_name }}
@ -98,13 +106,28 @@
</li> </li>
<li class="nav-item ms-lg-3"> <li class="nav-item ms-lg-3">
<a href="{% url 'shipment_request' %}" class="btn btn-masarx-primary btn-sm">{% trans "Start Shipping" %}</a> {% if user.is_authenticated and user.profile.role == 'car_owner' %}
<a href="{% url 'dashboard' %}" class="btn btn-masarx-primary btn-sm">{% trans "Find Loads" %}</a>
{% else %}
<a href="{% url 'shipment_request' %}" class="btn btn-masarx-primary btn-sm">{% trans "Start Shipping" %}</a>
{% endif %}
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<div class="container mt-3">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
{% endif %}
</div>
<main> <main>
{% block content %}{% endblock %} {% block content %}{% endblock %}
</main> </main>
@ -118,4 +141,4 @@
<!-- Bootstrap Bundle with Popper --> <!-- Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,82 @@
{% extends 'base.html' %}
{% load i18n %}
{% block content %}
<div class="container py-5">
<h1 class="mb-4">{% trans "Driver Dashboard" %}</h1>
<ul class="nav nav-pills mb-4" id="pills-tab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="pills-available-tab" data-bs-toggle="pill" data-bs-target="#pills-available" type="button" role="tab">{% trans "Available Shipments" %}</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="pills-my-tab" data-bs-toggle="pill" data-bs-target="#pills-my" type="button" role="tab">{% trans "My Deliveries" %}</button>
</li>
</ul>
<div class="tab-content" id="pills-tabContent">
<!-- Available Shipments -->
<div class="tab-pane fade show active" id="pills-available" role="tabpanel">
{% if available_parcels %}
<div class="row g-4">
{% for parcel in available_parcels %}
<div class="col-md-6 col-lg-4">
<div class="card border-0 shadow-sm h-100" style="border-radius: 15px;">
<div class="card-body">
<h5 class="card-title">{{ parcel.description|truncatechars:30 }}</h5>
<p class="card-text mb-1 small"><strong>{% trans "Pickup" %}:</strong> {{ parcel.pickup_address }}</p>
<p class="card-text mb-3 small"><strong>{% trans "Delivery" %}:</strong> {{ parcel.delivery_address }}</p>
<p class="card-text mb-3 small text-muted"><strong>{% trans "Weight" %}:</strong> {{ parcel.weight }} kg</p>
<form action="{% url 'accept_parcel' parcel.id %}" method="POST">
{% csrf_token %}
<button type="submit" class="btn btn-masarx-primary w-100">{% trans "Accept Shipment" %}</button>
</form>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="text-center py-5">{% trans "No shipments available at the moment." %}</p>
{% endif %}
</div>
<!-- My Deliveries -->
<div class="tab-pane fade" id="pills-my" role="tabpanel">
{% if my_parcels %}
<div class="row g-4">
{% for parcel in my_parcels %}
<div class="col-md-6 col-lg-4">
<div class="card border-0 shadow-sm h-100" style="border-radius: 15px;">
<div class="card-body">
<div class="d-flex justify-content-between mb-2">
<span class="badge bg-light text-dark">#{{ parcel.tracking_number }}</span>
<span class="badge bg-primary">{{ parcel.get_status_display }}</span>
</div>
<h5 class="card-title">{{ parcel.description|truncatechars:30 }}</h5>
<p class="card-text mb-1 small"><strong>{% trans "To" %}:</strong> {{ parcel.delivery_address }}</p>
<p class="card-text mb-3 small"><strong>{% trans "Receiver" %}:</strong> {{ parcel.receiver_name }}</p>
<form action="{% url 'update_status' parcel.id %}" method="POST" class="d-flex gap-2">
{% csrf_token %}
<select name="status" class="form-select form-select-sm">
{% for code, label in parcel.STATUS_CHOICES %}
{% if code != 'pending' and code != 'cancelled' %}
<option value="{{ code }}" {% if parcel.status == code %}selected{% endif %}>{{ label }}</option>
{% endif %}
{% endfor %}
</select>
<button type="submit" class="btn btn-sm btn-outline-primary">{% trans "Update" %}</button>
</form>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="text-center py-5">{% trans "You haven't accepted any shipments yet." %}</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}

View File

@ -1,37 +1,27 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %} {% load static %}
{% load i18n %}
{% block content %} {% block content %}
<div class="container py-5"> <div class="container py-5">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-8"> <div class="col-md-8">
<div class="card border-0 shadow-sm p-4" style="border-radius: 20px;"> <div class="card border-0 shadow-sm p-4" style="border-radius: 20px;">
<h2 class="mb-4">Request a Shipment</h2> <h2 class="mb-4">{% trans "Request a Shipment" %}</h2>
<form method="POST"> <form method="POST">
{% csrf_token %} {% csrf_token %}
<div class="row g-3"> <div class="row g-3">
<div class="col-md-6"> {% for field in form %}
<label class="form-label">Pickup Address</label> <div class="{% if field.name == 'description' %}col-12{% else %}col-md-6{% endif %}">
<input type="text" class="form-control" placeholder="123 Street, City" required> <label class="form-label">{{ field.label }}</label>
{{ field }}
{% if field.errors %}
<div class="text-danger small">{{ field.errors }}</div>
{% endif %}
</div> </div>
<div class="col-md-6"> {% endfor %}
<label class="form-label">Delivery Address</label> <div class="col-12 mt-4">
<input type="text" class="form-control" placeholder="456 Avenue, City" required> <button type="submit" class="btn btn-masarx-primary w-100 py-3">{% trans "Submit Request" %}</button>
</div>
<div class="col-12">
<label class="form-label">Package Description</label>
<textarea class="form-control" rows="3" placeholder="What are you sending?"></textarea>
</div>
<div class="col-md-4">
<label class="form-label">Weight (kg)</label>
<input type="number" step="0.1" class="form-control" required>
</div>
<div class="col-md-8">
<label class="form-label">Receiver Name</label>
<input type="text" class="form-control" required>
</div>
<div class="col-12">
<button type="submit" class="btn btn-masarx-primary w-100">Submit Request</button>
</div> </div>
</div> </div>
</form> </form>
@ -39,4 +29,4 @@
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -0,0 +1,41 @@
{% extends 'base.html' %}
{% load i18n %}
{% block content %}
<div class="container py-5">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1>{% trans "My Shipments" %}</h1>
<a href="{% url 'shipment_request' %}" class="btn btn-masarx-primary">{% trans "New Shipment" %}</a>
</div>
{% if parcels %}
<div class="row g-4">
{% for parcel in parcels %}
<div class="col-md-6 col-lg-4">
<div class="card border-0 shadow-sm h-100" style="border-radius: 15px;">
<div class="card-body">
<div class="d-flex justify-content-between mb-2">
<span class="badge bg-light text-dark">#{{ parcel.tracking_number }}</span>
<span class="badge {% if parcel.status == 'delivered' %}bg-success{% elif parcel.status == 'cancelled' %}bg-danger{% else %}bg-warning{% endif %}">
{{ parcel.get_status_display }}
</span>
</div>
<h5 class="card-title">{{ parcel.description|truncatechars:30 }}</h5>
<p class="card-text mb-1 small text-muted"><i class="fas fa-map-marker-alt"></i> <strong>{% trans "From" %}:</strong> {{ parcel.pickup_address }}</p>
<p class="card-text mb-3 small text-muted"><i class="fas fa-flag-checkered"></i> <strong>{% trans "To" %}:</strong> {{ parcel.delivery_address }}</p>
<hr>
<p class="card-text small mb-0"><strong>{% trans "Receiver" %}:</strong> {{ parcel.receiver_name }}</p>
<p class="card-text small"><strong>{% trans "Carrier" %}:</strong> {% if parcel.carrier %}{{ parcel.carrier.get_full_name|default:parcel.carrier.username }}{% else %}{% trans "Waiting for pickup" %}{% endif %}</p>
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="text-center py-5">
<p class="lead">{% trans "You haven't sent any shipments yet." %}</p>
<a href="{% url 'shipment_request' %}" class="btn btn-masarx-primary">{% trans "Send your first shipment" %}</a>
</div>
{% endif %}
</div>
{% endblock %}

View File

Binary file not shown.

View File

@ -0,0 +1,12 @@
from django import template
from django.urls import translate_url as django_translate_url
register = template.Library()
@register.simple_tag(takes_context=True)
def translate_url(context, lang_code):
request = context.get('request')
if not request:
return ''
path = request.get_full_path()
return django_translate_url(path, lang_code)

View File

@ -7,6 +7,9 @@ urlpatterns = [
path('register/', views.register, name='register'), path('register/', views.register, name='register'),
path('login/', auth_views.LoginView.as_view(template_name='core/login.html'), name='login'), path('login/', auth_views.LoginView.as_view(template_name='core/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(next_page='index'), name='logout'), path('logout/', auth_views.LogoutView.as_view(next_page='index'), name='logout'),
path('dashboard/', views.dashboard, name='dashboard'),
path('shipment-request/', views.shipment_request, name='shipment_request'), path('shipment-request/', views.shipment_request, name='shipment_request'),
path('article-detail/', views.article_detail, name='article_detail'), path('accept-parcel/<int:parcel_id>/', views.accept_parcel, name='accept_parcel'),
] path('update-status/<int:parcel_id>/', views.update_status, name='update_status'),
path('article/', views.article_detail, name='article_detail'),
]

View File

@ -1,10 +1,11 @@
from django.shortcuts import render, redirect from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import login, authenticate from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from .models import Parcel, Profile from .models import Parcel, Profile
from .forms import UserRegistrationForm from .forms import UserRegistrationForm, ParcelForm
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.contrib import messages
def index(request): def index(request):
tracking_id = request.GET.get('tracking_id') tracking_id = request.GET.get('tracking_id')
@ -28,17 +29,67 @@ def register(request):
if form.is_valid(): if form.is_valid():
user = form.save() user = form.save()
login(request, user) login(request, user)
return redirect('index') return redirect('dashboard')
else: else:
form = UserRegistrationForm() form = UserRegistrationForm()
return render(request, 'core/register.html', {'form': form}) return render(request, 'core/register.html', {'form': form})
@login_required
def dashboard(request):
profile = request.user.profile
if profile.role == 'shipper':
parcels = Parcel.objects.filter(shipper=request.user).order_by('-created_at')
return render(request, 'core/shipper_dashboard.html', {'parcels': parcels})
else:
# Car Owner view
available_parcels = Parcel.objects.filter(status='pending').order_by('-created_at')
my_parcels = Parcel.objects.filter(carrier=request.user).exclude(status='delivered').order_by('-created_at')
return render(request, 'core/driver_dashboard.html', {
'available_parcels': available_parcels,
'my_parcels': my_parcels
})
@login_required @login_required
def shipment_request(request): def shipment_request(request):
if request.user.profile.role != 'shipper':
messages.error(request, _("Only shippers can request shipments."))
return redirect('dashboard')
if request.method == 'POST': if request.method == 'POST':
# Logic for creating shipment will go here form = ParcelForm(request.POST)
pass if form.is_valid():
return render(request, 'core/shipment_request.html') parcel = form.save(commit=False)
parcel.shipper = request.user
parcel.save()
messages.success(request, _("Shipment requested successfully! Tracking ID: ") + parcel.tracking_number)
return redirect('dashboard')
else:
form = ParcelForm()
return render(request, 'core/shipment_request.html', {'form': form})
@login_required
def accept_parcel(request, parcel_id):
if request.user.profile.role != 'car_owner':
messages.error(request, _("Only car owners can accept shipments."))
return redirect('dashboard')
parcel = get_object_or_404(Parcel, id=parcel_id, status='pending')
parcel.carrier = request.user
parcel.status = 'picked_up'
parcel.save()
messages.success(request, _("You have accepted the shipment!"))
return redirect('dashboard')
@login_required
def update_status(request, parcel_id):
parcel = get_object_or_404(Parcel, id=parcel_id, carrier=request.user)
if request.method == 'POST':
new_status = request.POST.get('status')
if new_status in dict(Parcel.STATUS_CHOICES):
parcel.status = new_status
parcel.save()
messages.success(request, _("Status updated successfully!"))
return redirect('dashboard')
def article_detail(request): def article_detail(request):
return render(request, 'core/article_detail.html') return render(request, 'core/article_detail.html')

Binary file not shown.

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-25 07:13+0000\n" "POT-Creation-Date: 2026-01-25 07:25+0000\n"
"PO-Revision-Date: 2026-01-25 07:13+0000\n" "PO-Revision-Date: 2026-01-25 07:13+0000\n"
"Last-Translator: Gemini\n" "Last-Translator: Gemini\n"
"Language-Team: Arabic\n" "Language-Team: Arabic\n"
@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "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" "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: core/forms.py:7 #: core/forms.py:7
msgid "Password" msgid "Password"
@ -54,6 +54,42 @@ msgstr "اسم العائلة"
msgid "Passwords don't match" msgid "Passwords don't match"
msgstr "كلمات المرور غير متطابقة" msgstr "كلمات المرور غير متطابقة"
#: core/forms.py:46
msgid "What are you sending?"
msgstr "ماذا سترسل؟"
#: core/forms.py:48
msgid "123 Street, City"
msgstr "123 شارع، مدينة"
#: core/forms.py:49
msgid "456 Avenue, City"
msgstr "456 جادة، مدينة"
#: core/forms.py:54
msgid "Package Description"
msgstr "وصف الطرد"
#: core/forms.py:55 core/models.py:36
msgid "Weight (kg)"
msgstr "الوزن (كجم)"
#: core/forms.py:56 core/models.py:38
msgid "Pickup Address"
msgstr "عنوان الاستلام"
#: core/forms.py:57 core/models.py:39
msgid "Delivery Address"
msgstr "عنوان التوصيل"
#: core/forms.py:58 core/models.py:41
msgid "Receiver Name"
msgstr "اسم المستلم"
#: core/forms.py:59 core/models.py:42
msgid "Receiver Phone"
msgstr "هاتف المستلم"
#: core/models.py:8 core/models.py:32 #: core/models.py:8 core/models.py:32
msgid "Shipper" msgid "Shipper"
msgstr "شاحن" msgstr "شاحن"
@ -102,7 +138,7 @@ msgstr "ملغي"
msgid "Tracking Number" msgid "Tracking Number"
msgstr "رقم التتبع" msgstr "رقم التتبع"
#: core/models.py:33 #: core/models.py:33 core/templates/core/shipper_dashboard.html:28
msgid "Carrier" msgid "Carrier"
msgstr "الناقل" msgstr "الناقل"
@ -110,30 +146,10 @@ msgstr "الناقل"
msgid "Description" msgid "Description"
msgstr "الوصف" msgstr "الوصف"
#: core/models.py:36
msgid "Weight (kg)"
msgstr "الوزن (كجم)"
#: core/models.py:36 #: core/models.py:36
msgid "Weight in kg" msgid "Weight in kg"
msgstr "الوزن بالكيلوجرام" msgstr "الوزن بالكيلوجرام"
#: core/models.py:38
msgid "Pickup Address"
msgstr "عنوان الاستلام"
#: core/models.py:39
msgid "Delivery Address"
msgstr "عنوان التوصيل"
#: core/models.py:41
msgid "Receiver Name"
msgstr "اسم المستلم"
#: core/models.py:42
msgid "Receiver Phone"
msgstr "هاتف المستلم"
#: core/models.py:44 core/templates/core/index.html:30 #: core/models.py:44 core/templates/core/index.html:30
msgid "Status" msgid "Status"
msgstr "الحالة" msgstr "الحالة"
@ -158,35 +174,94 @@ msgstr "طرود"
msgid "Small Shipments, Smart Delivery" msgid "Small Shipments, Smart Delivery"
msgstr "شحنات صغيرة، توصيل ذكي" msgstr "شحنات صغيرة، توصيل ذكي"
#: core/templates/base.html:58 #: core/templates/base.html:62
msgid "How it Works" msgid "How it Works"
msgstr "كيف يعمل" msgstr "كيف يعمل"
#: core/templates/base.html:62 #: core/templates/base.html:66
msgid "Dashboard"
msgstr "لوحة التحكم"
#: core/templates/base.html:69
msgid "Hello" msgid "Hello"
msgstr "مرحباً" msgstr "مرحباً"
#: core/templates/base.html:67 #: core/templates/base.html:74
msgid "Logout" msgid "Logout"
msgstr "تسجيل الخروج" msgstr "تسجيل الخروج"
#: core/templates/base.html:72 core/templates/core/login.html:4 #: core/templates/base.html:79 core/templates/core/login.html:4
#: core/templates/core/login.html:25 #: core/templates/core/login.html:25
msgid "Login" msgid "Login"
msgstr "تسجيل الدخول" msgstr "تسجيل الدخول"
#: core/templates/base.html:75 core/templates/core/register.html:4 #: core/templates/base.html:82 core/templates/core/register.html:4
msgid "Register" msgid "Register"
msgstr "تسجيل" msgstr "تسجيل"
#: core/templates/base.html:101 core/templates/core/index.html:13 #: core/templates/base.html:110
msgid "Find Loads"
msgstr "البحث عن شحنات"
#: core/templates/base.html:112 core/templates/core/index.html:13
msgid "Start Shipping" msgid "Start Shipping"
msgstr "ابدأ الشحن" msgstr "ابدأ الشحن"
#: core/templates/base.html:114 #: core/templates/base.html:137
msgid "All rights reserved." msgid "All rights reserved."
msgstr "جميع الحقوق محفوظة." msgstr "جميع الحقوق محفوظة."
#: core/templates/core/driver_dashboard.html:6
msgid "Driver Dashboard"
msgstr "لوحة تحكم السائق"
#: core/templates/core/driver_dashboard.html:10
msgid "Available Shipments"
msgstr "الشحنات المتوفرة"
#: core/templates/core/driver_dashboard.html:13
msgid "My Deliveries"
msgstr "توصيلاتي"
#: core/templates/core/driver_dashboard.html:27
msgid "Pickup"
msgstr "الاستلام"
#: core/templates/core/driver_dashboard.html:28
msgid "Delivery"
msgstr "التوصيل"
#: core/templates/core/driver_dashboard.html:29
msgid "Weight"
msgstr "الوزن"
#: core/templates/core/driver_dashboard.html:32
msgid "Accept Shipment"
msgstr "قبول الشحنة"
#: core/templates/core/driver_dashboard.html:40
msgid "No shipments available at the moment."
msgstr "لا توجد شحنات متوفرة حالياً."
#: core/templates/core/driver_dashboard.html:57
#: core/templates/core/index.html:35
#: core/templates/core/shipper_dashboard.html:25
msgid "To"
msgstr "إلى"
#: core/templates/core/driver_dashboard.html:58
#: core/templates/core/shipper_dashboard.html:27
msgid "Receiver"
msgstr "المستلم"
#: core/templates/core/driver_dashboard.html:69
msgid "Update"
msgstr "تحديث"
#: core/templates/core/driver_dashboard.html:77
msgid "You haven't accepted any shipments yet."
msgstr "لم تقبل أي شحنات بعد."
#: core/templates/core/index.html:10 #: core/templates/core/index.html:10
msgid "Small Shipments," msgid "Small Shipments,"
msgstr "شحنات صغيرة،" msgstr "شحنات صغيرة،"
@ -199,7 +274,9 @@ msgstr "توصيل ذكي."
msgid "" msgid ""
"masarX connects shippers with local car owners for fast, reliable, and " "masarX connects shippers with local car owners for fast, reliable, and "
"trackable deliveries. Your cargo, our priority." "trackable deliveries. Your cargo, our priority."
msgstr "يربط مسارX بين الشاحنين وأصحاب السيارات المحليين لتوصيل سريع وموثوق وقابل للتتبع. شحنتك هي أولويتنا." msgstr ""
"يربط مسارX بين الشاحنين وأصحاب السيارات المحليين لتوصيل سريع وموثوق وقابل "
"للتتبع. شحنتك هي أولويتنا."
#: core/templates/core/index.html:14 #: core/templates/core/index.html:14
msgid "Learn More" msgid "Learn More"
@ -218,13 +295,10 @@ msgid "Track"
msgstr "تتبع" msgstr "تتبع"
#: core/templates/core/index.html:34 #: core/templates/core/index.html:34
#: core/templates/core/shipper_dashboard.html:24
msgid "From" msgid "From"
msgstr "من" msgstr "من"
#: core/templates/core/index.html:35
msgid "To"
msgstr "إلى"
#: core/templates/core/index.html:42 #: core/templates/core/index.html:42
msgid "Enter your 10-character tracking ID to see live updates." msgid "Enter your 10-character tracking ID to see live updates."
msgstr "أدخل رقم التتبع المكون من 10 أرقام لرؤية التحديثات المباشرة." msgstr "أدخل رقم التتبع المكون من 10 أرقام لرؤية التحديثات المباشرة."
@ -311,6 +385,54 @@ msgstr "لديك حساب بالفعل؟"
msgid "Login here" msgid "Login here"
msgstr "سجل دخولك هنا" msgstr "سجل دخولك هنا"
#: core/views.py:17 #: core/templates/core/shipment_request.html:10
msgid "Request a Shipment"
msgstr "طلب شحنة"
#: core/templates/core/shipment_request.html:24
msgid "Submit Request"
msgstr "إرسال الطلب"
#: core/templates/core/shipper_dashboard.html:7
msgid "My Shipments"
msgstr "شحناتي"
#: core/templates/core/shipper_dashboard.html:8
msgid "New Shipment"
msgstr "شحنة جديدة"
#: core/templates/core/shipper_dashboard.html:28
msgid "Waiting for pickup"
msgstr "في انتظار الاستلام"
#: core/templates/core/shipper_dashboard.html:36
msgid "You haven't sent any shipments yet."
msgstr "لم ترسل أي شحنات بعد."
#: core/templates/core/shipper_dashboard.html:37
msgid "Send your first shipment"
msgstr "أرسل أول شحنة لك"
#: core/views.py:18
msgid "Parcel not found." msgid "Parcel not found."
msgstr "الطرد غير موجود." msgstr "الطرد غير موجود."
#: core/views.py:55
msgid "Only shippers can request shipments."
msgstr "فقط الشاحنين يمكنهم طلب شحنات."
#: core/views.py:64
msgid "Shipment requested successfully! Tracking ID: "
msgstr "تم طلب الشحنة بنجاح! رقم التتبع: "
#: core/views.py:73
msgid "Only car owners can accept shipments."
msgstr "فقط أصحاب السيارات يمكنهم قبول الشحنات."
#: core/views.py:80
msgid "You have accepted the shipment!"
msgstr "لقد قبلت الشحنة!"
#: core/views.py:91
msgid "Status updated successfully!"
msgstr "تم تحديث الحالة بنجاح!"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-01-25 07:13+0000\n" "POT-Creation-Date: 2026-01-25 07:25+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,6 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: core/forms.py:7 #: core/forms.py:7
msgid "Password" msgid "Password"
msgstr "" msgstr ""
@ -53,6 +54,42 @@ msgstr ""
msgid "Passwords don't match" msgid "Passwords don't match"
msgstr "" msgstr ""
#: core/forms.py:46
msgid "What are you sending?"
msgstr ""
#: core/forms.py:48
msgid "123 Street, City"
msgstr ""
#: core/forms.py:49
msgid "456 Avenue, City"
msgstr ""
#: core/forms.py:54
msgid "Package Description"
msgstr ""
#: core/forms.py:55 core/models.py:36
msgid "Weight (kg)"
msgstr ""
#: core/forms.py:56 core/models.py:38
msgid "Pickup Address"
msgstr ""
#: core/forms.py:57 core/models.py:39
msgid "Delivery Address"
msgstr ""
#: core/forms.py:58 core/models.py:41
msgid "Receiver Name"
msgstr ""
#: core/forms.py:59 core/models.py:42
msgid "Receiver Phone"
msgstr ""
#: core/models.py:8 core/models.py:32 #: core/models.py:8 core/models.py:32
msgid "Shipper" msgid "Shipper"
msgstr "" msgstr ""
@ -101,7 +138,7 @@ msgstr ""
msgid "Tracking Number" msgid "Tracking Number"
msgstr "" msgstr ""
#: core/models.py:33 #: core/models.py:33 core/templates/core/shipper_dashboard.html:28
msgid "Carrier" msgid "Carrier"
msgstr "" msgstr ""
@ -109,30 +146,10 @@ msgstr ""
msgid "Description" msgid "Description"
msgstr "" msgstr ""
#: core/models.py:36
msgid "Weight (kg)"
msgstr ""
#: core/models.py:36 #: core/models.py:36
msgid "Weight in kg" msgid "Weight in kg"
msgstr "" msgstr ""
#: core/models.py:38
msgid "Pickup Address"
msgstr ""
#: core/models.py:39
msgid "Delivery Address"
msgstr ""
#: core/models.py:41
msgid "Receiver Name"
msgstr ""
#: core/models.py:42
msgid "Receiver Phone"
msgstr ""
#: core/models.py:44 core/templates/core/index.html:30 #: core/models.py:44 core/templates/core/index.html:30
msgid "Status" msgid "Status"
msgstr "" msgstr ""
@ -157,35 +174,94 @@ msgstr ""
msgid "Small Shipments, Smart Delivery" msgid "Small Shipments, Smart Delivery"
msgstr "" msgstr ""
#: core/templates/base.html:58 #: core/templates/base.html:62
msgid "How it Works" msgid "How it Works"
msgstr "" msgstr ""
#: core/templates/base.html:62 #: core/templates/base.html:66
msgid "Dashboard"
msgstr ""
#: core/templates/base.html:69
msgid "Hello" msgid "Hello"
msgstr "" msgstr ""
#: core/templates/base.html:67 #: core/templates/base.html:74
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
#: core/templates/base.html:72 core/templates/core/login.html:4 #: core/templates/base.html:79 core/templates/core/login.html:4
#: core/templates/core/login.html:25 #: core/templates/core/login.html:25
msgid "Login" msgid "Login"
msgstr "" msgstr ""
#: core/templates/base.html:75 core/templates/core/register.html:4 #: core/templates/base.html:82 core/templates/core/register.html:4
msgid "Register" msgid "Register"
msgstr "" msgstr ""
#: core/templates/base.html:101 core/templates/core/index.html:13 #: core/templates/base.html:110
msgid "Find Loads"
msgstr ""
#: core/templates/base.html:112 core/templates/core/index.html:13
msgid "Start Shipping" msgid "Start Shipping"
msgstr "" msgstr ""
#: core/templates/base.html:114 #: core/templates/base.html:137
msgid "All rights reserved." msgid "All rights reserved."
msgstr "" msgstr ""
#: core/templates/core/driver_dashboard.html:6
msgid "Driver Dashboard"
msgstr ""
#: core/templates/core/driver_dashboard.html:10
msgid "Available Shipments"
msgstr ""
#: core/templates/core/driver_dashboard.html:13
msgid "My Deliveries"
msgstr ""
#: core/templates/core/driver_dashboard.html:27
msgid "Pickup"
msgstr ""
#: core/templates/core/driver_dashboard.html:28
msgid "Delivery"
msgstr ""
#: core/templates/core/driver_dashboard.html:29
msgid "Weight"
msgstr ""
#: core/templates/core/driver_dashboard.html:32
msgid "Accept Shipment"
msgstr ""
#: core/templates/core/driver_dashboard.html:40
msgid "No shipments available at the moment."
msgstr ""
#: core/templates/core/driver_dashboard.html:57
#: core/templates/core/index.html:35
#: core/templates/core/shipper_dashboard.html:25
msgid "To"
msgstr ""
#: core/templates/core/driver_dashboard.html:58
#: core/templates/core/shipper_dashboard.html:27
msgid "Receiver"
msgstr ""
#: core/templates/core/driver_dashboard.html:69
msgid "Update"
msgstr ""
#: core/templates/core/driver_dashboard.html:77
msgid "You haven't accepted any shipments yet."
msgstr ""
#: core/templates/core/index.html:10 #: core/templates/core/index.html:10
msgid "Small Shipments," msgid "Small Shipments,"
msgstr "" msgstr ""
@ -217,13 +293,10 @@ msgid "Track"
msgstr "" msgstr ""
#: core/templates/core/index.html:34 #: core/templates/core/index.html:34
#: core/templates/core/shipper_dashboard.html:24
msgid "From" msgid "From"
msgstr "" msgstr ""
#: core/templates/core/index.html:35
msgid "To"
msgstr ""
#: core/templates/core/index.html:42 #: core/templates/core/index.html:42
msgid "Enter your 10-character tracking ID to see live updates." msgid "Enter your 10-character tracking ID to see live updates."
msgstr "" msgstr ""
@ -310,6 +383,54 @@ msgstr ""
msgid "Login here" msgid "Login here"
msgstr "" msgstr ""
#: core/views.py:17 #: core/templates/core/shipment_request.html:10
msgid "Request a Shipment"
msgstr ""
#: core/templates/core/shipment_request.html:24
msgid "Submit Request"
msgstr ""
#: core/templates/core/shipper_dashboard.html:7
msgid "My Shipments"
msgstr ""
#: core/templates/core/shipper_dashboard.html:8
msgid "New Shipment"
msgstr ""
#: core/templates/core/shipper_dashboard.html:28
msgid "Waiting for pickup"
msgstr ""
#: core/templates/core/shipper_dashboard.html:36
msgid "You haven't sent any shipments yet."
msgstr ""
#: core/templates/core/shipper_dashboard.html:37
msgid "Send your first shipment"
msgstr ""
#: core/views.py:18
msgid "Parcel not found." msgid "Parcel not found."
msgstr "" msgstr ""
#: core/views.py:55
msgid "Only shippers can request shipments."
msgstr ""
#: core/views.py:64
msgid "Shipment requested successfully! Tracking ID: "
msgstr ""
#: core/views.py:73
msgid "Only car owners can accept shipments."
msgstr ""
#: core/views.py:80
msgid "You have accepted the shipment!"
msgstr ""
#: core/views.py:91
msgid "Status updated successfully!"
msgstr ""