mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-20 14:06:27 +00:00
1bc82f97fd
Paddle tours are planned on the water by TREK's own router: a water network per paddle region, built from the same Geofabrik extract as the obstacles and searched in a worker thread of the server (no sidecar). Rivers, canals and lakes (direct or along the shore), portages round weirs, locks by policy, whitewater by boat, gaps marked. Found portages and locks become points of their own; an unplannable leg says why and offers a way out. - Shaping points: a click on the line sets a point that steers the route without being a stop (hikes and paddle tours); recompute a single leg. - Lake style direct/shore, suggested from the wind forecast. - Regions load by themselves where a paddler plans (admin setting: automatic, on request, off; size cap and a daily count), with requests for the admins, a notification, and the load followed on the leg. - Portage from the last point, portages follow footways via the walking router (or stay straight), "put in here" on slipways and put-ins. - MCP plan_paddle_route with the REST route's rules.
106 lines
5.1 KiB
TypeScript
106 lines
5.1 KiB
TypeScript
import type { NotificationLocale } from '../externalNotifications/types';
|
|
import { pluralForm } from '../plural';
|
|
|
|
const ar: NotificationLocale = {
|
|
email: {
|
|
footer: 'تلقيت هذا لأنك قمت بتفعيل الإشعارات في TREK.',
|
|
manage: 'إدارة التفضيلات',
|
|
madeWith: 'Made with',
|
|
openTrek: 'فتح TREK',
|
|
},
|
|
events: {
|
|
trip_invite: (p) => ({
|
|
title: `دعوة إلى "${p.trip}"`,
|
|
body: `${p.actor} دعا ${p.invitee || 'عضو'} إلى الرحلة "${p.trip}".`,
|
|
}),
|
|
booking_change: (p) => ({
|
|
title: `حجز جديد: ${p.booking}`,
|
|
body: `${p.actor} أضاف حجز "${p.booking}" (${p.type}) إلى "${p.trip}".`,
|
|
}),
|
|
trip_reminder: (p) => ({
|
|
title: `تذكير: ${p.trip}`,
|
|
body: `رحلتك "${p.trip}" تقترب!`,
|
|
}),
|
|
todo_due: (p) => ({
|
|
title: `مهمة مستحقة: ${p.todo}`,
|
|
body: `"${p.todo}" في "${p.trip}" مستحقة في ${p.due}.`,
|
|
}),
|
|
vacay_invite: (p) => ({
|
|
title: 'دعوة دمج الإجازة',
|
|
body: `${p.actor} يدعوك لدمج خطط الإجازة. افتح TREK للقبول أو الرفض.`,
|
|
}),
|
|
vacay_share: (p) => ({
|
|
title: 'تمت مشاركة تقويم Vacay',
|
|
body: `${p.actor} شارك تقويم إجازاته معك. افتح TREK لعرضه.`,
|
|
}),
|
|
collection_invite: (p) => ({
|
|
title: 'دعوة إلى مجموعة',
|
|
body: `${p.actor} يدعوك لمشاركة مجموعة. افتح TREK للقبول أو الرفض.`,
|
|
}),
|
|
photos_shared: (p) => ({
|
|
title: pluralForm(p.count, 'ar', {
|
|
zero: 'لم تتم مشاركة أي صورة',
|
|
one: 'تمت مشاركة صورة واحدة',
|
|
two: 'تمت مشاركة صورتين',
|
|
few: `تمت مشاركة ${p.count} صور`,
|
|
many: `تمت مشاركة ${p.count} صورة`,
|
|
other: `تمت مشاركة ${p.count} صورة`,
|
|
}),
|
|
body: pluralForm(p.count, 'ar', {
|
|
zero: `${p.actor} لم يشارك أي صورة في "${p.trip}".`,
|
|
one: `${p.actor} شارك صورة واحدة في "${p.trip}".`,
|
|
two: `${p.actor} شارك صورتين في "${p.trip}".`,
|
|
few: `${p.actor} شارك ${p.count} صور في "${p.trip}".`,
|
|
many: `${p.actor} شارك ${p.count} صورة في "${p.trip}".`,
|
|
other: `${p.actor} شارك ${p.count} صورة في "${p.trip}".`,
|
|
}),
|
|
}),
|
|
collab_message: (p) => ({
|
|
title: `رسالة جديدة في "${p.trip}"`,
|
|
body: `${p.actor}: ${p.preview}`,
|
|
}),
|
|
packing_tagged: (p) => ({
|
|
title: `قائمة التعبئة: ${p.category}`,
|
|
body: `${p.actor} عيّنك في فئة "${p.category}" في "${p.trip}".`,
|
|
}),
|
|
version_available: (p) => ({
|
|
title: 'إصدار TREK جديد متاح',
|
|
body: `TREK ${p.version} متاح الآن. تفضل بزيارة لوحة الإدارة للتحديث.`,
|
|
}),
|
|
replica_failure: (p) => ({
|
|
title: 'فشل النسخة المتماثلة للتخزين',
|
|
body:
|
|
`فشلت الكتابة على النسخة المتماثلة '${p.backend}': ${p.op} لـ ${p.key} — ${p.error}.` +
|
|
(p.suppressed !== '0'
|
|
? pluralForm(p.suppressed, 'ar', {
|
|
zero: ' لم يتم تجاهل أي حالة فشل إضافية منذ آخر إشعار.',
|
|
one: ' تم تجاهل حالة فشل إضافية واحدة منذ آخر إشعار.',
|
|
two: ' تم تجاهل حالتَي فشل إضافيتين منذ آخر إشعار.',
|
|
few: ` تم تجاهل ${p.suppressed} حالات فشل إضافية منذ آخر إشعار.`,
|
|
many: ` تم تجاهل ${p.suppressed} حالة فشل إضافية منذ آخر إشعار.`,
|
|
other: ` تم تجاهل ${p.suppressed} حالة فشل إضافية منذ آخر إشعار.`,
|
|
})
|
|
: ''),
|
|
}),
|
|
paddle_region_requested: (p) => ({
|
|
title: 'طلب منطقة تجديف',
|
|
body: `${p.actor} يخطط لرحلة تجديف في ${p.region}. حمّل بياناتها المائية أو ارفضها في لوحة الإدارة ضمن الإضافات.`,
|
|
}),
|
|
synology_session_cleared: () => ({
|
|
title: 'تمت إعادة تعيين جلسة Synology',
|
|
body: 'تغيّر حسابك أو رابط Synology. تم تسجيل خروجك من Synology Photos.',
|
|
}),
|
|
plugin_notification: (p) => ({ title: p.title ?? '', body: p.body ?? '' }),
|
|
},
|
|
passwordReset: {
|
|
subject: 'إعادة تعيين كلمة المرور',
|
|
greeting: 'مرحبا',
|
|
body: 'تلقينا طلبًا لإعادة تعيين كلمة المرور لحسابك في TREK. انقر على الزر أدناه لتعيين كلمة مرور جديدة.',
|
|
ctaIntro: 'إعادة تعيين كلمة المرور',
|
|
expiry: 'تنتهي صلاحية هذا الرابط خلال 60 دقيقة.',
|
|
ignore: 'إذا لم تطلب هذا، يمكنك تجاهل هذه الرسالة — لن تتغير كلمة المرور الخاصة بك.',
|
|
},
|
|
};
|
|
|
|
export default ar;
|