diff --git a/Core/Resgrid.Config/MappingConfig.cs b/Core/Resgrid.Config/MappingConfig.cs index f127a2ce..0622b9e2 100644 --- a/Core/Resgrid.Config/MappingConfig.cs +++ b/Core/Resgrid.Config/MappingConfig.cs @@ -59,6 +59,12 @@ public static class MappingConfig public static string LeafletAttribution = "© OpenStreetMap contributors CC-BY-SA"; + /*********************************** + * Geocoding and Routing Service URLs + ***********************************/ + public static string NominatimUrl = "https://nominatim.openstreetmap.org"; + public static string OsrmUrl = "https://router.project-osrm.org"; + public static string GetWebsiteOSMUrl() { if (!string.IsNullOrWhiteSpace(WebsiteOSMKey)) diff --git a/Core/Resgrid.Localization/Account/Login.ar.resx b/Core/Resgrid.Localization/Account/Login.ar.resx new file mode 100644 index 00000000..4ea22f13 --- /dev/null +++ b/Core/Resgrid.Localization/Account/Login.ar.resx @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + الدعوة المكتملة + + + إكمال الدعوة + + + قدّم المعلومات لإنشاء حسابك الخاص في Resgrid والانضمام + + + المعلومات التي تقدمها تُستخدم لإنشاء حسابك في Resgrid. إذا كان لديك حساب بالفعل، فسيتم ربط حسابك الحالي بالقسم كجزء من هذه الدعوة. + + + إذا واجهتك صعوبة في إكمال الدعوة أو صادفت مشكلات، يُرجى التواصل مع مسؤول القسم للحصول على المساعدة. يمكنه إضافة حسابك يدويًا إذا لزم الأمر. + + + تأكيد كلمة المرور + + + إنشاء حساب + + + اسم القسم + + + ليس لديك حساب؟ + + + البريد الإلكتروني + + + الاسم الأول + + + نسيت اسم المستخدم أو كلمة المرور؟ + + + العودة + + + الرئيسية + + + يبدو أن هذه الدعوة قد اكتملت بالفعل. إذا كان هذا خطأً، تواصل مع قسمك أو مؤسستك للحصول على دعوة أخرى، وإلا يمكنك تسجيل الدخول باسم المستخدم وكلمة المرور. + + + تمت الدعوة إلى Resgrid بالفعل + + + اسم العائلة + + + الحساب مقفل + + + تم تأمين هذا الحساب، يُرجى المحاولة مرة أخرى بعد 30 دقيقة. تجدر الإشارة إلى أن الدعم لا يمكنه إلغاء تأمين الحساب نيابةً عنك. + + + تسجيل الدخول + + + أدخل اسم المستخدم وكلمة المرور لتسجيل الدخول. + + + إذا كان قسمك قد سجّل بالفعل، اطلب من مسؤول ذلك القسم إرسال دعوة لك. + + + إذا لم يسجّل قسمك في Resgrid بعد، يمكنك إنشاء حساب جديد سيؤدي إلى إنشاء القسم تلقائيًا. + + + تُجرى الصيانة أسبوعيًا كل سبت ابتداءً من الساعة 20:00 بتوقيت المحيط الهادئ. + + + تسجيل الدخول + + + نأسف لعدم تمكننا من العثور على دعوتك إلى Resgrid. حاول أن يرسل لك قسمك أو مؤسستك دعوةً أخرى. إذا كان لديك حساب Resgrid بالفعل، يمكنك تسجيل الدخول أدناه. + + + الدعوة مفقودة + + + تعذّر العثور على دعوتك إلى Resgrid + + + إشعار + + + كلمة المرور + + + يجب أن تكون كلمة المرور 8 أحرف على الأقل وتشمل رقمًا وحرفًا كبيرًا وحرفًا صغيرًا + + + سياسة الخصوصية + + + إذا كان عنوان بريدك الإلكتروني صحيحًا، فقد أعدنا تعيين كلمة مرورك وأرسلنا اسم المستخدم وكلمة المرور الجديدة إلى العنوان المُدخَل. قد يتأخر تسليم البريد الإلكتروني حتى 15 دقيقة، <b>تحقق أيضًا من مجلد البريد غير الهام إذا لم يصل البريد</b> بحلول ذلك الوقت. + + + قدّم عنوان البريد الإلكتروني المرتبط بحساب Resgrid الخاص بك. سنرسل لك بريدًا إلكترونيًا يحتوي على اسم المستخدم وكلمة مرور جديدة لتسجيل الدخول. + + + استرداد الحساب + + + التسجيل + + + التسجيل في Resgrid سهل كالعد من 1 إلى 3! + + + أن يملأ شخص واحد من مؤسستك هذا النموذج + + + بعد التسجيل، يمكنك دعوة أشخاص أو إضافتهم من صفحة الموظفين داخل التطبيق + + + هذا كل شيء! يحتاج شخص واحد فقط إلى تسجيل المؤسسة + + + إذا كان شخص في مؤسستك <b>يمتلك حسابًا بالفعل في Resgrid</b>، اطلب منه دعوتك إلى قسمه بدلًا من إنشاء قسم جديد، إذا أردت استخدام Resgrid معه. + + + تسجيل + + + بالتسجيل، تقبل + + + شروط الاستخدام + + + اسم المستخدم + + diff --git a/Core/Resgrid.Localization/Areas/User/Account/DeleteAccount.ar.resx b/Core/Resgrid.Localization/Areas/User/Account/DeleteAccount.ar.resx new file mode 100644 index 00000000..f6cdac50 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Account/DeleteAccount.ar.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ضع علامة في مربع الاختيار أدناه للتأكيد على أنك تفهم ما سبق وتريد حذف حسابك. + + + ضع علامة في المربع للتأكيد + + + حذف حسابك + + + يمكنك هنا حذف حسابك الشخصي في نظام Resgrid. إذا كنت مالك حساب في أي قسم في نظام Resgrid، فيجب عليك حذف حسابك عن طريق حذف ذلك القسم أو نقل ملكيته إلى شخص آخر عبر تعديل إعدادات القسم. + + + إذا كنت ترغب في مغادرة قسم، فيُنصح بأن يقوم مديرو القسم بحذف حسابك عبر قائمة الأفراد. ولكن إذا لم يكن ذلك ممكناً، يمكنك حذف حسابك بنفسك من هنا. + + + يُرجى ملاحظة أن البيانات المقدمة إلى Resgrid لقسم ما تخص ذلك القسم وقد تخضع لسياسات الاحتفاظ بالبيانات والقوانين السارية في نطاق القسم. سيؤدي حذف حسابك إلى مسح معلوماتك الشخصية (PII) وحذف بيانات تسجيل الدخول، لكنه لن يمسح جميع البيانات. ستحتاج إلى تقديم طلب إلى القسم الذي كنت منتمياً إليه إذا كنت تريد مسح جميع البيانات. + + + لا يمكنك حذف حسابك لأنك مالك قسم. إذا كنت ترغب في حذف القسم، ستحتاج إلى الوصول إليه عبر صفحة إعدادات القسم. إذا كنت تريد الاحتفاظ بالقسم، فاختر شخصاً آخر ليكون مالكاً للقسم ثم حاول حذف حسابك مرة أخرى. + + diff --git a/Core/Resgrid.Localization/Areas/User/Account/ForcePasswordChange.ar.resx b/Core/Resgrid.Localization/Areas/User/Account/ForcePasswordChange.ar.resx new file mode 100644 index 00000000..789833bf --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Account/ForcePasswordChange.ar.resx @@ -0,0 +1,21 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + انتهت صلاحية كلمة المرور — التغيير مطلوب + انتهت صلاحية كلمة المرور + انتهت صلاحية كلمة المرور الخاصة بك ويجب تغييرها قبل المتابعة. + تشترط سياسة أمان قسمك تغيير كلمات المرور بشكل دوري. يُرجى اختيار كلمة مرور جديدة للمتابعة. + متطلبات كلمة المرور + على الأقل {0} أحرف + رقم واحد على الأقل + حرف كبير واحد على الأقل + حرف صغير واحد على الأقل + كلمة المرور الحالية + كلمة المرور الجديدة + تأكيد كلمة المرور الجديدة + تغيير كلمة المرور والمتابعة + diff --git a/Core/Resgrid.Localization/Areas/User/Calendar/Calendar.ar.resx b/Core/Resgrid.Localization/Areas/User/Calendar/Calendar.ar.resx new file mode 100644 index 00000000..9ddf38b6 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Calendar/Calendar.ar.resx @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + طوال اليوم + + + التقويم + + + تفاصيل الحدث + + + تحذير: سيؤدي هذا الإجراء إلى حذف هذا النوع نهائياً. هل أنت متأكد من حذف النوع + + + أنواع التقويم + + + أيام الأسبوع + + + حذف الحدث + + + هل أنت متأكد من حذف هذا الحدث؟ لا يمكن التراجع عن هذا الإجراء. + + + حذف الحدث وتكراراته + + + هل أنت متأكد من حذف هذا الحدث وجميع تكراراته؟ لا يمكن التراجع عن هذا الإجراء. + + + تعديل نوع التقويم + + + تعديل إدخال التقويم + + + هذا هو العنصر الأصلي للتكرار. إذا حددت مربع "تطبيق على الكل" سيتم تحديث جميع عناصر التكرار ببيانات هذا العنصر. إذا حذفت هذا العنصر ستُحذف جميع عناصر التكرار الفرعية أيضاً. + + + تعديل الحدث + + + تعديل العنصر الأصلي + + + اتركه فارغاً لعدم تحديد تاريخ انتهاء + + + ينتهي في + + + الجهات المراد إشعارها + + + الأول + + + الرابع + + + الأخير + + + إدارة الأنواع + + + إدارة أنواع التقويم + + + إدخال تقويم جديد + + + نوع تقويم جديد + + + إدخال جديد + + + إضافة إدخال تقويم جديد + + + لا توجد أنواع مخصصة + + + لا شيء + + + بدون ملاحظة + + + لا توجد عناصر قادمة + + + هذا عنصر تكرار فرعي. لا يمكن تغيير إعدادات التكرار لهذا العنصر. إذا احتجت إلى تغيير نمط التكرار يجب حذفه وإعادة إضافته من العنصر الأصلي. + + + هذا هو العنصر الأصلي للتكرار. لا يمكن تغيير إعدادات التكرار لهذا العنصر. لتغيير نمط التكرار يجب أولاً حذفه ثم إنشاء إدخال تكرار جديد. يمكنك تغيير أي تفاصيل أخرى في الإدخال. + + + تذكير + + + إزالة من هذا الحدث + + + إزالتي + + + التكرار في + + + RSVP + + + الثاني + + + التسجيل (RSVP) + + + الثالث + + + عنوان إدخال التقويم + + + عنوان إدخال التقويم + + + لون النوع + + + اسم النوع + + + القادم + + + حدث طوال اليوم + + + {0} – {1} + + + تنزيل .ics + + + الاشتراك في التقويم + + + مزامنة التقويم + + + اشترك في تقويم قسمك في Google Calendar أو Microsoft Outlook أو Apple Calendar أو أي تطبيق يدعم تغذيات iCal. + + + تفعيل مزامنة التقويم + + + إعادة إنشاء مفتاح المزامنة + + + لمزامنة تقويم قسمك مع تطبيق تقويم خارجي يجب أولاً تفعيل مزامنة التقويم. سيُنشئ ذلك رابط اشتراك فريداً. إذا تم اختراق الرابط يمكنك إعادة إنشائه لإبطال الرابط القديم. + + + نسخ إلى الحافظة + + + رابط الاشتراك + + + فتح في تطبيق التقويم + + + مزامنة التقويم نشطة. استخدم الرابط أدناه للاشتراك. + + + مزامنة التقويم غير مفعّلة بعد. اضغط الزر أدناه لإنشاء رابط الاشتراك. + + + الأنواع + + diff --git a/Core/Resgrid.Localization/Areas/User/Contacts/Contacts.ar.resx b/Core/Resgrid.Localization/Areas/User/Contacts/Contacts.ar.resx new file mode 100644 index 00000000..c146dabc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Contacts/Contacts.ar.resx @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إضافة فئة + + + إضافة جهة اتصال + + + العنوان + + + عنوان الشارع الفعلي + + + Bluesky + + + رابط Bluesky + + + الفئات + + + الفئات + + + وصف الفئة + + + اسم الفئة + + + الهاتف المحمول + + + رقم الهاتف المحمول + + + المدينة + + + المدينة الفعلية + + + الموقع أو الشركة + + + اسم الشركة\الموقع + + + اسم المنظمة أو الموقع + + + تفاصيل جهة الاتصال + + + معلومات الاتصال + + + جهات الاتصال + + + جهات الاتصال في الفئة + + + نوع جهة الاتصال + + + الدولة + + + إذا كنت تغير كلمة المرور يجب إدخال كلمة المرور الحالية (وليس الجديدة) هنا + + + بيانات أخرى + + + هل أنت متأكد من حذف جهة الاتصال بالاسم التالي؟ + + + الوصف + + + عرض على الخريطة + + + تعديل الفئة + + + البريد الإلكتروني لجهة الاتصال نفسها أو لمسؤول الاتصال (أو صندوق البريد المشترك) في الشركة + + + البريد الإلكتروني + + + البريد الإلكتروني للشخص أو الشركة + + + إحداثيات GPS للمدخل + + + خط العرض GPS لمدخل الموقع + + + خط العرض (بالتدوين العشري: مثلاً 39.1517) + + + خط الطول GPS لمدخل الموقع + + + خط الطول (بالتدوين العشري: مثلاً -119.4571) + + + إحداثيات GPS للمخرج + + + خط العرض GPS لمخرج الموقع + + + خط العرض (بالتدوين العشري: مثلاً 39.1517) + + + خط الطول GPS لمخرج الموقع + + + خط الطول (بالتدوين العشري: مثلاً -119.4571) + + + Facebook + + + اسم أو رابط Facebook + + + رقم الفاكس + + + رقم هاتف الفاكس + + + الاسم الأول + + + الاسم الأول لجهة الاتصال + + + هاتف المنزل + + + رقم هاتف المنزل + + + Instagram + + + اسم Instagram + + + اسم العائلة + + + اسم العائلة لجهة الاتصال + + + آخر تحديث + + + LinkedIn + + + اسم أو رابط LinkedIn + + + إحداثيات GPS للموقع + + + إحداثيات GPS - خط العرض + + + خط العرض (بالتدوين العشري: مثلاً 39.1517) + + + إحداثيات GPS - خط الطول + + + خط الطول (بالتدوين العشري: مثلاً -119.4571) + + + معلومات الموقع + + + العنوان + + + عنوان الشارع البريدي + + + المدينة + + + مدينة البريد + + + الدولة + + + الرمز البريدي + + + الرمز البريدي للبريد + + + المحافظة/الولاية + + + أيقونة الخريطة + + + Mastodon + + + اسم مستخدم Mastodon والخادم + + + الاسم الأوسط + + + الاسم الأوسط لجهة الاتصال + + + جهة اتصال جديدة + + + لا توجد جهات اتصال مضافة في النظام. + + + لا توجد جهات اتصال مرتبطة بهذه الفئة. + + + هاتف المكتب + + + رقم هاتف المكتب + + + معلومات الاتصال + + + معلومات أخرى + + + اسم آخر + + + اسم آخر أو لقب + + + العنوان الفعلي + + + الرمز البريدي + + + الرمز البريدي الفعلي + + + أنت تحاول حذف فئة جهة اتصال. هل أنت متأكد من حذف الفئة ذات الاسم + + + مطابق للعنوان الفعلي؟ + + + المحافظة/الولاية + + + المحافظة\الإقليم الفعلي + + + Threads + + + معرّف Threads + + + Twitter + + + @معرف_تويتر + + + عرض الفئة + + + عرض + + + عرض جهة الاتصال + + + رابط الموقع الإلكتروني + + + رابط موقع جهة الاتصال + + + معلومات إضافية + + + تاريخ الإنشاء + + + أنشأه + + + نوع جهة الاتصال + + + عنوان البريد + + + معلومات الموقع + + + وسائل التواصل الاجتماعي + + + لا توجد ملاحظات مدخلة لجهة الاتصال هذه + + + إضافة ملاحظة + + + عنوان الملاحظة + + + محتوى الملاحظة + + + نوع الملاحظة + + + تاريخ الانتهاء + + + اتركه فارغاً لعدم تحديد تاريخ انتهاء. + + + تنبيه بالملاحظة + + + إذا تم التحديد ستظهر هذه الملاحظة عند إنشاء بلاغ جديد لجهة الاتصال هذه. + + + إضافة ملاحظة + + + تصفية حسب + + + جارٍ تحميل الملاحظات + + + البحث في الملاحظات + + + تعديل جهة الاتصال + + diff --git a/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.ar.resx b/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.ar.resx new file mode 100644 index 00000000..92620391 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.ar.resx @@ -0,0 +1,121 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إلغاء + حفظ + الاسم + الوصف + تعديل + حذف + استيراد + النوع + تاريخ الإنشاء + الترتيب + نعم + لا + + + الخرائط المخصصة + الخرائط المخصصة + خريطة مخصصة جديدة + الكل + داخلية + خارجية + حدث + مخصص + الطبقات + هل أنت متأكد من حذف هذه الخريطة؟ + + + خريطة مخصصة جديدة + خريطة مخصصة جديدة + جديد + نوع الخريطة + داخلية + خارجية + حدث + مخصص + مثال: المستشفى الرئيسي، مكان الحفل + وصف اختياري + رسم الحدود + ارسم مستطيلاً على الخريطة أدناه لتحديد الحدود. انقر على الخريطة لتحديد نقطة المركز. + ارسم مستطيلاً على الخريطة أدناه لتحديث الحدود. انقر على الخريطة لتحديد نقطة المركز. + + + تعديل الخريطة المخصصة + تعديل الخريطة المخصصة + تعديل + + + الطبقات + الطبقات + الطبقات + إضافة طبقة + اسم الطبقة + مثال: الطابق 1، الخريطة الأساسية، البنية التحتية + الترتيب + النوع + مخطط الطابق + طبقة تراكبية + طبقة بيانات + بنية تحتية + صورة الطبقة + سيتم تجزئة الصور الأكبر من 2048 بكسل تلقائياً. + إضافة طبقة + يحتوي على صورة + مجزأة + محرر المناطق + هل تريد حذف هذه الطبقة؟ + + + محرر المناطق + محرر المناطق + المناطق + خصائص المنطقة + الاسم + النوع + غرفة + جناح + ممر + بئر الدرج + مصعد + منطقة خطر + نقطة التجمع + منطقة التجهيز + نقطة الدخول + مرافق + شبكة البحث + منصة + بوابة + مدخل + موقف السيارات + منطقة البائعين + ممر الطوارئ + حي + مخصص + اللون + الوصف + قابل للبحث في الإرسال + قابل للإرسال + حفظ المنطقة + قابل للإرسال + + + استيراد + استيراد + استيراد + استيراد البيانات الجيومكانية + الطبقة المستهدفة + الملف + الصيغ المدعومة: GeoJSON ‏(.geojson, .json)، KML ‏(.kml)، KMZ ‏(.kmz) + استيراد + سجل الاستيراد + الحالة + التاريخ + خطأ + diff --git a/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.cs b/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.cs new file mode 100644 index 00000000..4aec7704 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.cs @@ -0,0 +1,6 @@ +namespace Resgrid.Localization.Areas.User.CustomMaps +{ + public class CustomMaps + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.en.resx b/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.en.resx new file mode 100644 index 00000000..d9fdbed5 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/CustomMaps/CustomMaps.en.resx @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Cancel + + + Save + + + Name + + + Description + + + Edit + + + Delete + + + Import + + + Type + + + Created + + + Order + + + Yes + + + No + + + + Custom Maps + + + Custom Maps + + + New Custom Map + + + All + + + Indoor + + + Outdoor + + + Event + + + Custom + + + Layers + + + Are you sure you want to delete this map? + + + + New Custom Map + + + New Custom Map + + + New + + + Map Type + + + Indoor + + + Outdoor + + + Event + + + Custom + + + e.g. Main Hospital, Concert Venue + + + Optional description + + + Draw Bounds + + + Draw a rectangle on the map below to define the bounds. Click the map to set the center point. + + + Draw a rectangle on the map below to update the bounds. Click the map to set the center point. + + + + Edit Custom Map + + + Edit Custom Map + + + Edit + + + + Layers + + + Layers + + + Layers + + + Add Layer + + + Layer Name + + + e.g. Floor 1, Base Map, Infrastructure + + + Order + + + Type + + + Floor Plan + + + Overlay + + + Data Layer + + + Infrastructure + + + Layer Image + + + Images larger than 2048px will be automatically tiled. + + + Add Layer + + + Has Image + + + Tiled + + + Region Editor + + + Delete this layer? + + + + Region Editor + + + Region Editor + + + Regions + + + Region Properties + + + Name + + + Type + + + Room + + + Wing + + + Corridor + + + Stairwell + + + Elevator + + + Hazard Zone + + + Assembly Point + + + Staging Area + + + Access Point + + + Utility + + + Search Grid + + + Stage + + + Gate + + + Entrance + + + Parking Area + + + Vendor Area + + + Emergency Lane + + + District + + + Custom + + + Color + + + Description + + + Searchable in dispatch + + + Dispatchable + + + Save Region + + + Dispatchable + + + + Import + + + Import + + + Import + + + Import Geospatial Data + + + Target Layer + + + File + + + Supported formats: GeoJSON (.geojson, .json), KML (.kml), KMZ (.kmz) + + + Import + + + Import History + + + Status + + + Date + + + Error + + diff --git a/Core/Resgrid.Localization/Areas/User/CustomStatuses/CustomStatuses.ar.resx b/Core/Resgrid.Localization/Areas/User/CustomStatuses/CustomStatuses.ar.resx new file mode 100644 index 00000000..b8093a4c --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/CustomStatuses/CustomStatuses.ar.resx @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إضافة خيار (زر) + + + متاح + + + النوع الأساسي + + + لون خلفية الزر + + + لون الزر + + + معاينة الزر + + + هذه هي الأزرار التي سيراها المستخدمون في التطبيقات المحمولة والموقع الإلكتروني. + + + نص الزر + + + لون نص الزر + + + نص الزر + + + البلاغات + + + البلاغات والمحطات + + + قد يستغرق تطبيق تغييرات الحالات المخصصة ما يصل إلى 30 دقيقة للانتشار عبر شبكة Resgrid. يُنصح مستخدمو التطبيق المحمول بإعادة المزامنة يدوياً (الإعدادات > الإعدادات المتقدمة > إعادة المزامنة). + + + مُنهى + + + حالات الأفراد المخصصة (الإجراءات) + + + حالات الوحدات الحالية + + + مستويات تأهيل الأفراد المخصصة + + + وصف الحالات المخصصة. + + + الحالات المخصصة + + + اسم مجموعة الحالات المخصصة (مثل: 'حالاتي المخصصة') + + + إجراءات/حالات الأفراد الافتراضية + + + تأهيل الأفراد الافتراضي + + + تحذير: سيؤدي هذا الإجراء إلى حذف مجموعة الحالات هذه نهائياً وستعود الأزرار إلى الإعدادات الافتراضية لهذا النوع من الوحدات. هل أنت متأكد من حذف مجموعة الحالات هذه؟ + + + نوع التفاصيل + + + تم التوزيع + + + تعديل تفاصيل الحالة المخصصة + + + تعديل الحالات المخصصة + + + تعديل المجموعة + + + تعديل حالات الأفراد + + + تعديل مستويات التأهيل + + + قيد التحقيق + + + تم التواصل + + + حالات مخصصة جديدة + + + خيار جديد + + + بدون تفاصيل + + + لا شيء + + + بدون ملاحظة + + + نوع الملاحظة + + + لا يستجيب + + + في الموقع + + + إجراءات الأفراد + + + تأهيل الأفراد + + + حالات الأفراد + + + معاينة الزر + + + يتطلب GPS + + + يستجيب + + + عائد + + + تعيين مستويات التأهيل المخصصة + + + تعيين الحالات المخصصة + + + مستويات التأهيل + + + في مرحلة التجميع + + + المحطات + + + لون النص + + + غير متاح + + + حالة الوحدة + + diff --git a/Core/Resgrid.Localization/Areas/User/Department/Department.ar.resx b/Core/Resgrid.Localization/Areas/User/Department/Department.ar.resx new file mode 100644 index 00000000..c3cd0b00 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Department/Department.ar.resx @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + طلب حذف قسمك. هذه عملية دائمة وغير قابلة للتراجع تستغرق 25 يوماً وتُنفَّذ خارج ساعات العمل. خلال فترة الانتظار يمكنك إلغاء الطلب إذا رغبت. + + + طلب حذف القسم + + + لقسمك طلب حذف معلّق حالياً. إذا أردت المضي قدماً لا يلزمك فعل أي شيء؛ بعد الطابع الزمني أدناه (خلال عملية الليل اليومية) سيُحذف قسمك وجميع بياناته. إذا أردت إلغاء الطلب والإبقاء على القسم اضغط زر "إلغاء حذف القسم" أدناه. يُرجى ملاحظة أن أي تغييرات على المسؤولين والملّاك ستمنع اكتمال العملية، ويُنصح باستخدام النظام بوضع القراءة فقط لتنزيل البيانات التي تريد حفظها. + + + إعدادات الخرائط + + + تم حفظ إعدادات الخرائط بنجاح. + + + إعدادات خرائط الأفراد + + + إعدادات خرائط الوحدات + + + السماح لحالة بدون بيانات موقع بإخفاء الموقع السابق + + + مدة صلاحية مواقع الأفراد (بالدقائق) + + + السماح لحالة وحدة بدون بيانات موقع بإخفاء الموقع السابق + + + مدة صلاحية مواقع الوحدات (بالدقائق) + + + إذا تم التفعيل وأُرسلت حالة للمستخدم (مثل الانتظار) بدون إحداثيات جغرافية، سيُخفى موقعه على الخريطة. وإلا سيُعرض آخر موقع للمستخدم حتى لو كان قديماً. + + + إذا تم التفعيل وأُرسلت حالة للوحدة (مثل في المقر) بدون إحداثيات جغرافية، سيُخفى موقعها على الخريطة. وإلا سيُعرض آخر موقع للوحدة حتى لو كان قديماً. + + + بالدقائق، المدة التي تبقى خلالها المواقع صالحة للعرض على الخريطة. مثلاً قيمة 60 تعني عرض علامة الشخص على الخريطة لمدة 60 دقيقة ثم تختفي. القيمة 0 تعطّل TTL ويُعرض الموقع بغض النظر عن قِدَمه. + + + بالدقائق، المدة التي تبقى خلالها المواقع صالحة للعرض على الخريطة. مثلاً قيمة 60 تعني عرض علامة الوحدة على الخريطة لمدة 60 دقيقة ثم تختفي. القيمة 0 تعطّل TTL ويُعرض الموقع بغض النظر عن قِدَمه. + + + إعدادات توزيع المجموعات + + + إعدادات توزيع الوحدات + + + التوزيع أيضاً على الأفراد المعيّنين + + + التوزيع أيضاً على المجموعة بأكملها + + + إعدادات الورديات + + + تم حفظ إعدادات الورديات بنجاح. + + + إعدادات التسجيل في الورديات + + + السماح بالتسجيل في مجموعات متعددة + + + الأفراد على الوحدة يُعيّنون حالة الوحدة + + + مالك الحساب + + + العنوان + + + تعذّر التحقق من العنوان المقدم. تحقق من صحته قبل المتابعة. + + + هذا هو عنوان قسمك؛ يمكن أن يكون عنوان محطة واحدة أو مكتبك الإقليمي. يُستخدَم هذا العنوان لتحديد نطاقك وموقعك كمرجع احتياطي لبعض العمليات (مثل توسيط اللوحة الرئيسية). + + + إعدادات API وRSS + + + إعدادات API + + + إعدادات استيراد البلاغات + + + ترتيب البلاغات + + + المدينة + + + المدينة + + + اكتمل في + + + الدولة + + + الدولة + + + إحداثيات GPS لمركز الخريطة الافتراضي + + + حذف الدعوة + + + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الدعوة نهائياً والرابط الموجود في البريد الإلكتروني للمستخدم سيُفضي إلى خطأ. هل أنت متأكد من حذف الدعوة؟ + + + عنوان القسم + + + اسم القسم + + + إعدادات القسم + + + تعطيل الإتاحة التلقائية + + + تعطيل تعيين حالة الأفراد إلى "متاح" تلقائياً بعد ساعة + + + بريد إلكتروني لاستيراد التوزيع + + + هذا هو عنوان بريدك الإلكتروني للإرسال الشامل؛ سيتلقى جميع مستخدمي قسمك (الذين فعّلوا إشعارات البلاغات) تنبيه البلاغ + + + إعدادات التوزيع + + + إعدادات التوزيع + + + البريد الإلكتروني + + + عناوين البريد الإلكتروني + + + أدخل عناوين البريد الإلكتروني مفصولة بفواصل (مثلاً: "test1@test.com, test2@test.com") + + + نوع البريد الإلكتروني + + + فرض تحديث القسم + + + يخزّن Resgrid بعض بيانات القسم مؤقتاً لتحسين الأداء. من أمثلة البيانات المخزنة: مستويات التأهيل وإعدادات القسم وأدوار الأفراد ومجموعاتهم وأسماؤهم. إذا كانت بعض بيانات القسم غير صحيحة قد تحتاج إلى مسح ذاكرة التخزين المؤقت لقسمك. + + + الدعوات + + + خط عرض مركز الخريطة + + + خط العرض (بالتدوين العشري: مثلاً 39.1517) + + + خط طول مركز الخريطة + + + خط الطول (بالتدوين العشري: مثلاً -119.4571) + + + الدقائق للإبقاء على البلاغ مفتوحاً + + + القيمة أعلاه تبقي البلاغات المستوردة بالبريد الإلكتروني مفتوحة لتلك المدة ثم تُغلق. يجب أيضاً تحديد مربع الاختصار للإغلاق التلقائي. + + + معلّق + + + حالة الشخص عند توزيع البلاغ + + + حالة الشخص عند إغلاق البلاغ + + + ترتيب الأفراد + + + إعادة تعيين تأهيل الأفراد + + + إذا احتجت إلى إعادة تعيين مستوى تأهيل جميع الأفراد يومياً، يمكنك ضبط ذلك هنا. مثلاً إعادة تعيين التأهيل إلى "غير متاح" كل يوم للتأكد من أن الأفراد المعلّمين كمتاحين قد تأهّلوا بعد إعادة التعيين. + + + إعادة تعيين حالات الأفراد + + + إذا احتجت إلى إعادة تعيين حالات جميع الأفراد يومياً، يمكنك ضبط ذلك هنا. مثلاً إعادة تعيين الحالة إلى "في الانتظار" كل يوم للتأكد من تحديث حالة الأفراد. + + + الرمز البريدي + + + تزويد روابط RSS\Atom + + + تعذّر على Resgrid تزويد الرقم المطلوب، يُرجى إعادة المحاولة برقم آخر. إذا لم تتمكن من التزويد، يُرجى التواصل معنا. + + + فشل التزويد + + + تقليم (إغلاق تلقائي) البلاغات + + + سيُغلق هذا البلاغات التي أُنشئت تلقائياً (مثلاً عبر بريد إلكتروني أو رسالة نصية أو استيراد صوتي) + + + إعادة إنشاء روابط RSS + + + تحذير: إعادة إنشاء روابط RSS\Atom ستتطلب من جميع القراء/المستهلكين التحديث إلى رابط جديد. هل أنت متأكد من إعادة الإنشاء؟ + + + إعادة إرسال الدعوة + + + تحذير: سيؤدي هذا الإجراء إلى إعادة إرسال الدعوة إلى عنوان البريد الإلكتروني للمدعو وإعادة تعيين تاريخ الإرسال. هل أنت متأكد من إعادة الإرسال؟ + + + إعادة تعيين التأهيل يومياً؟ + + + إعادة تعيين مستوى التأهيل إلى + + + إعادة تعيين الحالة يومياً؟ + + + وقت إعادة تعيين الحالة + + + إعادة تعيين الحالة إلى + + + تغذية RSS للبلاغات النشطة + + + يتيح Resgrid الوصول إلى البلاغات النشطة لقسمك عبر تغذية RSS. يسمح ذلك لأي قارئ تغذية (مثل قارئ المدوّنات أو Microsoft Outlook) بعرض البلاغات الجديدة والتنبيه بها. لأقصى توافق سيُنشئ Resgrid رابطاً فريداً لقراء RSS 2.0. هذا الرابط لا يحمي نفسه (لا اسم مستخدم أو كلمة مرور)، لذا من المهم عدم مشاركته علناً إذا كنت لا تريد أن تكون بيانات البلاغات النشطة عامة. + + + لا يمتلك قسمك روابط RSS مزوّدة. اضغط الزر أدناه لتزويد روابط RSS. زوّد روابط RSS\Atom فقط عند حاجة قسمك إليها. + + + تم حفظ إعدادات التوزيع بنجاح. + + + إرسال الدعوات + + + أُرسل في + + + تعيين حالة أفراد الوردية عند التوزيع + + + إعدادات الورديات + + + المحافظة/الولاية + + + المحافظة/الولاية + + + الشارع + + + الشارع + + + وقت إعادة تعيين التأهيل + + + المنطقة الزمنية + + + ترتيب الوحدات + + + استخدام التوقيت بنظام 24 ساعة + + + استخدام الوردية لتوزيع المجموعات + + + الرمز البريدي + + + حذف القسم + + + يمكنك هنا طلب حذف قسمك. يحق لمالك الحساب فقط طلب حذف القسم. سيُحذف جميع المستخدمين والبيانات المرتبطة بقسمك من نظام Resgrid بعد اكتمال العملية. هذه العملية غير قابلة للتراجع! يمكنك إلغاء الطلب في أي وقت قبل اكتمال العملية والاحتفاظ ببياناتك. سيُحذف قسمك بعد 25 يوماً من تقديم الطلب. + + + طلب الحذف + + + ضع علامة في المربع أدناه لتأكيد طلب الحذف + + + أفهم وأوافق على عملية الحذف + + + إلغاء حذف القسم + + + حذف قسمك + + + تفعيل كتم مستويات التأهيل + + + كتم (صامت) لهذه المستويات من التأهيل + + + حدد مستويات تأهيل الأفراد أدناه التي لن تتلقى أي إشعارات أو توزيع أو تنبيهات أو رسائل أو أي تواصل آخر. الأكثر شيوعاً هي مستويات "خارج الخدمة" أو "في إجازة". + + + إضافة جهة اتصال + + + نوع جهة الاتصال + + + يمكنك هنا التحكم في معلومات رفيعة المستوى حول كل وحدة في نظام Resgrid. ستُضاف خيارات وحدات رفيعة المستوى جديدة هنا. هذه الإعدادات في مراحلها الأولى وقد لا تنتشر بعد إلى جميع أجزاء نظام Resgrid. + + + التقويم + + + المخزون + + + السجلات + + + الصيانة + + + الملاحظات + + + التقارير + + + التدريب + + + الخرائط + + + المراسلة + + + الورديات + + + وحدات القسم + + + تعطيل الوثائق + + + تم حفظ إعدادات وحدات القسم + + + عند إرسال وحدة لحالة وكان المستخدمون معيّنون على أدوار، ستُعيَّن حالة المستخدمين إلى "على الوحدة". + + diff --git a/Core/Resgrid.Localization/Areas/User/Department/DepartmentTypes.ar.resx b/Core/Resgrid.Localization/Areas/User/Department/DepartmentTypes.ar.resx new file mode 100644 index 00000000..b4659413 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Department/DepartmentTypes.ar.resx @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إضافة نوع بلاغ جديد + + + أولويات البلاغات + + + صوت التنبيه + + + افتراضي + + + لديك أولويات بلاغات مخصصة مفعّلة. للعودة إلى الأولويات الافتراضية يجب حذف جميع الأولويات المخصصة. سيؤدي تعديل أولوية موجودة إلى تحديثها لجميع البلاغات التي استخدمتها. + + + أنت تستخدم حالياً أولويات البلاغات الافتراضية. إذا أضفت أي أولويات مخصصة لن تتمكن من استخدام الأولويات الافتراضية (بما في ذلك أصواتها). إذا لم تحدد صوتاً مخصصاً لأولوياتك الجديدة، ستعتمد افتراضياً على صوت دفع بلاغ الأولوية العالية. المستخدمون على الإصدار 5 أو أقل من تطبيق المستجيب والإصدار 2 أو أقل من تطبيق الوحدة لا يدعمون أولويات البلاغات المخصصة. إذا كان لديك مستخدمون على تلك الإصدارات نوصي بعدم إنشاء أولويات مخصصة. + + + أيقونة خريطة نوع البلاغ + + + أيقونة الخريطة + + + اسم نوع البلاغ + + + اسم نوع البلاغ + + + اسم النوع + + + أنواع البلاغات + + + اسم الشهادة + + + اسم الشهادة + + + تحذير: سيؤدي هذا الإجراء إلى حذف نوع الشهادة هذا نهائياً. هل أنت متأكد من حذف نوع البلاغ + + + أنواع الشهادات + + + اسم النوع + + + إجراءات الوحدة الافتراضية + + + تحذير: سيؤدي هذا الإجراء إلى حذف نوع البلاغ هذا نهائياً. هل أنت متأكد من حذف نوع البلاغ + + + تحذير: سيؤدي هذا الإجراء إلى حذف فئة الوثيقة هذه نهائياً. هل أنت متأكد من حذف الفئة + + + تحذير: سيؤدي هذا الإجراء إلى حذف نوع الملاحظة هذا نهائياً. هل أنت متأكد من حذف نوع الملاحظة + + + تحذير: سيؤدي هذا الإجراء إلى حذف نوع الوحدة هذا نهائياً. هل أنت متأكد من حذف نوع الوحدة + + + أنواع الأقسام + + + اسم الفئة + + + اسم فئة الوثيقة الجديدة (النوع) + + + فئات الوثائق + + + تعديل أولوية البلاغ + + + تعديل نوع البلاغ + + + تعديل نوع الوحدة + + + إدارة ترتيب القائمة + + + إضافة أولوية بلاغ جديدة + + + أولوية بلاغ جديدة + + + نوع بلاغ جديد + + + نوع شهادة جديد + + + فئة وثيقة جديدة + + + فئة وثيقة جديدة + + + نوع ملاحظة جديد + + + نوع وحدة جديد + + + اسم نوع الملاحظة (الفئة) + + + أنواع الملاحظات + + + نوع الملاحظة + + + لون الأولوية + + + افتراضي + + + اسم الأولوية + + + اسم الأولوية + + + توزيع الأفراد + + + ترتيب الفرز + + + صوت التنبيه + + + توزيع الوحدات + + + الإجراءات (حالات الوحدة المخصصة) + + + أيقونة الخريطة + + + اسم نوع الوحدة + + + اسم نوع الوحدة + + + أنواع الوحدات + + + أنواع ملاحظات جهات الاتصال + + + إضافة نوع ملاحظة جهة اتصال جديد + + + نوع ملاحظة جهة اتصال جديد + + + اسم نوع ملاحظة جهة الاتصال + + + هل أنت متأكد من حذف نوع ملاحظة جهة الاتصال ذي الاسم؟ + + + اسم نوع ملاحظة جهة الاتصال + + + اسم نوع ملاحظة جهة الاتصال + + + لون نوع ملاحظة جهة الاتصال + + + تعديل نوع ملاحظة جهة الاتصال + + + نوع ملاحظة جهة اتصال جديد + + diff --git a/Core/Resgrid.Localization/Areas/User/Dispatch/Call.ar.resx b/Core/Resgrid.Localization/Areas/User/Dispatch/Call.ar.resx new file mode 100644 index 00000000..09a2f23f --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Dispatch/Call.ar.resx @@ -0,0 +1,138 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + البلاغات النشطة + إضافة بلاغ نشط + إضافة بلاغ مؤرشف + إضافة بلاغ مؤرشف + إضافة بلاغ مؤرشف + أضيف بواسطة + إضافة ملف + أدخل اسم المرفق + إضافة صورة + جهات اتصال إضافية + إضافة بلاغ مرتبط + إضافة ملاحظة + أدخل الملاحظة هنا... + ملاحظات تنبيه لجهة الاتصال + البلاغات المؤرشفة + الصور المرفقة + نوع اتصال البلاغ + مستندات البلاغ + تصدير بلاغ Resgrid + نموذج البلاغ + نموذج البلاغ + معرف البلاغ + معرف CAD أو معرف نظام الاتصال الوارد + المعرف + روابط البلاغ + طبيعة البلاغ + وصف لطبيعة البلاغ + أضيفت الملاحظة بواسطة + أضيفت الملاحظة في + ملاحظات البلاغ + نص الملاحظة + رقم البلاغ + الرقم + البلاغات المرتبطة من (البلاغات الأصل) + البلاغات المرتبطة بـ (البلاغات الفرعية) + قوالب البلاغات + إغلاق البلاغ + إغلاق البلاغ + أغلق بواسطة + أغلق في + ملاحظات الإغلاق + ملاحظات حول إغلاق البلاغ أو سبب الإغلاق + نوع الإنجاز + جهات الاتصال + إنشاء وإرسال البلاغ + حذف البلاغ + حذف البلاغ + سبب الحذف + السبب وراء حذف البلاغ + صوت الإرسال + الأفراد المُرسَلون + الوحدات المُرسَلة + إرسال + اتجاهات القيادة من + هذه صفحة غير مصادق عليها لعرض هذا البلاغ فقط. أنت لست مسجّلاً في Resgrid. لا تشارك هذا الرابط. + اسم الملف + نوع الملف + البحث عن عنوان + البحث عن موقع w3w + تعليم ملاحظة البلاغ + تعليم صورة البلاغ + تعليم ملف البلاغ + أضيفت الصورة بواسطة + طابع وقت الصورة + أضيف الملف بواسطة + طابع وقت الملف + تعليم الصورة + تعليم الملف + سبب التعليم + سبب التعليم + GPS + معرف الحادثة + معرف الحادثة الخارجي الرئيسي أو الأصل + مُعلَّم + اعرف المزيد. + البلاغات المرتبطة + الموقع + العنوان الكامل للبلاغ (الشارع، المدينة، الولاية، الرمز البريدي) + سجّله + سُجِّل في + صفحة الخريطة + صفحة كتاب الخرائط + الاسم + اسم البلاغ + نموذج بلاغ جديد + بلاغ جديد + لا توجد مرفقات + لا توجد ملفات مرفقة بهذا البلاغ + لم يُغلق + ملاحظة + الملاحظات + ملاحظات للبلاغ + غير مُقدَّم + لا يوجد نوع + نشاط الأفراد + الأفراد + أحداث الأفراد + جهة الاتصال الرئيسية + الأولوية + الإجابة على أسئلة البروتوكول + البروتوكولات + نص البروتوكول + إذا أردت إعادة بث هذا البلاغ حدد هذا المربع. سيُرسَل البلاغ إلى جميع المستخدمين المحددين بغض النظر عن مشاركتهم في الإرسال الأول أم لا. + إعادة الإرسال + معرف المرجع + رقم الشريك أو المرجع + إعادة إنشاء أرقام البلاغات + تحذير: ستُحدَّث جميع أرقام بلاغات Resgrid (مثل 16-55) بناءً على التاريخ. هذه العملية غير قابلة للتراجع. + إعادة فتح البلاغ + معلومات الاتصال بالمبلّغ + رقم هاتف أو بريد إلكتروني للمبلّغ + اسم المبلّغ + اسم الشخص الذي أبلغ عن البلاغ + اختر البلاغ + ملاحظة للرابط (اختياري) + اختر قالب البلاغ + اختر البلاغ المراد ربطه + إرسال إشعار + تعيين القالب + الولاية/المنطقة + القالب + الطابع الزمني + النوع + نشاط الوحدة + أحداث الوحدة + الوحدات + تحديث البلاغ + عرض البلاغ + عرض النص + هذا عنوان what3words. + diff --git a/Core/Resgrid.Localization/Areas/User/Dispatch/Dashboard.ar.resx b/Core/Resgrid.Localization/Areas/User/Dispatch/Dashboard.ar.resx new file mode 100644 index 00000000..ed3a75a1 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Dispatch/Dashboard.ar.resx @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + الطلبات النشطة + + + الطلبات المؤرشفة + + + طلب جديد + + + إضافة طلب جديد + + + حالات الوحدات + + diff --git a/Core/Resgrid.Localization/Areas/User/Documents/Documents.ar.resx b/Core/Resgrid.Localization/Areas/User/Documents/Documents.ar.resx new file mode 100644 index 00000000..e1a5fe95 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Documents/Documents.ar.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + للمسؤولين فقط + + + الفئة + + + حذف + + + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الوثيقة نهائياً. هل أنت متأكد من حذف الوثيقة + + + تعديل الوثيقة + + + الجميع + + + الصور + + + وثيقة جديدة + + + اسم الوثيقة + + + العروض التقديمية + + + جداول البيانات + + + رفع + + + لا تُسمح بجميع أنواع الملفات! يجب أن يكون حجم الملف أقل من 10 ميغابايت وأن يحمل أحد الامتدادات التالية (.png, .jpg, .jpeg, .gif, .pdf, .doc, .docx, .txt, .ppt, .pptx, .pps, .ppsx, .odt, .xls, .xlsx, .mp4, .mp3) + + + مرئي لـ + + + عرض الوثيقة + + diff --git a/Core/Resgrid.Localization/Areas/User/Home/EditProfile.ar.resx b/Core/Resgrid.Localization/Areas/User/Home/EditProfile.ar.resx new file mode 100644 index 00000000..2eb051a8 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Home/EditProfile.ar.resx @@ -0,0 +1,110 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + معلومات الحساب + العنوان + العنوان الفعلي للشارع + البريد الإلكتروني + خيارات البلاغات + إشعار فوري + رسالة نصية + الشهادات + تغيير كلمة مرور المستخدم + المدينة + المدينة الفعلية + إذا كنت تغير كلمة مرورك يجب عليك إعادة إدخال كلمة المرور الجديدة هنا + تأكيد كلمة المرور + الدولة + إذا كنت تغير كلمة مرورك يجب عليك إدخال كلمة مرورك الحالية (وليس الجديدة) هنا + كلمة المرور الحالية + حذف حسابك + حذف حساب Resgrid الخاص بك في جميع الأقسام التي تنتمي إليها + مدير القسم + إعدادات القسم + تعطيل المستخدم + تعديل + يجب أن تكون عناوين البريد الإلكتروني فريدة + عنوان البريد الإلكتروني + عنوان البريد الإلكتروني + توجد أخطاء في الملف الشخصي أدناه ولم يمكن حفظه. يُرجى تصحيح الأخطاء أدناه والمحاولة مجدداً. + الاسم الأول + الاسم الأول + المجموعة + إخفاء المستخدم + رقم المنزل + رقم هاتف المنزل + رقم الهوية + رقم التعريف المخصص + مدير المجموعة؟ + ملاحظة: دعم تعدد اللغات في Resgrid غير مكتمل بالكامل. بعض أجزاء الموقع ستظل باللغة الإنجليزية ونعمل على ترجمة كل شيء. خدمات الدعم والوثائق متاحة باللغة الإنجليزية فقط. + اسم العائلة + اسم العائلة + العنوان + عنوان البريد + المدينة + مدينة البريد + الدولة + الرمز البريدي + الرمز البريدي للبريد + الولاية/المنطقة + ولاية/مقاطعة البريد + البريد الإلكتروني + خيارات الرسائل + إشعار فوري + رسالة نصية + شركة الاتصالات + + رقم الجوال + رقم الهاتف الجوال + اتركه فارغاً إذا لم تكن تريد تغيير كلمة مرورك + كلمة المرور الجديدة + عدم استلام النشرات الإخبارية + اتركه فارغاً إذا لم تكن تريد تغيير اسم المستخدم الخاص بك + اسم المستخدم الجديد + مستخدم عادي + البريد الإلكتروني + خيارات الإشعارات + خيارات الإشعارات الأخرى + إشعار فوري + العنوان الفعلي + الرمز البريدي + الرمز البريدي الفعلي + الملف الشخصي + تسليم التقارير + الأدوار + نفس العنوان الفعلي؟ + قد يستغرق تغيير الصورة ما يصل إلى 24 ساعة + انقر هنا لتعيين صورة + جداول التأمين + الولاية/المنطقة + الولاية/المقاطعة الفعلية + الاتصال بالمنزل + الاتصال بالجوال + مفعّل + خيارات الهاتف (الصوت) + الخطة غير مناسبة + خطة قسمك الحالية لا تدعم التنبيه الهاتفي الصوتي. رقّ خطتك إلى Ultimate أو أعلى للحصول على هذه الميزة. + المنطقة الزمنية + تعديل الملف الشخصي + نوع المستخدم + لم يتم التحقق من عنوان بريدك الإلكتروني. تحقق منه لضمان استلام التنبيهات والإشعارات. + لم يتم التحقق من رقم جوالك. تحقق منه لضمان استلام تنبيهات الرسائل النصية والإشعارات. + لم يتم التحقق من رقم منزلك. تحقق منه لضمان استلام تنبيهات المكالمات الصوتية. + نوصي بالتحقق من عنوان بريدك الإلكتروني لضمان استمرار تسليم التنبيهات والإشعارات. + نوصي بالتحقق من رقم جوالك لضمان استمرار تسليم تنبيهات الرسائل النصية والإشعارات. + نوصي بالتحقق من رقم منزلك لضمان استمرار تسليم تنبيهات المكالمات الصوتية. + تحقق + أدخل رمز التحقق + تم إرسال رمز التحقق. + نجح التحقق. + فشل التحقق. يُرجى التحقق من الرمز والمحاولة مجدداً. + محاولات تحقق كثيرة جداً. يُرجى المحاولة لاحقاً. + متطلبات كلمة المرور + على الأقل {0} أحرف + رقم واحد على الأقل + حرف كبير وحرف صغير على الأقل + diff --git a/Core/Resgrid.Localization/Areas/User/Home/HomeDashboard.ar.resx b/Core/Resgrid.Localization/Areas/User/Home/HomeDashboard.ar.resx new file mode 100644 index 00000000..335930ce --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Home/HomeDashboard.ar.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ملاحظة الإجراء (اختياري) + + + الإجراءات + + + هل أنت متأكد من إعادة تعيين حالة جميع الأفراد إلى "متاح"؟ + + + طي المجموعات (مرة واحدة) + + + تأكيد: هل أنت متأكد من إعادة تعيين مجموعة المستخدمين بأكملها إلى حالة "الاستعداد"؟ المجموعة: + + + تأكيد إعادة تعيين الحالة + + + رمز القسم: + + + معرّف القسم: + + + معلومات القسم + + + إعادة تعيين الجميع إلى "متاح" + + + إعادة تعيين المجموعة إلى "الاستعداد" + + + إعادة تعيين الحالة + + + تعيين الإجراء الحالي + + + تعيين مستوى التوظيف + + + مستوى التوظيف + + + تعيين مستوى التوظيف + + + رقم النص: + + + تبديل طي المجموعات (يحفظ) + + diff --git a/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.ar.resx b/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.ar.resx new file mode 100644 index 00000000..3d6f06c5 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.ar.resx @@ -0,0 +1,83 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إلغاء + حفظ + الاسم + الوصف + تعديل + حذف + تاريخ الإنشاء + نعم + لا + + + الخرائط الداخلية + الخرائط الداخلية + خريطة داخلية جديدة + الطوابق + هل أنت متأكد من حذف هذه الخريطة الداخلية؟ + + + خريطة داخلية جديدة + خريطة داخلية جديدة + جديد + مثال: المستشفى الرئيسي + وصف اختياري + خط العرض المركزي + خط الطول المركزي + مثال: 39.7392 + مثال: -104.9903 + حد الشمال الشرقي (خط العرض) + حد الشمال الشرقي (خط الطول) + حد الجنوب الغربي (خط العرض) + حد الجنوب الغربي (خط الطول) + + + تعديل الخريطة الداخلية + تعديل الخريطة الداخلية + تعديل + + + الطوابق + الطوابق + إضافة طابق + اسم الطابق + مثال: الطابق 1، القبو، السطح + الترتيب + صورة مخطط الطابق + إضافة طابق + الطوابق + يحتوي على صورة + محرر المناطق + هل تريد حذف هذا الطابق؟ + + + محرر المناطق + محرر المناطق + المناطق + خصائص المنطقة + الاسم + النوع + غرفة + جناح + ممر + بئر الدرج + مصعد + منطقة خطر + نقطة التجمع + منطقة التجهيز + نقطة الدخول + مرافق + شبكة البحث + مخصص + اللون + الوصف + قابل للبحث في الإرسال + حفظ المنطقة + diff --git a/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.cs b/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.cs new file mode 100644 index 00000000..fc51574b --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.cs @@ -0,0 +1,6 @@ +namespace Resgrid.Localization.Areas.User.IndoorMaps +{ + public class IndoorMaps + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.en.resx b/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.en.resx new file mode 100644 index 00000000..f03fe729 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/IndoorMaps/IndoorMaps.en.resx @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Cancel + + + Save + + + Name + + + Description + + + Edit + + + Delete + + + Created + + + Yes + + + No + + + + Indoor Maps + + + Indoor Maps + + + New Indoor Map + + + Floors + + + Are you sure you want to delete this indoor map? + + + + New Indoor Map + + + New Indoor Map + + + New + + + e.g. Main Hospital + + + Optional description + + + Center Latitude + + + Center Longitude + + + e.g. 39.7392 + + + e.g. -104.9903 + + + NE Bound Lat + + + NE Bound Lon + + + SW Bound Lat + + + SW Bound Lon + + + + Edit Indoor Map + + + Edit Indoor Map + + + Edit + + + + Floors + + + Floors + + + Add Floor + + + Floor Name + + + e.g. Floor 1, Basement, Roof + + + Order + + + Floor Plan Image + + + Add Floor + + + Floors + + + Has Image + + + Zone Editor + + + Delete this floor? + + + + Zone Editor + + + Zone Editor + + + Zones + + + Zone Properties + + + Name + + + Type + + + Room + + + Wing + + + Corridor + + + Stairwell + + + Elevator + + + Hazard Zone + + + Assembly Point + + + Staging Area + + + Access Point + + + Utility + + + Search Grid + + + Custom + + + Color + + + Description + + + Searchable in dispatch + + + Save Zone + + diff --git a/Core/Resgrid.Localization/Areas/User/Inventory/Inventory.ar.resx b/Core/Resgrid.Localization/Areas/User/Inventory/Inventory.ar.resx new file mode 100644 index 00000000..c586e122 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Inventory/Inventory.ar.resx @@ -0,0 +1,34 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + نشط + أضيف بواسطة + أضيف في + إضافة نوع مخزون + تعديل المخزون + الكمية + الدفعة + الرقم التسلسلي للدفعة + أنشأه + تعديل + تعديل نوع المخزون + للعناصر التي لا تنتهي صلاحيتها + المجموعة + سجل المخزون + أنواع المخزون + تنتهي صلاحية العنصر بعد (أيام) + إدارة الأنواع + بدون مجموعة + بدون وحدة + المحطة + اسم النوع + الأنواع + الوحدة + وحدة القياس + عرض السجل + عرض إدخال المخزون + diff --git a/Core/Resgrid.Localization/Areas/User/Logs/Logs.ar.resx b/Core/Resgrid.Localization/Areas/User/Logs/Logs.ar.resx new file mode 100644 index 00000000..90752048 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Logs/Logs.ar.resx @@ -0,0 +1,59 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + إضافة وحدات إلى السجل + المرفقات + موقع الجثة + عنوان البلاغ + اسم البلاغ + أولوية البلاغ + تحذير: سيؤدي هذا الإجراء إلى حذف هذا السجل نهائياً. هل أنت متأكد من حذف السجل + سجلات التشغيل + سجل جديد + السرد + طبيعة البلاغ + الأفراد + عرض سجل التشغيل + العودة إلى السجلات + المعلومات العامة + ملخص السجل + معرف السجل + نوع السجل + المدة + معلومات البلاغ + عرض البلاغ الكامل + معلومات التدريب + معلومات الاجتماع + معلومات الطب الشرعي + معلومات سجل العمل + الوحدات + المحطة + السبب + دورة التدريب + نوع التدريب + الساعات + نوع الاجتماع + موقع الاجتماع + الأسلوب + الجنس + العمر + العرق + نوع العمل + موقع العمل + سجل تشغيل جديد + تعديل سجل التشغيل + تاريخ البدء + تاريخ الانتهاء + تاريخ السجل + الإجراءات + إضافة أفراد إلى السجل + لا يوجد أفراد + لا توجد وحدات + إغلاق + حفظ + إلغاء + diff --git a/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.ar.resx b/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.ar.resx new file mode 100644 index 00000000..b082fa93 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.ar.resx @@ -0,0 +1,99 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + الخرائط + إدارة الطبقات + الخرائط المخصصة + خيارات الخريطة + إظهار البلاغات + إظهار الأفراد + إظهار الوحدات + إظهار المحطات + إظهار السياجات الجغرافية + إظهار نقاط الاهتمام + إغلاق + حفظ + إلغاء + + + إضافة نقطة اهتمام + إضافة نقطة اهتمام + خط العرض + خط العرض (بالترميز العشري، مثال: 39.1517) + خط الطول + خط الطول (بالترميز العشري، مثال: -119.4571) + ملاحظة + + + إضافة نوع نقطة اهتمام + إضافة نوع نقطة اهتمام + الاسم + وجهة + للدلالة على وجهة محتملة لوحدة أو شخص، مثل مكتب أو نقطة تجمع أو مستشفى أو نقطة دخول. + اللون + العلامة + الأيقونة + لا شيء + + + تعديل الطبقة + تعديل الطبقة + طبقة جديدة + طبقة جديدة + مرئية افتراضياً + هل تريد إظهار هذه الطبقة في كل مرة يتم فيها تحميل الخريطة؟ ملاحظة: كثرة الطبقات المرئية افتراضياً ستُعقّد الخريطة. يمكن للمستخدمين تفعيل الطبقات يدوياً من عناصر التحكم في الخريطة. + وجهة + سيتيح هذا استخدام الإحداثيات من هذه الطبقة في البحث عن العناوين. ملاحظة: إذا لم تكن لديك نقاط قابلة للبحث (حقول نصية) فلا تحدد هذا الخيار لأنه قد يُبطئ عملية الإرسال. + عناصر الطبقة + تعديل الطبقة + إضافة طبقة + + + استيراد نقاط الاهتمام + استيراد نقاط الاهتمام + رفع + استيراد نقاط الاهتمام + + + الطبقات + الطبقات + طبقة جديدة + عدد العناصر + تعديل + حذف + + + التنقل المباشر + التوجيه المباشر + + + نقاط الاهتمام + نقاط الاهتمام + إضافة نوع نقطة اهتمام + عدد النقاط + عرض + إضافة + استيراد + تحذير: سيؤدي هذا إلى حذف نوع نقطة الاهتمام هذا وجميع مواقعه بشكل دائم. هل أنت متأكد من حذف + نوع نقطة الاهتمام؟ + + + التنقل إلى المحطة + التوجيه إلى المحطة + المسافة: + المدة: + + + نوع العرض + نوع العرض + خريطة + معلومات + قائمة + صحيح + خطأ + diff --git a/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.cs b/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.cs new file mode 100644 index 00000000..585880b0 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.cs @@ -0,0 +1,6 @@ +namespace Resgrid.Localization.Areas.User.Mapping +{ + public class Mapping + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.en.resx b/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.en.resx new file mode 100644 index 00000000..2a0cb5dc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Mapping/Mapping.en.resx @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Mapping + + + Manage Layers + + + Custom Maps + + + Map Options + + + Show Calls + + + Show Personnel + + + Show Units + + + Show Stations + + + Show Geofences + + + Show POIs + + + Close + + + Save + + + Cancel + + + + Add POI + + + Add POI + + + Latitude + + + Latitude (Decimal Notation: i.e. 39.1517) + + + Longitude + + + Longitude (Decimal Notation: i.e. -119.4571) + + + Note + + + + Add POI Type + + + Add POI Type + + + Name + + + Is Destination + + + To denote a potential destination for a unit/person. For example an office, rally point, hospital, access point, etc. + + + Color + + + Marker + + + Icon + + + None + + + + Edit Layer + + + Edit Layer + + + New Layer + + + New Layer + + + Is Visible By Default + + + Do you want this layer to be visible every time a map loads? Note: Having too many layers visible by default will complicate the map. Users can turn layers on if they want to see them in the map control. + + + Is Destination + + + This will allow address searching to use coordinates from this layer in the search. Note, if you don't have searchable points (text fields) don't mark as searchable as it can slow down dispatching. + + + Layer Elements + + + Edit Layer + + + Add Layer + + + + Import POIs + + + Import POIs + + + Upload + + + Import POIs + + + + Layers + + + Layers + + + New Layer + + + Item Count + + + Edit + + + Delete + + + + Live Navigation + + + Live Routing + + + + POIs + + + POIs + + + Add POI Type + + + Point Count + + + View + + + Add + + + Import + + + WARNING: This will permanently delete this POI Type and all it's positions. Are you sure you want to delete the + + + POI Type? + + + + Station Navigation + + + Station Routing + + + Distance: + + + Duration: + + + + View Type + + + View Type + + + Map + + + Information + + + List + + + True + + + False + + diff --git a/Core/Resgrid.Localization/Areas/User/Messages/Messages.ar.resx b/Core/Resgrid.Localization/Areas/User/Messages/Messages.ar.resx new file mode 100644 index 00000000..9005dae7 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Messages/Messages.ar.resx @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + المرفقات + + + معاودة الاتصال + + + إنشاء رسالة + + + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الرسالة نهائياً. هل أنت متأكد من حذف الرسالة + + + حذف المحدد + + + استثناء الورديات + + + ينتهي + + + ينتهي في + + + المجلدات + + + من + + + صندوق الوارد + + + تحديد المحدد كمقروء + + + الرسالة + + + صندوق الوارد + + + صندوق الصادر + + + أبداً + + + بدون مجموعة + + + أدخل ملاحظة في مربع النص أعلاه قبل الضغط على زر الرد إذا كنت ترغب في إرسال ملاحظة مع ردك. + + + صندوق الصادر + + + استطلاع + + + قرئت في + + + المستلمون + + + المستلمون + + + الرد + + + إرسال إلى جميع الأفراد + + + إرسال إلى الأفراد في الأدوار/المجموعات المحددة فقط + + + أرسله + + + الرسائل المرسلة + + + الرسائل المرسلة + + + أُرسل في + + + الموضوع + + + الموضوع + + + موضوع/عنوان الرسالة + + + إلى + + + النوع + + + غير مقروء + + + عرض الرسالة + + diff --git a/Core/Resgrid.Localization/Areas/User/Notes/Note.ar.resx b/Core/Resgrid.Localization/Areas/User/Notes/Note.ar.resx new file mode 100644 index 00000000..f14a184e --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notes/Note.ar.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + للمسؤولين فقط + + + المحتوى + + + النص المحتوى للملاحظة + + + الفئة + + + اختر فئة موجودة من القائمة المنسدلة أو اكتب في المربع لإنشاء فئة جديدة. + + + حذف الملاحظة + + + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الملاحظة نهائياً. هل أنت متأكد من حذف الملاحظة؟ + + + تعديل الملاحظة + + + الجميع + + + ملاحظة جديدة + + + إضافة ملاحظة جديدة + + + العنوان + + + عنوان الملاحظة + + + مرئي لـ + + + مرئي للمسؤولين فقط + + + مرئي للجميع + + + عرض الملاحظة + + diff --git a/Core/Resgrid.Localization/Areas/User/Personnel/Person.ar.resx b/Core/Resgrid.Localization/Areas/User/Personnel/Person.ar.resx new file mode 100644 index 00000000..f3ff66a1 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Personnel/Person.ar.resx @@ -0,0 +1,99 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + معلومات الحساب + إضافة شخص + إضافة شخص واحد + تمت إضافة مستخدم موجود + إضافة شخص + إضافة رتبة + إضافة دور + خيارات البلاغات + تغيير كلمة المرور + انقر على مربع الاختيار أدناه لحذف هذا المستخدم. + تأكيد الحذف؟ + أكّد كلمة مرور المستخدم (يجب أن تتطابق مع الكلمة أعلاه) + تأكيد كلمة المرور + بيانات الاتصال + هل أنت متأكد من حذف هذا المستخدم؟ + إذا اخترت حذف هذا المستخدم فستُحذف المعلومات الموضحة أدناه بشكل نهائي. يُوصى بتعطيل المستخدم إذا غادر القسم أو المنظمة. لا تحذف المستخدم إلا بعد مرور وقت كافٍ، أو إذا كان الحساب خطأً أو لم يُستخدم قط. + حذف الشخص + تعديل الدور + البريد الإلكتروني + يجب أن تكون عناوين البريد الإلكتروني فريدة + عنوان البريد الإلكتروني + عنوان البريد الإلكتروني (يجب أن يكون فريداً) + هذا المستخدم + ، بناءً على عنوان البريد الإلكتروني، كان لديه حساب Resgrid في قسم آخر. تمت إضافة حساب المستخدم <b>بإعدادات ملفه الشخصي السابقة (الاسم، أرقام الهاتف، التفضيلات، إلخ)</b> إلى القسم. نظراً لكون المستخدم في أقسام متعددة، يجب عليه تفعيل هذا القسم لرؤية معلوماته من خلال خيار "عرض أقسامك" ضمن قائمة الملف الشخصي. + الاسم الأول + الاسم الأول + المجموعة + الرئيسية + رقم الهوية + رقم التعريف المخصص + مدير المجموعة؟ + اسم العائلة + اسم العائلة + إدارة الدعوات + دعوة عدة أشخاص + إدارة الأدوار + خيارات الرسائل + الجوال + شركة الاتصالات + رقم الجوال + رقم الهاتف الجوال + يجب أن تتكون كلمة المرور من 8 أحرف أو أكثر وتتضمن رقماً وحرفاً كبيراً وحرفاً صغيراً + كلمة المرور الجديدة + لا يوجد أفراد في القسم + لا يوجد أفراد في هذه المجموعة + خيارات الإشعارات + إشعار المستخدم؟ + أزل التحديد إذا كنت لا تريد من Resgrid إشعار المستخدم بإنشاء هذا الحساب. + لا يوجد أفراد غير منتمين لمجموعة + الأفراد + أرقام الهاتف + إشعار فوري + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الرتبة نهائياً. هل أنت متأكد من حذف الرتبة + رتب الأفراد + إعادة تفعيل الشخص + هذا المستخدم + بناءً على عنوان البريد الإلكتروني، كان لديه حساب في قسم + لكنه حُذف سابقاً. تمت إعادة تفعيل حساب المستخدم داخل هذا القسم وسيظهر <b>بإعدادات ملفه الشخصي السابقة (الاسم، أرقام الهاتف، التفضيلات، إلخ)</b> في القسم. + تحذير: سيؤدي هذا الإجراء إلى حذف هذا الدور نهائياً. هل أنت متأكد من حذف الدور + وصف الدور + اسم الدور + أدوار الأفراد + الأدوار + تعيين تأمين الشخص + تعيين حالة الشخص + تعيين التأمين + تعيين التأمين للأفراد المحددين + تعيين الحالة + تعيين الحالة للأفراد المحددين + ملاحظة خاصة + تُحتفظ ببيانات المستخدم الأساسية في النظام للحفاظ على السجلات والتقارير والتاريخ. يُوصى بتعديل جميع البيانات الشخصية في حساب المستخدم قبل حذفه، مثل أرقام الهاتف والعناوين وغيرها. + التأمين + الولاية/المنطقة + رسالة نصية + قد تتحمل رسوماً إضافية مقابل الرسائل النصية القصيرة (SMS) وفقاً لخطة اتصالاتك. + المستخدم + تفاصيل المستخدم + يجب أن يكون اسم المستخدم فريداً + اسم المستخدم + المستخدمون في الرتبة + المستخدمون في الدور + عرض الشخص + إنشاء تقرير + عرض أحداث الشخص + عرض الأحداث + الأحداث الخاصة بـ + هل أنت متأكد من حذف جميع حالات هذا الشخص نهائياً؟ + مسح جميع الحالات لهذا الشخص + حذف الكل + نعم، أنا متأكد + عرض الدور + diff --git a/Core/Resgrid.Localization/Areas/User/Profile/Profile.ar.resx b/Core/Resgrid.Localization/Areas/User/Profile/Profile.ar.resx new file mode 100644 index 00000000..e9e00622 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Profile/Profile.ar.resx @@ -0,0 +1,69 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + إضافة شهادة + إضافة شهادة + أدخل المعلومات أدناه لتعديل شهادة في ملفك الشخصي. تشمل الشهادات مثلاً شهادات EMT وCPR/BLS والمواد الخطرة وغيرها. تتبع الشهادات مفيد لضمان تجديدها قبل انتهاء صلاحيتها وإعلام القسم بالمؤهلات. الحقول بـ <span class="required">خط أزرق مائل</span> مطلوبة. + إضافة تقرير مجدوَل + إضافة جدول تأمين + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الشهادة نهائياً. هل أنت متأكد من حذف الشهادة؟ + رقم الهوية \ رقم الشهادة + رقم الهوية \ رقم الشهادة + اسم الشهادة + الشهادات + تغيير كلمة المرور + تغيير كلمة مرور المستخدم + يمكنك هنا تغيير كلمة مرور المستخدم يدوياً. أدخل كلمة المرور الجديدة وأكّدها. يجب أن تتكون كلمة المرور من 6 أحرف على الأقل. لن يُشعر Resgrid المستخدم بهذا التغيير. الحقول بـ <span class="required">خط أزرق مائل</span> مطلوبة. + تغيير التأمين إلى + تأكيد كلمة المرور + أكّد كلمة مرور هذا المستخدم + أيام الأسبوع + رمز القسم + معرف القسم + أدخل المعلومات أدناه لتعديل شهادة في ملفك الشخصي. تشمل الشهادات مثلاً شهادات EMT وCPR/BLS والمواد الخطرة وغيرها. تتبع الشهادات مفيد لضمان تجديدها قبل انتهاء صلاحيتها. الحقول بـ <span class="required">خط أزرق مائل</span> مطلوبة. + تعديل الشهادة + تعديل الملف الشخصي + تعديل التقرير المجدوَل + تعديل جدول التأمين + إرسال بريد إلكتروني للمستخدم؟ + حدد هذا المربع إذا أردت إرسال بريد إلكتروني للمستخدم يحتوي على اسم المستخدم وكلمة المرور الجديدة. + تنتهي في + تنتهي في + صادرة عن + اسم الجهة المُصدِرة + صادرة في + الانضمام لقسم + الانضمام لقسم + يجب عليك تقديم معرف القسم ورمزه الحالي للقسم الذي تريد الانضمام إليه في Resgrid. + كلمة المرور الجديدة + كلمة المرور الجديدة لهذا المستخدم + يجب أن تتكون كلمة المرور من 8 أحرف أو أكثر وتتضمن رقماً وحرفاً كبيراً وحرفاً صغيراً + تقرير مجدوَل جديد + جدول تأمين جديد + تحذير: سيؤدي هذا الإجراء إلى إزالتك من هذا القسم. هل أنت متأكد؟ + إزالة نفسك من القسم + تسليم التقارير + جداول تسليم التقارير + التقرير المراد تشغيله + الجداول + تعيين كنشط + تحذير: سيؤدي هذا الإجراء إلى تغيير قسمك النشط الحالي، ولا يمكنك تسجيل الدخول إلى أكثر من قسم في نفس الوقت. هل أنت متأكد؟ + تعيين كافتراضي + تحذير: سيؤدي هذا الإجراء إلى تغيير قسمك الافتراضي، وإذا أردت عرض هذا القسم ستحتاج إلى تفعيله بعد ذلك. + تاريخ محدد + تاريخ ووقت محدد + جدول التأمين + جدول التأمين + وقت التشغيل + المنطقة الصالحة + المنطقة التي تسري فيها الشهادة + أقسامك + متطلبات كلمة المرور + على الأقل {0} أحرف + رقم واحد على الأقل + حرف كبير وحرف صغير على الأقل + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/FlaggedReport.ar.resx b/Core/Resgrid.Localization/Areas/User/Reports/FlaggedReport.ar.resx new file mode 100644 index 00000000..37927ba9 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/FlaggedReport.ar.resx @@ -0,0 +1,41 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + تقرير الملاحظات والصور والملفات المُعلَّمة للبلاغات + يعرض هذا التقرير جميع الملاحظات والصور والملفات المُعلَّمة للبلاغات في القسم، بما في ذلك معلومات البلاغ المرتبط والمحتوى أو اسم الملف وتفاصيل التعليم وسبب تعليم كل عنصر. + تاريخ بداية التقرير + تاريخ نهاية التقرير + تشغيل التقرير + تم تطبيق فلتر التاريخ + الملاحظات المُعلَّمة + الصور المُعلَّمة + الملفات المُعلَّمة + مُعلَّم + لم يتم العثور على ملاحظات بلاغات مُعلَّمة لهذا القسم. + لم يتم العثور على صور بلاغات مُعلَّمة لهذا القسم. + لم يتم العثور على ملفات بلاغات مُعلَّمة لهذا القسم. + رقم البلاغ + اسم البلاغ + النوع + العنوان + تاريخ تسجيل البلاغ + الملاحظة + الملاحظة بواسطة + طابع وقت الملاحظة + معلومات التعليم + اسم الملف + الصورة بواسطة + طابع وقت الصورة + نوع الملف + الملف بواسطة + طابع وقت الملف + عُلِّم بواسطة + عُلِّم في + السبب + نطاق التاريخ + أُنشئ التقرير + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx new file mode 100644 index 00000000..73db28fe --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx @@ -0,0 +1,114 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إلغاء + حفظ + الاسم + الوصف + الحالة + الإجراءات + + + المسارات + المسارات + مسار جديد + المسارات النشطة + المحطات + الملف الشخصي + تاريخ الإنشاء + عرض + تعديل + السجل + هل تريد حذف خطة المسار هذه؟ + + + سجل المسار + سجل المسار + السجل + الوحدة + بدأ + انتهى + التفاصيل + + + المسارات النشطة + المسارات النشطة + نشط + لا توجد مسارات نشطة + لا توجد نسخ مسارات قيد التنفيذ حالياً. + الوحدة + المحطات + بدأ + عرض التفاصيل + + + مسار جديد + خطة مسار جديدة + جديد + تفاصيل المسار + الوحدة + -- تعيين عند وقت البدء -- + مسودة + نشط + متوقف مؤقتاً + مؤرشف + لون المسار + ملف تعريف المسار + قيادة + مشياً + دراجة + قيادة (مع الحركة المرورية) + نطاق السياج الجغرافي (م) + استخدام المحطة كنقطة بداية + استخدام المحطة كنقطة نهاية + تحسين ترتيب المحطات + الخريطة & المحطات + يمكن إدارة المحطات بعد إنشاء المسار عبر واجهة برمجة التطبيقات أو نموذج التعديل. + إنشاء المسار + + + تعديل المسار + تعديل خطة المسار + تعديل + # + النوع + العنوان + الأولوية + حفظ التغييرات + + + تفاصيل المسار + عرض + خريطة المسار + التفاصيل + الحالة + الملف الشخصي + السياج الجغرافي + المسافة + المدة + + + تفاصيل نسخة المسار + نسخة المسار + تفاصيل النسخة + معلومات النسخة + بدأ + انتهى + التقدم + الجدول الزمني للمحطات + معلق + تم الوصول + مكتمل + تم التخطي + غير معروف + وصول: + مغادرة: + مكوث: + تخطي: + محطة + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.cs b/Core/Resgrid.Localization/Areas/User/Routes/Routes.cs new file mode 100644 index 00000000..85f715db --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.cs @@ -0,0 +1,6 @@ +namespace Resgrid.Localization.Areas.User.Routes +{ + public class Routes + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx new file mode 100644 index 00000000..5643d166 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Cancel + + + Save + + + Name + + + Description + + + Status + + + Actions + + + + Routes + + + Routes + + + New Route + + + Active Routes + + + Stops + + + Profile + + + Created + + + View + + + Edit + + + History + + + Delete this route plan? + + + + Route History + + + Route History + + + History + + + Unit + + + Started + + + Ended + + + Detail + + + + Active Routes + + + Active Routes + + + Active + + + No Active Routes + + + There are no route instances currently in progress. + + + Unit + + + Stops + + + Started + + + View Details + + + + New Route + + + New Route Plan + + + New + + + Route Details + + + Unit + + + -- Assign at start time -- + + + Draft + + + Active + + + Paused + + + Archived + + + Route Color + + + Route Profile + + + Driving + + + Walking + + + Cycling + + + Driving (Traffic) + + + Geofence Radius (m) + + + Use Station as Start + + + Use Station as End + + + Optimize Stop Order + + + Map & Stops + + + Stops can be managed after creating the route via the API or edit form. + + + Create Route + + + + Edit Route + + + Edit Route Plan + + + Edit + + + # + + + Type + + + Address + + + Priority + + + Save Changes + + + + Route Detail + + + View + + + Route Map + + + Details + + + Status + + + Profile + + + Geofence + + + Distance + + + Duration + + + + Route Instance Detail + + + Route Instance + + + Instance Detail + + + Instance Info + + + Started + + + Ended + + + Progress + + + Stop Timeline + + + Pending + + + Checked In + + + Completed + + + Skipped + + + Unknown + + + In: + + + Out: + + + Dwell: + + + Skip: + + + Stop + + diff --git a/Core/Resgrid.Localization/Areas/User/Security/Security.ar.resx b/Core/Resgrid.Localization/Areas/User/Security/Security.ar.resx new file mode 100644 index 00000000..0f3304ec --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Security/Security.ar.resx @@ -0,0 +1,328 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + الأمان والصلاحيات + يمكنك هنا تعيين الصلاحيات لقسمك، مثل تحديد من يمكنه إنشاء البلاغات أو من هو مخوّل بإنشاء المستخدمين وإزالتهم. ستسري التغييرات على الصلاحيات عند تسجيل الدخول التالي إلى تطبيق Resgrid. + سجلات التدقيق + الصلاحية + ملاحظة + القيمة + الأدوار + إلزامية المصادقة الثنائية (2FA) + اشترط المصادقة الثنائية عبر تطبيق المصادقة للمستخدمين الإداريين. عند التفعيل سيُعاد توجيه المسؤولين الذين لم يُعدّوا المصادقة الثنائية للتسجيل قبل الوصول إلى الميزات الإدارية. + اشتراط المصادقة الثنائية للمسؤولين + يتحكم في المستخدمين الإداريين الذين يجب عليهم التسجيل في المصادقة الثنائية عبر تطبيق المصادقة (Google Authenticator أو Microsoft Authenticator أو Authy وغيرها). + معطّل (لا اشتراط) + مدراء القسم + المستخدم المُدير + مدراء القسم + المستخدم المُدير + مدراء المجموعات + تم حفظ إعداد إلزامية المصادقة الثنائية. + فشل حفظ إعداد إلزامية المصادقة الثنائية. + لا يمكن تفعيل إلزامية المصادقة الثنائية: المستخدم المُدير لهذا القسم لم يُفعّل المصادقة الثنائية على حسابه. يجب على المستخدم المُدير تفعيل المصادقة الثنائية أولاً قبل تشغيل هذا الإعداد. + لا يمكن تفعيل إلزامية المصادقة الثنائية: لم تُفعّل المصادقة الثنائية على حسابك. يجب عليك تفعيلها أولاً قبل اشتراطها على الآخرين. + لا يمكن تفعيل إلزامية المصادقة الثنائية: لم يُفعّل كلٌّ منك ومن المستخدم المُدير المصادقة الثنائية. يجب على كليهما تفعيلها قبل تشغيل هذا الإعداد. + هذا الإعداد مقفل حتى تتحقق الشروط المذكورة أعلاه. + الصلاحية + ملاحظة + الاختيار + المجموعة فقط + الأدوار + لا توجد أدوار + غير قابل للتطبيق + الأمان والصلاحيات + يمكنك هنا تعيين الصلاحيات لقسمك، مثل تحديد من يمكنه إنشاء البلاغات أو من هو مخوّل بإنشاء المستخدمين وإزالتهم. ستسري التغييرات على الصلاحيات عند تسجيل الدخول التالي إلى تطبيق Resgrid. + من يمكنه إضافة مستخدمين + يحدد هذا الخيار من يمكنه إضافة مستخدمين/أفراد للقسم. افتراضياً يستطيع مدراء القسم فقط (والعضو المُدير) إضافة مستخدمين. يمكن السماح لمدراء المجموعات أيضاً بإضافة مستخدمين (مقيّد بالمجموعة التي يديرونها فقط). + من يمكنه إزالة مستخدمين + يحدد هذا الخيار من يمكنه إزالة مستخدمين/أفراد من القسم. افتراضياً يستطيع مدراء القسم فقط (والعضو المُدير) إزالة مستخدمين. يمكن السماح لمدراء المجموعات بإزالة مستخدمين في مجموعاتهم فقط. + من يمكنه إنشاء بلاغات + يحدد هذا الخيار من يمكنه إنشاء بلاغات يدوياً من نظام Resgrid. افتراضياً يمكن للجميع إنشاء بلاغات. + من يمكنه حذف بلاغات + يحدد هذا الخيار من يمكنه حذف بلاغات من نظام Resgrid. افتراضياً يمكن للجميع حذف البلاغات. + من يمكنه إغلاق بلاغات + يحدد هذا الخيار من يمكنه إغلاق بلاغات من نظام Resgrid. افتراضياً يمكن للجميع إغلاق البلاغات. + من يمكنه إضافة بيانات للبلاغات + يحدد هذا الخيار من يمكنه إضافة بيانات كالصور والملاحظات والملفات للبلاغات. افتراضياً يمكن للجميع إضافة بيانات للبلاغات. + من يمكنه إنشاء تدريبات + يحدد هذا الخيار من يمكنه إنشاء تدريبات. افتراضياً يستطيع مدراء القسم فقط إنشاء التدريبات. + من يمكنه إضافة مستندات + يحدد هذا الخيار من يمكنه إضافة مستندات. افتراضياً يمكن للجميع إضافة مستندات. + من يمكنه إنشاء إدخالات تقويم + يحدد هذا الخيار من يمكنه إنشاء إدخالات تقويم. افتراضياً يمكن للجميع إنشاء إدخالات تقويم. + من يمكنه إنشاء ملاحظات + يحدد هذا الخيار من يمكنه إنشاء ملاحظات. افتراضياً يمكن للجميع إنشاء ملاحظات. + من يمكنه إضافة إدخالات سجل + يحدد هذا الخيار من يمكنه إضافة إدخالات سجل. افتراضياً يمكن للجميع إضافة إدخالات سجل. + من يمكنه إنشاء ورديات + يحدد هذا الخيار من يمكنه إنشاء الورديات وتعديلها. افتراضياً يستطيع مدراء القسم فقط إنشاء الورديات وتعديلها. + من يمكنه عرض المعلومات الشخصية + يحدد هذا الخيار من يمكنه عرض المعلومات الشخصية (البيانات التعريفية) عن الأفراد في النظام، مثل عناوين البريد الإلكتروني وأرقام الهاتف. افتراضياً يمكن للجميع عرض هذه المعلومات. + من يمكنه تعديل المخزون + يحدد هذا الخيار من يمكنه تعديل مستويات المخزون في النظام. افتراضياً يمكن للجميع تعديل المخزون. + من يمكنه رؤية موقع الأفراد + يحدد هذا الخيار من يمكنه رؤية موقع الأفراد على الخرائط. لتقييد الخيار على مدراء المجموعات والأدوار داخل المجموعة يجب تحديد خيار المجموعة فقط. + من يمكنه رؤية موقع الوحدات + يحدد هذا الخيار من يمكنه رؤية موقع الوحدات على الخرائط. لتقييد الخيار على مدراء المجموعات والأدوار داخل المجموعة يجب تحديد خيار المجموعة فقط. + من يمكنه إرسال رسائل + يحدد هذا الخيار من يمكنه إنشاء الرسائل الداخلية وإرسالها. افتراضياً يمكن للجميع إنشاء الرسائل وإرسالها. + من يمكنه عرض المستخدمين + افتراضياً يمكن لجميع المستخدمين رؤية بقية المستخدمين في النظام. يتيح هذا الخيار تقييد من يمكنه رؤية المستخدمين. + من يمكنه عرض الوحدات + افتراضياً يمكن لجميع المستخدمين رؤية جميع الوحدات في النظام. يتيح هذا الخيار تقييد من يمكنه عرض الوحدات. + من يمكنه عرض جهات الاتصال + افتراضياً يمكن لجميع المستخدمين رؤية جميع جهات الاتصال في النظام. يتيح هذا الخيار تقييد من يمكنه عرض جهات الاتصال. المستخدمون الذين لا يمكنهم عرض جهات الاتصال لن يتمكنوا من إضافتها لبلاغ. + من يمكنه تعديل أو إنشاء جهات الاتصال + افتراضياً يمكن لجميع المستخدمين إنشاء جهات الاتصال وتعديلها. يتيح هذا الخيار تقييد من يمكنه إنشاء جهات الاتصال أو تعديلها. + من يمكنه حذف جهات الاتصال + افتراضياً يمكن لجميع المستخدمين حذف جهات الاتصال. يتيح هذا الخيار تقييد من يمكنه حذف جهات الاتصال. + من يمكنه إنشاء/تعديل سير العمل + يحدد هذا الخيار من يمكنه إنشاء سير العمل وتعديلها وحذفها وخطواتها. افتراضياً يستطيع مدراء القسم فقط إدارة سير العمل. + من يمكنه إدارة بيانات اعتماد سير العمل + يحدد هذا الخيار من يمكنه إنشاء بيانات الاعتماد المشفرة وتعديلها وحذفها المستخدمة في إجراءات سير العمل. افتراضياً يستطيع مدراء القسم فقط إدارة بيانات الاعتماد. + من يمكنه عرض تشغيلات سير العمل + يحدد هذا الخيار من يمكنه عرض سجل تنفيذ سير العمل وسجلات التشغيل ولوحات صحة النظام. افتراضياً يستطيع مدراء القسم فقط عرض تشغيلات سير العمل. + تسجيل الدخول الموحد (SSO) وSCIM + تسجيل الدخول الموحد وإدارة الهويات + SSO / SCIM + سياسة الأمان + إضافة إعداد OIDC + إضافة إعداد SAML 2.0 + ما هو SSO وSCIM؟ + تسجيل الدخول الموحد (SSO) + يتيح لأعضاء القسم تسجيل الدخول بهوياتهم المؤسسية الحالية (Microsoft Entra ID أو Okta أو Google Workspace وغيرها) بدلاً من كلمة مرور Resgrid منفصلة. + OIDC — بروتوكول حديث، مثالي لـ Entra وOkta وAuth0 وGoogle + SAML 2.0 — مدعوم على نطاق واسع من الجهات الحكومية والمؤسسية + إدارة هويات SCIM 2.0 + مزامنة تلقائية للمستخدمين من موفر هويتك. عند إضافة أو إزالة موظفين في دليلك المؤسسي يعكس Resgrid هذه التغييرات تلقائياً دون خطوات دعوة/إزالة يدوية. + إنشاء أعضاء جدد تلقائياً عند إضافتهم في موفر الهوية + تعطيل/إزالة الأعضاء عند إلغاء تزويدهم + مزامنة الأسماء وعناوين البريد الإلكتروني + سياسة الأمان + تطبيق ضوابط الامتثال على مستوى القسم إلى جانب تسجيل الدخول الموحد: + إلزام المصادقة متعددة العوامل لجميع الأعضاء + تقييد تسجيل الدخول على SSO فقط (تعطيل كلمات المرور) + تقييد تسجيل الدخول على نطاقات IP CIDR محددة + تعيين قواعد انتهاء صلاحية كلمة المرور وتعقيدها + تصنيف مستوى البيانات (غير مصنّف / CUI / سري) + رابط الاكتشاف لتطبيق الجوال + يستخدم تطبيق Resgrid للجوال هذا الرابط لاكتشاف إعدادات SSO الخاصة بك قبل عرض شاشة تسجيل الدخول. شاركه مع فريق الجوال إذا لزم الأمر. + نسخ + تم النسخ إلى الحافظة! + إعدادات SSO + لا توجد إعدادات SSO بعد. استخدم الأزرار أعلاه لإضافة OIDC أو SAML 2.0. + الموفر + المعرّف / نقطة النهاية + الحالة + تسجيل الدخول المحلي + التزويد التلقائي + SCIM + تاريخ الإنشاء + الإجراءات + مفعّل + معطّل + نعم + SSO فقط + مفعّل + معطّل + نشط + لا يوجد رمز + معطّل + تعديل + SCIM + تأكيد الحذف + هل أنت متأكد من حذف إعداد SSO الخاص بـ {0}؟ لا يمكن التراجع عن هذا الإجراء. + إلغاء + حذف + إعداد SSO جديد + تعديل إعداد SSO + جديد + تعديل + الخطوة 1 + الموفر والإعدادات الأساسية + بروتوكول موفر الهوية + تفعيل إعداد SSO هذا + يكون إعداد واحد فقط لكل نوع موفر نشطاً في وقت واحد. + السماح بتسجيل الدخول بكلمة مرور محلية + عند التحديد يمكن للمستخدمين تسجيل الدخول باسم المستخدم وكلمة المرور بالإضافة إلى SSO. عطّل هذا مع إعداد سياسة الأمان "اشتراط SSO" لفرض تسجيل الدخول عبر SSO فقط. + التزويد التلقائي للمستخدمين الجدد + إنشاء حساب Resgrid تلقائياً عندما يتحقق مستخدم عبر SSO لأول مرة ولا يوجد بريد إلكتروني مطابق. اتركه معطّلاً لاشتراط الدعوة اليدوية أولاً. + تفعيل إدارة هويات SCIM 2.0 + يتيح لموفر هويتك إنشاء/تحديث/تعطيل الأعضاء تلقائياً. بعد الحفظ انتقل إلى صفحة إعداد SCIM لإنشاء رمز الحامل. + الرتبة الافتراضية للمستخدمين المُزوَّدين تلقائياً + اختياري. يُطبّق فقط عند إنشاء عضو جديد عبر التزويد التلقائي. + الخطوة 2 — OIDC + إعدادات OpenID Connect + أين تجد هذه القيم: في موفر هويتك سجّل Resgrid كعميل عام (PKCE، لا يلزم سر العميل للجوال) أو تطبيق ويب (مع سر للتدفقات من جانب الخادم). انسخ معرف العميل ورابط الجهة المُصدِرة من التطبيق المسجّل. + رابط الجهة / الجهة المُصدِرة + https://login.microsoftonline.com/{tenant-id}/v2.0 + أمثلة: Entra ID: https://login.microsoftonline.com/{tenant-id}/v2.0 | Okta: https://{your-domain}.okta.com/oauth2/default | Google: https://accounts.google.com + معرف العميل + xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + المعرف العام للعميل المُعيَّن من موفر هويتك. آمن للعرض — ليس سراً. + سر العميل + السر مخزّن + مشفّر في حالة السكون باستخدام مفتاح خاص بقسمك. اتركه فارغاً إذا كنت تستخدم PKCE (جوال/SPA — لا يلزم سر). + اتركه فارغاً للاحتفاظ بالسر الحالي دون تغيير. + الخطوة 2 — SAML 2.0 + إعدادات SAML 2.0 + أين تجد هذه القيم: في موفر هويتك أنشئ تطبيق SAML جديداً. أدخل معرف كيان SP ورابط ACS المُعروضَين أدناه في موفر هويتك ثم الصق رابط بيانات تعريف IdP أو شهادته هنا. + معرف كيان SP (أدخله في موفر هويتك) + رابط ACS (خدمة المستهلك للتأكيدات — أدخله في موفر هويتك) + يستخدم هذا الرابط رمز قسم مشفّراً ولا يكشف أبداً رمز قسمك العادي. + معرف كيان SP (قابل للتعديل) + https://app.resgrid.com/saml/DEPT + يجب أن يتطابق تماماً مع ما أدخلته في موفر الهوية. + رابط بيانات تعريف IdP + https://idp.example.com/metadata.xml + سيجلب Resgrid هذا الرابط بشكل دوري للبقاء محدّثاً بشهادات IdP. + رابط ACS (المخزّن) + يُملأ تلقائياً من الرابط المُنشأ أعلاه. عدّله فقط إذا أعددت رابط ACS مختلفاً في موفر هويتك. + شهادة توقيع IdP (PEM) + الشهادة مخزّنة + مشفّرة في حالة السكون. اتركها فارغة للاحتفاظ بالشهادة الحالية. + مفتاح توقيع SP (PEM، اختياري) + المفتاح مخزّن + مشفّر في حالة السكون. اتركه فارغاً إذا لم يشترط موفر هويتك الطلبات الموقّعة. + الخطوة 3 + تعيين السمات + عيّن أسماء المطالبات التي يرسلها موفر هويتك إلى حقول مستخدم Resgrid. اتركه فارغاً لاستخدام أسماء URI القياسية تلقائياً. + JSON تعيين السمات + يجب أن يكون JSON صالحاً. استخدم أزرار الملء السريع على اليمين. + الإعدادات المسبقة للملء السريع + انقر للملء التلقائي لـ JSON التعيين بالإعدادات الافتراضية لموفر هويتك. + مفاتيح حقول Resgrid المدعومة + المفتاح + الوصف + عنوان البريد الإلكتروني للمستخدم + الاسم الأول + اسم العائلة + موضوع موفر الهوية الفريد (لربط الحسابات) + إنشاء الإعداد + حفظ التغييرات + إلغاء + إعداد SCIM 2.0 + إعداد إدارة هويات SCIM 2.0 + إعداد SCIM + العودة إلى SSO + مهم — انسخ رمز حامل SCIM الآن + يُعرض هذا الرمز مرة واحدة فقط ولا يمكن استرجاعه مجدداً. انسخه فوراً والصقه في إعداد SCIM لموفر هويتك. إذا فقدته انقر على "تدوير الرمز" لإنشاء رمز جديد. + نسخ الرمز + يُخزَّن هذا الرمز مشفّراً في قاعدة بيانات Resgrid باستخدام مفتاح تشفير خاص بقسمك. + حالة SCIM + الموفر + SCIM مفعّل + نعم + لا + رمز الحامل + مُعدَّ + غير مُعيَّن + تدوير رمز SCIM + إنشاء رمز SCIM + التدوير ينشئ رمزاً جديداً ويُبطل القديم. + هل أنت متأكد؟ أي تكامل SCIM نشط سيتوقف حتى تُحدّث الرمز في موفر هويتك. + إعدادات موصّل SCIM + أدخل هذه القيم في إعداد إدارة هويات SCIM لموفر هويتك. + الإعداد + القيمة + رابط الأساس لموصّل SCIM + طريقة المصادقة + ترويسة التفويض + اسم الترويسة المخصصة + قيمة الترويسة المخصصة + الموارد المدعومة + طريقة التحديث المدعومة + دليل الإعداد خطوة بخطوة + Okta + Microsoft Entra ID + Google Workspace + أخرى / عام + يمكن تهيئة أي عميل SCIM 2.0 متوافق بالمعلومات التالية: + تعيين حقول SCIM في Resgrid + المعامل + حقل SCIM + التأثير في Resgrid + إدارة هويات SCIM 2.0 + مرجع SCIM API + يستدعي موفر هويتك هذه نقاط النهاية باستخدام مصادقة رمز حامل HTTP. يجب أن تتضمن جميع الطلبات ترويسة التفويض وترويسة معرف القسم الموضّحة أدناه. + نقطة النهاية + الطريقة + الوصف + رابط الأساس + ترويسة التفويض + ترويسة القسم + مطلوبة في كل طلب حتى يتمكن Resgrid من التوجيه إلى القسم الصحيح. + أمثلة على الطلبات + قائمة المستخدمين (GET) + تزويد مستخدم (POST) + تعطيل مستخدم (PATCH) + تحديث كامل (PUT) + سرد / البحث عن مستخدمين + الحصول على مستخدم واحد بمعرف SCIM + إنشاء (تزويد) مستخدم جديد + تحديث كامل (استبدال جميع السمات) + تحديث جزئي (مثل التعطيل) + حذف / إلغاء تزويد مستخدم + سرد المجموعات (للقراءة فقط) + تزويد رمز SCIM + أنشئ أو دوّر رمز الحامل الذي يستخدمه موفر هويتك للمصادقة على طلبات SCIM. يُعرض الرمز مرة واحدة فقط — انسخه قبل إغلاق هذا الحوار. + تزويد الرمز + تدوير الرمز + رمز حامل SCIM + يُعرض هذا الرمز مرة واحدة فقط ولا يمكن استرجاعه. انسخه الآن والصقه في إعداد SCIM لموفر هويتك. + تدوير الرمز سيُبطل الرمز الحالي فوراً. أي مزامنة SCIM نشطة ستفشل حتى تُحدّث الرمز في موفر هويتك. هل تريد المتابعة؟ + سيُنشئ هذا رمز حامل SCIM جديداً لهذا الإعداد. انسخه واحتفظ به بأمان — لن يُعرض إلا مرة واحدة. هل تريد المتابعة؟ + نسخ الرمز + مخزّن مشفّراً في قاعدة بيانات Resgrid باستخدام مفتاح خاص بقسمك. + دليل إعداد SCIM الكامل + للحصول على تعليمات خطوة بخطوة خاصة بكل موفر (Okta وMicrosoft Entra ID وGoogle Workspace) وإدارة الرموز، يُرجى زيارة صفحة إعداد SCIM لكل إعداد. + سياسة أمان القسم + سياسة أمان القسم + سياسة الأمان + العودة إلى SSO + تم حفظ سياسة الأمان بنجاح. + لا يوجد إعداد SSO نشط. يمكنك تهيئة سياسات كلمة المرور أدناه، لكن لا يمكن تفعيل "اشتراط SSO" حتى يكون لديك إعداد SSO نشط. + تهيئة SSO ← + ضوابط المصادقة + اشتراط المصادقة متعددة العوامل لجميع الأعضاء + الأعضاء الذين لم يسجّلوا في المصادقة متعددة العوامل سيُطلب منهم الاشتراك عند تسجيل الدخول التالي. + اشتراط SSO — تعطيل تسجيل الدخول بكلمة المرور + يتطلب إعداد SSO نشطاً + تحذير: تفعيل هذا يحجب جميع تسجيلات الدخول باسم المستخدم/كلمة المرور. تأكد من أن مسؤولاً واحداً على الأقل اختبر تسجيل الدخول عبر SSO بنجاح قبل التفعيل. + مهلة الجلسة (بالدقائق) + 0 = استخدام الإعداد الافتراضي للنظام. 480 = 8 ساعات. + الحد الأقصى للجلسات المتزامنة لكل مستخدم + 0 = غير محدود. عادةً تُعيّن البيئات الحكومية القيمة 1. + نطاقات IP المسموح بها (CIDR) + كتلة CIDR واحدة لكل سطر أو مفصولة بفواصل. فارغ = السماح للجميع. سيُرفض تسجيل الدخول من خارج هذه النطاقات. + مستوى تصنيف البيانات + يُستخدم لتقارير الامتثال وسجلات التدقيق. + سياسة كلمة المرور + تنطبق سياسات كلمة المرور على تسجيلات الدخول المحلية (غير SSO) فقط. إذا فعّلت "اشتراط SSO" أعلاه فهذه الإعدادات لن يكون لها تأثير. + انتهاء صلاحية كلمة المرور (بالأيام) + 0 = كلمات المرور لا تنتهي صلاحيتها. 90 يوماً نموذجي لبيئات CUI. + الحد الأدنى لطول كلمة المرور + الحد الأدنى 8 (الافتراضي للنظام). سياسات القسم يمكنها فقط زيادة هذا الحد. تُوصي NIST بـ 12+ وتشترط CUI 14+. + تعقيد كلمة المرور المُطبَّق من النظام + تُلزَم جميع حسابات Resgrid باستيفاء معيار تعقيد كلمة المرور التالي. لا يمكن تعطيل هذا المعيار بسياسة القسم. + 8 أحرف على الأقل (أو الحد الأدنى لطول القسم أعلاه) + رقم واحد على الأقل + حرف كبير وحرف صغير على الأقل + اشتراط تعقيد كلمة المرور + يُلزم بوجود حرف كبير واحد على الأقل ورقم واحد وحرف خاص واحد. + الإعدادات المسبقة السريعة + حكومي / CUI + مؤسسي قياسي + الحد الأدنى + حفظ سياسة الأمان + إلغاء + لا يمكن تفعيل تسجيل الدخول عبر SSO فقط: لا يوجد إعداد SSO نشط. أنشئ إعداد SSO وفعّله أولاً. + لا يمكن أن تكون كلمة المرور فارغة. + يجب أن تحتوي كلمة المرور على رقم واحد على الأقل. + يجب أن تحتوي كلمة المرور على حرف كبير واحد على الأقل. + يجب أن تحتوي كلمة المرور على حرف صغير واحد على الأقل. + يجب أن تتكون كلمة المرور من {0} أحرف على الأقل. + لا يمكن أن يكون الحد الأدنى لطول كلمة المرور أقل من الإعداد الافتراضي للنظام وهو 8 أحرف. + diff --git a/Core/Resgrid.Localization/Areas/User/Shifts/Shifts.ar.resx b/Core/Resgrid.Localization/Areas/User/Shifts/Shifts.ar.resx new file mode 100644 index 00000000..d8b70cdc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Shifts/Shifts.ar.resx @@ -0,0 +1,175 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + حذف الوردية الثابتة + تعديل وردية ثابتة سيؤدي إلى مسح جميع التكليفات أو التسجيلات لهذه الوردية وإعادة توزيعها وفقاً للإعدادات الجديدة. إذا كانت لديك أي تكليفات أو تسجيلات لهذه الوردية فستُحذف وتُطبّق الإعدادات الجديدة. + تعديل الوردية الثابتة + تاريخ/وقت الانتهاء + ملاحظة: نص التقويم باللون الأسود، يُرجى مراعاة ذلك عند اختيار لون الوردية إذ سيُستخدم اللون خلفيةً للنص. + التاريخ والوقت اللذان تنتهي فيهما الوردية (أي العودة إلى المقر) حيث تُعتبر الجهات التابعة لها متاحة. + التاريخ والوقت اللذان تبدأ فيهما الوردية (أي بداية التنقل) حيث تُعتبر الجهات التابعة لها ملتزمة. + تاريخ/وقت البدء + عرض يوم الوردية الثابتة + الورديات + ورردياتك + تأمين الوردية + ورديات المجموعات المتكررة + إضافة وردية مجموعة متكررة + الاسم + النوع + الجدول الزمني + المجموعات + الأفراد + مُكلَّف + تسجيل + يدوي + مخصص + 48 عمل / 96 راحة + 24 عمل / 48 راحة + 24 عمل / 72 راحة + عرض التقويم + تعديل التفاصيل + تعديل التقويم + تعديل المجموعات + حذف + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الوردية نهائياً. هل أنت متأكد من حذف الوردية + التقويم + إضافة وردية ثابتة + وردية جديدة + مرحباً بك في معالج الوردية الجديدة. سيرشدك هذا المعالج خلال خطوات إنشاء وردية جديدة لقسمك. أدخل اسم الوردية ورمزها ولونها الاختياري أدناه. للمتابعة انقر على زر "التالي" في الزاوية السفلية اليمنى. + الاسم + اسم الوردية + مثال: ("وردية أ"، "وردية ب"، "وردية ج") + الرمز + مثال: ("أ"، "ب"، "ج") + نوع التكليف + في حالة التكليف تحدد الأفراد للوردية، وفي حالة التسجيل يقوم الأفراد بتسجيل أنفسهم. + اللون + هنا تحدد الأيام التي ستكون فيها الوردية في الخدمة ووقت بدء الوردية لأول يوم. إذا كانت الوردية متواصلة فسيكون وقت البدء لأول يوم في الوردية (أي اليوم الأول من فترة 48 ساعة). + وقت البدء + متى تبدأ الوردية في اليوم الأول (أو اليوم الوحيد) + وقت الانتهاء + متى تنتهي الوردية في آخر يوم (أو اليوم الوحيد) + يمكنك هنا تهيئة الأدوار المطلوبة لكل مجموعة في قسمك للوردية. انقر على زر "إضافة مجموعة للوردية" لإضافة مجموعة، ويمكن أن تحتوي الوردية على مجموعات متعددة. بعد اختيار المجموعة انقر على "إضافة دور للمجموعة" لإضافة الأدوار المطلوبة. + مجموعة الوردية + أدوار الوردية + إضافة مجموعة للوردية + الآن اختر الأفراد العاملين في هذه الوردية. سيملؤون فتحات الأدوار في المجموعة بشكل ديناميكي بناءً على مجموعاتهم إذا كانت أدوار مجموعات الوردية محددة. + الأفراد غير المنتمين لمجموعة + الأفراد المكلفون بالوردية ولكن غير مكلفين بمحطة أو مجموعة تنظيمية مباشرة (أي المتنقلون أو الاحتياطيون) + انقر على زر الإنهاء أدناه لإنشاء الوردية الجديدة. يمكنك دائماً تعديل الوردية لاحقاً من صفحة قائمة الورديات. + بدء > + الجدول > + الفتحات > + الأفراد > + إنهاء + الأول + السابق + التالي + اسم الوردية مطلوب + رمز الوردية مطلوب + وقت بدء الوردية مطلوب. + تعديل تفاصيل الوردية + رمز الوردية + الأفراد المنتمون للوردية لكن غير مكلفين بمجموعة (أي المتنقلون أو الجوالون) + إلغاء + تحديث الوردية + تعديل تقويم الوردية + تحديث أيام الوردية + تعديل مجموعات الوردية + حفظ مجموعات الوردية + التقويم + تأمين الوردية + الوردية + اختر الوردية لمعالجة تأمينها. ستظهر فقط الورديات التي لديك صلاحية الوصول إليها (مدير المجموعة أو مدير القسم). + يوم الوردية + اختر اليوم لمعالجة تأمينه. + ملاحظة + أدخل ملاحظة حرة للوردية (مثل تأمين الأفراد، التبديلات خلال الوردية، إلخ) + التكليفات + الوحدات + تعيين تأمين يوم الوردية + اختر الأفراد غير المنتمين لمجموعة... + اختر الأفراد للمجموعة... + اختر شخصاً... + الأفراد غير المنتمين لمجموعة + ورردياتك + الوردية + المجموعة + اليوم + موافق عليه + الحالة + الطابع الزمني + لا + نعم + التبادل مكتمل + التبادل جارٍ + عادي + لـ + تحذير: سيؤدي هذا الإجراء إلى إزالتك من هذه الوردية. هل أنت متأكد من رفض الوردية + رفض يوم الوردية + طلب تبادل + إتمام التبادل + طلبات التبادل المعلقة + الوقت + معالجة طلب التبادل + مرفوض + مقبول + مكتمل + عرض تبادل + عرض الوردية + بدء الوردية + تفاصيل يوم الوردية + النوع: + الحالة: + البداية: + النهاية: + القادم + مكتملة + لا يوجد وقت انتهاء + المجموعات + الدور + مطلوب + اختياري + مطلوب + التسجيلات + الأدوار + التبادلات + التبادل + {0} تبادل مع {1} + التسجيل في الوردية + حذف تسجيل الوردية + التسجيل في الوردية مع + نجح التسجيل في الوردية + لقد سجّلت بنجاح في هذا اليوم من الوردية. إذا أردت التسجيل في أيام أخرى من الوردية يجب عليك التسجيل لكل يوم بشكل منفصل. + يبدأ في {0} وينتهي في {1} + يبدأ في {0} + طلب تبادل + المستخدمون المطلوب منهم + انقر داخل الحقل لاختيار المستخدمين لطلب التبادل منهم (تظهر فقط المستخدمون الذين يستوفون متطلبات دور الوردية) + إرسال طلب التبادل + معالجة طلب التبادل + التواريخ المراد تبادلها + انقر داخل الحقل لاختيار الورديات التي أنت مكلف بها لإتمام التبادل. إذا لم تحدد أي يوم فسيكون التبادل غير متوازن. + ملاحظة أو معلومة لهذا التبادل + رفض طلب التبادل + هل أنت متأكد من رفض طلب التبادل هذا؟ + اقتراح طلب تبادل + يبدأ في + إتمام التبادل + التاريخ + لا شيء + إتمام التبادل + دور الوردية + عدد الأدوار + إضافة دور للمجموعة + إضافة أدوار الوردية للمجموعة + إزالة المجموعة + إزالة الدور + إزالة هذا الدور من المجموعة + عدد الدور مطلوب + diff --git a/Core/Resgrid.Localization/Areas/User/Subscription/Subscription.ar.resx b/Core/Resgrid.Localization/Areas/User/Subscription/Subscription.ar.resx new file mode 100644 index 00000000..22ce5879 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Subscription/Subscription.ar.resx @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + تم تحديث معلومات الفواتير بنجاح + + + شكراً لتحديث معلومات الفواتير. لن تُحسَب رسوم على بطاقتك الجديدة الآن، بل ستُستخدَم عند تجديد الاشتراك في موعده المعتاد. + + + شراء إضافة + + + أنت تشتري الإضافة التالية + + + ستُضاف الإضافة المشتراة إلى اشتراكك الحالي وسيتم احتساب حصة نسبية للمدة المتبقية من دورة الفوترة الحالية. سيتم خصم المبلغ من البطاقة المسجلة لديك، لذا تأكد من تحديثها لتجنب أي انقطاع في الخدمة. + + + تحذير + + + لديك إضافة ملغاة من هذا النوع لا تزال فيها مدة متبقية. لتجنب الازدواجية في الفوترة، يُرجى الانتظار حتى نهاية تلك المدة قبل إضافة هذه الإضافة مرة أخرى. إذا كنت لا ترغب في الانتظار، يمكنك الإضافة الآن وقد تُحتسب نسبة من المدة المتبقية. تنتهي مدتك المتبقية في + + + اشترِ الآن + + + اشترِ الآن + + + أنت تشتري الخطة التالية + + + مقابل + + + سنة + + + شهر + + + موعد دفعتك القادمة + + + أنت تتحول من خطة سنوية إلى خطة شهرية وستحتفظ بالرصيد المتبقي من خطتك السنوية. بعد استنفاد هذا الرصيد سيتم الفوترة وفق الجدول الشهري المعتاد. + + + الإجمالي التقديري للترقية + + + تكلفة تقديرية، قد تختلف التكلفة الفعلية قليلاً. + + + عنوان فوترة بطاقة الائتمان + + + عنوان الشارع للفوترة ببطاقة الائتمان + + + يجب أن يتطابق مع عنوان الشارع الذي ترسل إليه كشوفات بطاقة الائتمان + + + الرمز البريدي للفوترة + + + دولة الفوترة + + + معلومات الدفع مؤمّنة بتشفير SSL. <b>لا تحتفظ Resgrid بأي معلومات دفع.</b> + + + الاسم الأول على البطاقة + + + اسم العائلة على البطاقة + + + رقم بطاقة الائتمان كاملاً + + + رمز CVV/CVC + + + رقم مكوّن من 3 أو 4 أرقام على البطاقة + + + مزيد من المعلومات + + + تاريخ انتهاء صلاحية بطاقة الائتمان + + + إلغاء الاشتراك + + + يؤسفنا إلغاء اشتراكك. يُرجى ملء النموذج أدناه لإتمام طلب إلغاء الاشتراك. حقل السبب اختياري، تأكد من تحديد مربع التأكيد ثم اضغط موافق عند ظهور نافذة التأكيد في المتصفح. + + + لن يتم حذف قسمك أو بياناتك، بل سيتوقف فقط تجديد اشتراكك. خلال المدة المتبقية من اشتراكك ستتمكن من الوصول إلى الميزات المتاحة ضمن الخطة الحالية. + + + الخطة + + + الخطة الحالية + + + تاريخ الشراء + + + تأكيد + + + السبب + + + العودة إلى الاشتراكات + + + إلغاء الاشتراك + + + تحذير: سيؤدي هذا الإجراء إلى إلغاء اشتراكك النشط. هل أنت متأكد؟ + + + فشل الإلغاء + + + تعذّر علينا إلغاء اشتراكك. قد يكون ذلك لأنك لا تملك اشتراكاً نشطاً (أي أنك على الخطة المجانية) أو بسبب مشكلة مؤقتة في معالج الدفع. يُرجى المحاولة مرة أخرى بعد بضع دقائق. إذا استمرت المشكلة، يُرجى التواصل معنا. + + + تم إلغاء الاشتراك + + + تم إلغاء اشتراكك. قد يستغرق النظام بضع دقائق لتطبيق هذا التغيير، لكن لن يتم خصم أي مبالغ من بطاقتك بعد الآن. سنحتفظ ببياناتك في حال رغبت في العودة أو استخدام خطة Resgrid المجانية. + + + خطة الاشتراك والفواتير + + + عرض سجل الدفعات + + + تغيير معلومات الفواتير + + + ملغى + + + نشط + + + تاريخ انتهاء الخطة + + + تاريخ تجديد الخطة + + + الأفراد + + + المجموعات + + + الوحدات + + + تحذير + + + قياسي + + + مميز + + + احترافي + + + شامل + + + مؤسسي + + + موحّد + + + استقبال الرسائل النصية + + + التنبيه الهاتفي + + + السعر + + + في السنة + + + في الشهر + + + المبلغ + + + أنت تشتري الخطة التالية + + + اشتراك شهري + + + تتوفر أيضاً خطط أكبر واستضافة خاصة ودعم ذو أولوية ودعم المصدر المفتوح وخدمات التنفيذ. + + + لمزيد من المعلومات. + + + اشتراك سنوي + + + إذا كنت ترغب في تغيير اشتراكك، اضغط على زر "تغيير الخطة" أدناه. سيحسب مزود الدفع الحصة النسبية للمدة المتبقية من خطتك الحالية ويحدد المبلغ المستحق ويخصمه من بطاقتك المسجلة (إذا لزم الأمر). ستتلقى بريداً إلكترونياً بالتفاصيل بعد معالجة التغيير. + + + تواصل معنا + + + التكلفة + + + العميل + + + القسم + + + الوصف + + + تاريخ الانتهاء + + + الفاتورة + + + تاريخ الفاتورة + + + طريقة الدفع + + + شكراً لشرائك. اكتملت عملية الدفع وستكون الإضافة أو ترقية الخطة متاحة قريباً. قد تحتاج إلى تسجيل الخروج وإعادة الدخول لرؤية التغييرات. + + + اكتمل الدفع + + + نأسف، حدثت مشكلة أثناء معالجة دفعتك. اضغط زر الرجوع في المتصفح وتحقق من معلومات الدفع (الرمز البريدي، رقم CVV، تاريخ الانتهاء). + + + فشل الدفع + + + سجل الدفعات + + + نظراً للحجم الكبير من المعاملات، دفعتك في طابور الانتظار حالياً. يمكنك مغادرة هذه الصفحة ومواصلة استخدام Resgrid بشكل طبيعي. بعد معالجة الدفع سيتم ترقية حسابك وستتلقى رسالة بريد إلكتروني منّا. إذا لم تتلقَّ الرسالة خلال 30 دقيقة، يُرجى التواصل معنا على team@resgrid.com. + + + الدفع قيد الانتظار + + + شكراً لشرائك. جارٍ معالجة دفعتك حالياً. يُرجى الانتظار حتى ينتهي معالج الدفع وسيتم ترقية قسمك. + + + جارٍ معالجة الدفع + + + PayPal + + + الفترة + + + معالج الدفع + + + تاريخ الشراء + + + تاريخ البدء + + + Stripe + + + شكراً لتحديث معلومات الفواتير. لن تُحسَب رسوم على بطاقتك الجديدة الآن، بل ستُستخدَم عند تجديد الاشتراك في موعده المعتاد. + + + تم تحديث معلومات الفواتير بنجاح + + + شكراً لشرائك. جارٍ معالجة دفعتك من خلال Stripe. يُرجى الانتظار حتى ينتهي معالج الدفع وسيتم ترقية قسمك. + + + جارٍ معالجة الدفع + + + النظام + + + شكراً لك! + + + الإجمالي + + + المعاملة + + + رقم المعاملة + + + شكراً لاهتمامك بشراء خطة لخدمة Resgrid. لديك خطة قادمة بالفعل لقسمك ولا يُسمح بأكثر من خطة واحدة قادمة لكل عميل. إذا كنت ترغب في شراء عدة سنوات، لا تتردد في التواصل معنا وسنسعد بمساعدتك. + + + تعذّر الشراء + + + الخطة القادمة + + + تحديث معلومات الفواتير + + + تغيير الخطة + + + عرض الفاتورة + + + أنت مشترك حالياً في الخطة التالية + + + أنت تدير إضافة PTT + + + في مربع الرقم أدناه، حدد عدد حزم 10 مستخدمين للضغط للتحدث المتزامنين التي ترغب في اشتراكها شهرياً. إذا زدت العدد سيتم الخصم فوراً، وإذا خفّضت العدد سيكون التجديد بالعدد المنخفض. إذا أدخلت صفراً لن يتم الفوترة (لن يتجدد PTT). ستُستخدم البطاقة المسجلة لاشتراك Resgrid القياسي لهذا الاشتراك الإضافي. + + + إدارة اشتراكك + + diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx new file mode 100644 index 00000000..3bcf5e0a --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إضافة قالب ملاحظة بلاغ + + + اسم البلاغ المراد تعيينه + + + طبيعة البلاغ المراد تعيينها + + + ملاحظات البلاغ + + + قوالب ملاحظات البلاغ + + + أولوية البلاغ المراد تعيينها + + + نوع البلاغ المراد تعيينه + + + تعديل ملاحظة البلاغ + + + تعديل قالب ملاحظة البلاغ + + + تعديل القالب + + + قالب ملاحظة بلاغ جديد + + + قالب جديد + + + نص الملاحظة + + + اسم القالب + + diff --git a/Core/Resgrid.Localization/Areas/User/TwoFactor/TwoFactor.ar.resx b/Core/Resgrid.Localization/Areas/User/TwoFactor/TwoFactor.ar.resx new file mode 100644 index 00000000..e80cd373 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/TwoFactor/TwoFactor.ar.resx @@ -0,0 +1,59 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + المصادقة الثنائية + تفعيل المصادقة الثنائية + تعطيل المصادقة الثنائية + رموز الاسترداد + التحقق من الهوية + المصادقة الثنائية + الإعداد + تعطيل + رموز الاسترداد + تطبيق المصادقة (TOTP) + المصادقة الثنائية <strong>مفعّلة</strong> على حسابك. + المصادقة الثنائية <strong>غير مفعّلة</strong>. فعّلها الآن لتأمين حسابك بتطبيق مصادقة مثل Google Authenticator أو Microsoft Authenticator أو Authy. + لديك {0} رمز (رموز) استرداد متبقية. + لديك {0} رمز (رموز) استرداد فقط متبقية. أنشئ رموز استرداد جديدة قبل نفادها. + إعادة إنشاء رموز الاسترداد + تعطيل المصادقة الثنائية + تفعيل تطبيق المصادقة + إعداد تطبيق المصادقة + يشترط قسمك المصادقة الثنائية للمسؤولين. يُرجى إكمال الإعداد قبل المتابعة. + لاستخدام تطبيق المصادقة، اتّبع الخطوات التالية: + نزّل تطبيق مصادقة مثل {0} أو {1} أو {2}. + امسح رمز QR أدناه باستخدام تطبيقك، أو أدخل المفتاح يدوياً: + بعد المسح، أدخل الرمز المكوّن من 6 أرقام الظاهر في تطبيق المصادقة: + رمز التحقق + 000000 + تحقق وفعّل + رمز التحقق غير صالح. يُرجى التحقق من تطبيق المصادقة والمحاولة مجدداً. + احفظ رموز الاسترداد + مهم: احتفظ بهذه الرموز في مكان آمن. يمكن استخدام كل رمز مرة واحدة فقط. إذا فقدت الوصول إلى تطبيق المصادقة، يمكنك استخدام رمز استرداد لتسجيل الدخول. + تم + تعطيل المصادقة الثنائية سيقلل من أمان حسابك. سيتم إعادة تعيين مفتاح المصادقة الخاص بك. + أدخل رمز المصادقة الحالي لتأكيد رغبتك في تعطيل المصادقة الثنائية: + رمز المصادقة + تعطيل المصادقة الثنائية + تأكيد هويتك + تتطلب هذه العملية التحقق الثنائي الحديث. يُرجى إدخال الرمز الحالي من تطبيق المصادقة. + تحقق + المصادقة الثنائية + تسجيل دخولك محمي بتطبيق مصادقة. أدخل الرمز المكوّن من 6 أرقام من تطبيقك أدناه. + رمز المصادقة + لا تسألني مجدداً على هذا الجهاز لمدة 30 يوماً + تحقق من الرمز + فقدت الوصول إلى تطبيقك؟ استخدم رمز استرداد + تسجيل الدخول برمز الاسترداد + لقد فقدت الوصول إلى تطبيق المصادقة. أدخل أحد رموز الاسترداد أدناه. يمكن استخدام كل رمز مرة واحدة فقط. + رمز الاسترداد + xxxx-xxxx-xxxx + تسجيل الدخول برمز الاسترداد + استخدام تطبيق المصادقة بدلاً من ذلك + رمز المصادقة غير صالح. + رمز الاسترداد غير صالح. + diff --git a/Core/Resgrid.Localization/Areas/User/Units/Units.ar.resx b/Core/Resgrid.Localization/Areas/User/Units/Units.ar.resx new file mode 100644 index 00000000..ee53d2f3 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Units/Units.ar.resx @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إضافة سجل + + + إضافة دور + + + إضافة سجل وحدة + + + هل أنت متأكد من حذف جميع حالات هذه الوحدة نهائياً؟ + + + مسح جميع حالات الوحدة + + + حذف الكل + + + تحذير: سيؤدي هذا الإجراء إلى حذف هذه الوحدة نهائياً. هل أنت متأكد من حذف الوحدة + + + تعديل الوحدة + + + الأحداث الخاصة بـ + + + إنشاء تقرير + + + محتوى السجل (السرد) + + + سرد لسجل الوحدة + + + السجلات + + + وحدة جديدة + + + غير مشغولة + + + لا توجد وحدات غير مجمّعة + + + لا توجد وحدات في القسم + + + لا توجد وحدات في هذه المجموعة + + + لتعيين تأهيل الوحدات يجب إنشاء وحدات وأدوار (مثل سائق، مشغّل، إلخ) داخل تلك الوحدات. + + + إزالة هذا الدور + + + اسم الدور + + + اسم الدور + + + اختر وحدة + + + تعيين الحالة للوحدات + + + تعيين الحالة + + + تعيين الحالة للوحدات المحددة + + + تعيين حالة الوحدة + + + لقد اخترت وحدة، ويمكن تحديد الوحدات الأخرى ذات الحالات المخصصة (أو الافتراضية) نفسها فقط. + + + تأهيل الوحدة + + + تأهيل الوحدة + + + عرض الأحداث + + + عرض أحداث الوحدة + + + عرض سجلات الوحدة + + + نعم، أنا متأكد + + + يمكنك إضافة نوع جديد + + + هنا + + diff --git a/Core/Resgrid.Localization/Areas/User/UserDefinedFields/UserDefinedFields.ar.resx b/Core/Resgrid.Localization/Areas/User/UserDefinedFields/UserDefinedFields.ar.resx new file mode 100644 index 00000000..0903883c --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/UserDefinedFields/UserDefinedFields.ar.resx @@ -0,0 +1,83 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + الحقول المعرّفة من المستخدم + إدارة الحقول المخصصة لكيانات القسم + نوع الكيان + الإصدار + الحقول + الحالة + الإجراءات + نشط + غير مُهيَّأ + تهيئة + تعديل + حذف + حذف جميع إعدادات الحقول المعرّفة من المستخدم لـ {0}؟ لا يمكن التراجع عن هذا الإجراء. + تعريفات الحقول حسب الكيان + تهيئة الحقول — {0} + تهيئة الحقول — {0} + تعريفات الحقول + إضافة حقل + لم تُضَف أي حقول بعد. انقر على "إضافة حقل" لتعريف الحقل الأول. + الاسم الآلي + التسمية + نوع البيانات + مطلوب + مُفعَّل + الجوال + التقارير + الترتيب + إزالة + إزالة هذا الحقل؟ + حفظ التعريف + إلغاء + تفاصيل الحقل + المعرّف الداخلي (أحرف وأرقام وشرطات سفلية؛ يجب أن يبدأ بحرف أو شرطة سفلية). يجب أن يكون فريداً ضمن نوع الكيان هذا. + التسمية المقروءة التي تظهر للمستخدمين. + الوصف / تلميح الأداة + نص العنصر النائب + القيمة الافتراضية + المجموعة / القسم + للقراءة فقط + عند التفعيل يُعرض الحقل ولكن لا يمكن للمستخدمين تعديله. + قواعد التحقق + الحد الأدنى للطول + الحد الأقصى للطول + الحد الأدنى للقيمة + الحد الأقصى للقيمة + نمط التعبير النمطي + رسالة خطأ التعبير النمطي + الخيارات (مفتاح=تسمية، خيار واحد في كل سطر) + أدخل خياراً واحداً في كل سطر بصيغة مفتاح=تسمية، مثل "yes=نعم" أو "no=لا". + من يمكنه رؤية هذا الحقل؟ + الجميع + مدراء القسم والمجموعة + مدراء القسم فقط + يتحكم في من يمكنه رؤية هذا الحقل وملؤه. المستخدمون الذين لا يستوفون المتطلبات لن يروه عند إضافة السجلات أو عرضها. + إضافة حقل + إغلاق + الرئيسية + جديد + الحقول المعرّفة من المستخدم + بلاغ + الأفراد + وحدة + جهة اتصال + معاينة + معاينة الحقل — {0} + معاينة فقط + هذا نموذج لكيفية ظهور الحقول وعرضها في الصفحة. لن يتم حفظ أي بيانات. + لا توجد حقول مفعّلة للمعاينة. + إغلاق + تم حفظ تعريف الحقل بنجاح. + تم حذف تعريف الحقل. + يُرجى تصحيح الأخطاء أدناه قبل الحفظ. + الاسم الآلي مطلوب. + استخدم أحرفاً وأرقاماً وشرطات سفلية فقط، تبدأ بحرف أو شرطة سفلية. + أسماء آلية مكررة: {0}. يجب أن يكون كل اسم آلي فريداً ضمن نوع الكيان هذا. + diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx new file mode 100644 index 00000000..04db8775 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + بث صوتي جديد + + + إضافة بث صوتي + + + قناة صوتية جديدة + + + اسم البث الصوتي + + + البثوث الصوتية + + + رابط البث الصوتي + + + اسم القناة + + + تعديل البث الصوتي + + + افتراضي + + + المشاركون + + + لم يتم شراء إضافة الضغط للتحدث + + + لم يشترِ قسمك إضافة الضغط للتحدث (PTT). يمكن للعضو المسؤول في قسمك شراء الإضافة من صفحة الاشتراك والفواتير. تتيح ميزة PTT لقسمك تفعيل الاتصالات الصوتية الفورية عبر تطبيقات Resgrid. + + + حفظ البث الصوتي + + + قنوات الصوت (PTT) + + + الصوت والضغط للتحدث + + diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx new file mode 100644 index 00000000..0b0820ee --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + سير العمل + + + سير عمل القسم + + + سير عمل جديد + + + بيانات الاعتماد + + + التشغيلات المعلّقة + + + لم يتم إنشاء أي سير عمل بعد. + + + أنشئ سير عملك الأول. + + + الاسم + + + حدث التشغيل + + + الحالة + + + تاريخ الإنشاء + + + الإجراءات + + + مفعّل + + + معطّل + + + تعديل + + + التشغيلات + + + الصحة + + + حذف + + + حذف سير العمل {0}؟ + + + سير عمل جديد + + + إنشاء سير عمل + + + الوصف + + + الحد الأقصى لعدد المحاولات + + + قاعدة التراجع للمحاولة (ثانية) + + + مثلاً: إشعار Slack عند بلاغ جديد + + + وصف اختياري + + + إلغاء + + + تعديل سير العمل + + + إعدادات سير العمل + + + الحد الأقصى للمحاولات + + + التراجع (ث) + + + حفظ التغييرات + + + الخطوات + + + إضافة خطوة + + + نوع الإجراء + + + الترتيب + + + القالب (أول 120 حرفاً) + + + نعم + + + لا + + + هل أنت متأكد من حذف هذه الخطوة؟ لا يمكن التراجع عن هذا الإجراء. + + + حذف الخطوة + + + متغيرات القالب + + + المتغيرات المشتركة (متاحة دائماً): + + + متغيرات حدث البلاغ: + + + بيانات اعتماد سير العمل + + + بيانات الاعتماد المخزّنة + + + إضافة بيانات اعتماد + + + لا توجد بيانات اعتماد مهيّأة. أضف بيانات اعتماد لاستخدامها مع خطوات إجراءات سير العمل. + + + النوع + + + البيانات السرية + + + حذف بيانات الاعتماد {0}؟ + + + يُرجى تصحيح الأخطاء التالية قبل الحفظ. + + + إضافة بيانات اعتماد + + + تعديل بيانات الاعتماد + + + تفاصيل بيانات الاعتماد + + + النوع + + + حفظ بيانات الاعتماد + + + البيانات السرية الموجودة مخزّنة مشفّرة ولا يمكن عرضها. أدخل البيانات في الحقول أدناه لاستبدالها، أو اتركها فارغة للاحتفاظ بالبيانات الحالية. + + + إعدادات SMTP + + + المضيف + + + المنفذ + + + اسم المستخدم + + + كلمة المرور + + + استخدام SSL/TLS + + + عنوان المُرسِل + + + عنوان البريد الإلكتروني الذي سيظهر في حقل "من" للرسائل المُرسَلة. + + + إعدادات Twilio + + + معرّف الحساب SID + + + رمز المصادقة + + + رقم المُرسِل + + + بصيغة E.164، مثلاً +15551234567 + + + إعدادات FTP + + + المضيف + + + المنفذ + + + اسم المستخدم + + + كلمة المرور + + + استخدام الوضع السلبي + + + إعدادات SFTP + + + المضيف + + + المنفذ + + + اسم المستخدم + + + كلمة المرور + + + المفتاح الخاص (PEM) + + + أدخل إما كلمة مرور أو مفتاحاً خاصاً (أو كليهما إذا كان المفتاح محمياً بعبارة مرور). + + + إعدادات AWS S3 + + + معرّف مفتاح الوصول + + + مفتاح الوصول السري + + + المنطقة + + + اسم الحاوية + + + رمز HTTP Bearer + + + رمز Bearer + + + يُرسَل كـ Authorization: Bearer <token> + + + HTTP Basic Auth + + + اسم المستخدم + + + كلمة المرور + + + مفتاح HTTP API + + + اسم الترويسة + + + اسم ترويسة HTTP التي تحمل مفتاح API. + + + مفتاح API + + + Microsoft Teams Webhook + + + رابط Webhook الوارد + + + أنشئ موصّل Incoming Webhook داخل قناة Teams المطلوبة. + + + Slack + + + رابط Webhook الوارد + + + رمز Bot + + + أدخل رابط webhook أو رمز bot أو كليهما. + + + Discord + + + رابط Webhook + + + رمز Bot + + + أدخل رابط webhook أو رمز bot أو كليهما. + + + Azure Blob Storage + + + سلسلة الاتصال + + + اسم الحاوية + + + Box + + + معرّف العميل + + + سر العميل + + + معرّف المؤسسة + + + معرّف المفتاح العام + + + المفتاح الخاص (PEM) + + + المفتاح الخاص RSA من تهيئة تطبيق Box JWT (بصيغة PEM). + + + عبارة مرور المفتاح الخاص + + + عبارة مرور اختيارية لفكّ تشفير المفتاح الخاص إذا كان محمياً. + + + Dropbox + + + رمز التحديث + + + رمز تحديث OAuth2 طويل الأمد من تدفق تفويض Dropbox OAuth2. + + + مفتاح التطبيق + + + سر التطبيق + + + سير العمل المعلّقة / الجارية + + + التشغيلات النشطة + + + مسح جميع المعلّقات + + + إلغاء جميع التشغيلات المعلّقة لهذا القسم؟ + + + لا توجد تشغيلات معلّقة أو جارية. + + + معرّف التشغيل + + + سير العمل + + + في قائمة الانتظار + + + المحاولة + + + إلغاء + + + إلغاء هذه التشغيلة؟ + + + تشغيلات سير العمل + + + سجل التشغيلات + + + لا توجد تشغيلات لسير العمل هذا. + + + بدأ + + + اكتمل + + + خطأ + + + السابق + + + التالي + + + صحة سير العمل + + + لا تتوفر بيانات صحية لسير العمل هذا بعد. + + + آخر 24 ساعة + + + آخر 7 أيام + + + آخر 30 يوماً + + + ناجح + + + فاشل + + + الإجمالي + + + معدل النجاح + + + الأداء + + + متوسط المدة + + + آخر تشغيل + + + آخر خطأ + + + عرض التشغيلات + + + أبداً + + + لا شيء + + + الرئيسية + + + جديد + + + معلّق + + diff --git a/Core/Resgrid.Localization/Common.ar.resx b/Core/Resgrid.Localization/Common.ar.resx new file mode 100644 index 00000000..3c243245 --- /dev/null +++ b/Core/Resgrid.Localization/Common.ar.resx @@ -0,0 +1,190 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + إجراء + الإجراءات + تفعيل + نشط + البلاغات المؤرشفة + مرفق + المرفقات + الصوت & الضغط للتحدث + متاح + متاح في + المحطة المتاحة + اللوحة الكبيرة + المدونة + التقويم + بلاغ + عنوان البلاغ + إعدادات استيراد البلاغات + البلاغات + طابع وقت البلاغ + إلغاء + مُلغى + الشهادات + إغلاق + مغلق + الرمز + اللون + الأوامر + ملتزم + اتصال + جهات الاتصال + اتصل بنا + أُنشئ في + الحالات المخصصة + البيانات + يوم + أيام + إلغاء التفعيل + افتراضي + متأخر + حذف + القسم + إعدادات القسم + أنواع الأقسام + الوصف + تجاهل + مُرسَل + قوائم التوزيع + المستندات + المستندات + تنزيل + نهاية + وقت الوصول المتوقع + حدث + منتهي الصلاحية + تصدير + الملفات + النماذج + الجمعة + عام + المجموعات + مساعدة + المساعدة & الدعم + الرئيسية + ساعة + ساعات + المعرف + الصور + معلومات + في المقر + المدربون + المخزون + قاعدة المعرفة + اللغة + الروابط + الموقع + تسجيل الخروج + السجلات + صندوق البريد + الخريطة + الخرائط + ربما + دقائق + الاثنين + شهري + الاسم + الاسم + طبيعة البلاغ + أبداً + لا + لا شيء + ملاحظة + الملاحظات + الملاحظات + الإشعارات + لا يستجيب + الرقم + في الموقع + في الوردية + اختياري + الخيارات + الترتيب + الأوامر + الأفراد + الأفراد + معاينة + طباعة + الأولوية + معالجة + الملف الشخصي + البروتوكولات + الضغط للتحدث + مُفرَج عنه + إزالة + تكرار + التقارير + مطلوب + يستجيب + يستجيب لـ + الاستجابة لبلاغ + الاستجابة لمحطة + الأدوار + المسار + السبت + حفظ + جارٍ الحفظ + الأمان & الصلاحيات + إرسال + الورديات + التسجيل + الحجم + التأمين + في الانتظار + في الانتظار بالمحطة + بداية + المحطة + المحطات & المجموعات + الحالة + الحالة + حالة النظام + نموذج بلاغ جديد + الاشتراك & الفواتير + الأحد + النظام + القوالب + نص + الرسائل النصية + الخميس + الطابع الزمني + العنوان + التدريب + رمز الدورة\التدريب + الدورة\التدريب + التدريبات + الثلاثاء + النوع + الأنواع + غير متاح + غير مؤسس + الوحدات + الوحدات + غير معروف + تحديث + ترقية خطتك + رُفع بواسطة + رُفع في + المستخدمون + صالح + فيديو + مقاطع الفيديو + عرض + عرض جميع البلاغات + عرض صندوق الوارد + تحذير + الأربعاء + أسبوع + أسبوعي + أسابيع + سجل العمل + سنوي + نعم + الحقول المعرَّفة من قبل المستخدم + أقسامك + diff --git a/Core/Resgrid.Localization/SupportedLocales.cs b/Core/Resgrid.Localization/SupportedLocales.cs index 17ebb717..d34faffa 100644 --- a/Core/Resgrid.Localization/SupportedLocales.cs +++ b/Core/Resgrid.Localization/SupportedLocales.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -18,6 +18,7 @@ public static class SupportedLocales {"it", "Italian"}, //"it-IT" {"pl", "Polish"}, //"pl-PL" {"uk", "Ukrainian"}, //"uk-UA" + {"ar", "Arabic"}, //"ar" }; public static string[] GetSupportedCultures() diff --git a/Core/Resgrid.Model/PermissionTypes.cs b/Core/Resgrid.Model/PermissionTypes.cs index bdc7d23f..37aa46a9 100644 --- a/Core/Resgrid.Model/PermissionTypes.cs +++ b/Core/Resgrid.Model/PermissionTypes.cs @@ -28,8 +28,7 @@ public enum PermissionTypes ManageWorkflowCredentials = 23, ViewWorkflowRuns = 24, ViewUdfFields = 25, - CreateRoute = 26, - ManageRoutes = 27 + ManageRoutes = 26 } } diff --git a/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs b/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs index feb0f716..81c730f3 100644 --- a/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs +++ b/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs @@ -1539,9 +1539,10 @@ public static void AddUdfClaims(ClaimsIdentity identity, bool isAdmin, List /// Adds Route claims based on department role. /// Department admins always receive full access (View + Update + Create + Delete). - /// Group admins receive View + Update when the permission is DepartmentAndGroupAdmins or Everyone. - /// Regular users receive View only when the permission is Everyone. - /// Default (no permission record): Everyone — all users can view routes. + /// DepartmentAdminsOnly: non-admins receive no claims. + /// DepartmentAndGroupAdmins: group admins receive View + Update + Create; regular users receive no claims. + /// Everyone: all users receive View + Update + Create. + /// Default (no permission record): all users receive View; group admins additionally receive Update + Create. /// public static void AddRouteClaims(ClaimsIdentity identity, bool isAdmin, List permissions, bool isGroupAdmin, List roles) { diff --git a/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs b/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs index 9b355782..f33a4f90 100644 --- a/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs +++ b/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs @@ -107,7 +107,7 @@ async Task getCordsFromAddress() coordinates = string.Format("{0},{1}", firstAddress.Coordinates.Latitude, firstAddress.Coordinates.Longitude); } } - catch { /* Don't report on GeoLocation failures */ } + catch (Exception ex) { var test = ex; /* Don't report on GeoLocation failures */ } if (string.IsNullOrWhiteSpace(coordinates)) { diff --git a/Web/Resgrid.Web.Services/Controllers/v4/GeocodingController.cs b/Web/Resgrid.Web.Services/Controllers/v4/GeocodingController.cs new file mode 100644 index 00000000..fd82207e --- /dev/null +++ b/Web/Resgrid.Web.Services/Controllers/v4/GeocodingController.cs @@ -0,0 +1,99 @@ +using System; +using System.Globalization; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Providers; +using Resgrid.Providers.Claims; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.Geocoding; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Forward and reverse geocoding operations. Requests are proxied through the + /// server-side geocoding provider so that external API keys are never exposed + /// to the client, and so that all calls pass through the configured rate limiter. + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class GeocodingController : V4AuthenticatedApiControllerbase + { + private readonly IGeoLocationProvider _geoLocationProvider; + + public GeocodingController(IGeoLocationProvider geoLocationProvider) + { + _geoLocationProvider = geoLocationProvider; + } + + /// + /// Converts a human-readable address string into geographic coordinates. + /// + /// Address string to geocode. + /// ForwardGeocodeResult with Latitude/Longitude, or nulls if not found. + [HttpGet("ForwardGeocode")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> ForwardGeocode([FromQuery] string address) + { + if (string.IsNullOrWhiteSpace(address)) + return BadRequest(); + + var result = new ForwardGeocodeResult(); + + try + { + var coordinates = await _geoLocationProvider.GetLatLonFromAddress(address); + + if (!string.IsNullOrEmpty(coordinates)) + { + var parts = coordinates.Split(','); + if (parts.Length == 2 && + double.TryParse(parts[0], NumberStyles.Any, CultureInfo.InvariantCulture, out var lat) && + double.TryParse(parts[1], NumberStyles.Any, CultureInfo.InvariantCulture, out var lng)) + { + result.Data.Latitude = lat; + result.Data.Longitude = lng; + } + } + } + catch { /* provider errors are non-fatal */ } + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Converts geographic coordinates into a human-readable address string. + /// + /// Latitude of the location to reverse-geocode. + /// Longitude of the location to reverse-geocode. + /// ReverseGeocodeResult with Address, or empty string if not found. + [HttpGet("ReverseGeocode")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> ReverseGeocode([FromQuery] double lat, [FromQuery] double lon) + { + var result = new ReverseGeocodeResult(); + + try + { + var address = await _geoLocationProvider.GetAddressFromLatLong(lat, lon); + result.Data.Address = address ?? string.Empty; + } + catch { /* provider errors are non-fatal */ } + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + } +} diff --git a/Web/Resgrid.Web.Services/Models/v4/Geocoding/GeocodingResults.cs b/Web/Resgrid.Web.Services/Models/v4/Geocoding/GeocodingResults.cs new file mode 100644 index 00000000..54f8db09 --- /dev/null +++ b/Web/Resgrid.Web.Services/Models/v4/Geocoding/GeocodingResults.cs @@ -0,0 +1,45 @@ +namespace Resgrid.Web.Services.Models.v4.Geocoding +{ + /// + /// Result of a forward geocode (address → coordinates) request. + /// + public class ForwardGeocodeResult : StandardApiResponseV4Base + { + /// Response data + public ForwardGeocodeData Data { get; set; } + + public ForwardGeocodeResult() + { + Data = new ForwardGeocodeData(); + } + } + + public class ForwardGeocodeData + { + /// Latitude of the geocoded location, or null if not found. + public double? Latitude { get; set; } + + /// Longitude of the geocoded location, or null if not found. + public double? Longitude { get; set; } + } + + /// + /// Result of a reverse geocode (coordinates → address) request. + /// + public class ReverseGeocodeResult : StandardApiResponseV4Base + { + /// Response data + public ReverseGeocodeData Data { get; set; } + + public ReverseGeocodeResult() + { + Data = new ReverseGeocodeData(); + } + } + + public class ReverseGeocodeData + { + /// Human-readable address for the supplied coordinates, or empty if not found. + public string Address { get; set; } + } +} diff --git a/Web/Resgrid.Web.Services/Resgrid.Web.Services.xml b/Web/Resgrid.Web.Services/Resgrid.Web.Services.xml index 2a28e0d3..5bfeea13 100644 --- a/Web/Resgrid.Web.Services/Resgrid.Web.Services.xml +++ b/Web/Resgrid.Web.Services/Resgrid.Web.Services.xml @@ -574,6 +574,28 @@ The form identifier A FormResultData for the requested form + + + Forward and reverse geocoding operations. Requests are proxied through the + server-side geocoding provider so that external API keys are never exposed + to the client, and so that all calls pass through the configured rate limiter. + + + + + Converts a human-readable address string into geographic coordinates. + + Address string to geocode. + ForwardGeocodeResult with Latitude/Longitude, or nulls if not found. + + + + Converts geographic coordinates into a human-readable address string. + + Latitude of the location to reverse-geocode. + Longitude of the location to reverse-geocode. + ReverseGeocodeResult with Address, or empty string if not found. + User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc @@ -5831,6 +5853,31 @@ Default constructor + + + Result of a forward geocode (address → coordinates) request. + + + + Response data + + + Latitude of the geocoded location, or null if not found. + + + Longitude of the geocoded location, or null if not found. + + + + Result of a reverse geocode (coordinates → address) request. + + + + Response data + + + Human-readable address for the supplied coordinates, or empty if not found. + A group in the Resgrid system diff --git a/Web/Resgrid.Web.Services/appsettings.json b/Web/Resgrid.Web.Services/appsettings.json index 1ea7fa4a..6a3d8e5f 100644 --- a/Web/Resgrid.Web.Services/appsettings.json +++ b/Web/Resgrid.Web.Services/appsettings.json @@ -52,6 +52,16 @@ "Period": "60s", "Limit": 15 }, + { + "Endpoint": "*:/api/v4/Geocoding/ForwardGeocode", + "Period": "60s", + "Limit": 30 + }, + { + "Endpoint": "*:/api/v4/Geocoding/ReverseGeocode", + "Period": "60s", + "Limit": 30 + }, { "Endpoint": "*:/api/v3/Auth/Validate", "Period": "60s", diff --git a/Web/Resgrid.Web/Areas/User/Controllers/CustomMapsController.cs b/Web/Resgrid.Web/Areas/User/Controllers/CustomMapsController.cs index 8c74b38a..1b93ba53 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/CustomMapsController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/CustomMapsController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; @@ -9,7 +10,6 @@ using Resgrid.Model.Services; using Resgrid.Web.Areas.User.Models.CustomMaps; using Resgrid.Web.Helpers; -using System.Collections.Generic; namespace Resgrid.Web.Areas.User.Controllers { @@ -209,6 +209,7 @@ public async Task RegionEditor(string id) } [HttpPost] + [ValidateAntiForgeryToken] public async Task SaveRegion([FromBody] IndoorMapZone region, CancellationToken cancellationToken) { var layer = await _customMapService.GetLayerByIdAsync(region.IndoorMapFloorId); @@ -231,6 +232,7 @@ public async Task SaveRegion([FromBody] IndoorMapZone region, Can } [HttpPost] + [ValidateAntiForgeryToken] public async Task DeleteRegion([FromBody] DeleteRegionRequest request, CancellationToken cancellationToken) { var region = await _customMapService.GetRegionByIdAsync(request.RegionId); @@ -336,6 +338,14 @@ public async Task GetLayerImage(string id) [HttpGet] public async Task GetLayerTile(string id, int z, int x, int y) { + var layer = await _customMapService.GetLayerByIdAsync(id); + if (layer == null) + return NotFound(); + + var map = await _customMapService.GetCustomMapByIdAsync(layer.IndoorMapId); + if (map == null || map.DepartmentId != DepartmentId) + return NotFound(); + var tile = await _customMapService.GetTileAsync(id, z, x, y); if (tile == null) return NotFound(); diff --git a/Web/Resgrid.Web/Areas/User/Controllers/DispatchController.cs b/Web/Resgrid.Web/Areas/User/Controllers/DispatchController.cs index 381012d4..516de53b 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/DispatchController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/DispatchController.cs @@ -625,6 +625,11 @@ public async Task UpdateCall(UpdateCallView model, IFormCollectio call.IndoorMapZoneId = indoorMapZoneId; call.IndoorMapFloorId = indoorMapFloorId; } + else + { + call.IndoorMapZoneId = null; + call.IndoorMapFloorId = null; + } List existingDispatches = new List(call.Dispatches); diff --git a/Web/Resgrid.Web/Areas/User/Controllers/IndoorMapsController.cs b/Web/Resgrid.Web/Areas/User/Controllers/IndoorMapsController.cs index 3dfc50bb..b25e986d 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/IndoorMapsController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/IndoorMapsController.cs @@ -1,12 +1,42 @@ +using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Resgrid.Model.Services; namespace Resgrid.Web.Areas.User.Controllers { [Area("User")] public class IndoorMapsController : SecureBaseController { + private readonly IIndoorMapService _indoorMapService; + private readonly Microsoft.Extensions.Logging.ILogger _logger; + + public IndoorMapsController(IIndoorMapService indoorMapService, Microsoft.Extensions.Logging.ILogger logger) + { + _indoorMapService = indoorMapService; + _logger = logger; + } + + [HttpGet] + public async Task SearchZones(string term) + { + if (string.IsNullOrWhiteSpace(term)) + return Json(new { results = System.Array.Empty() }); + + var zones = await _indoorMapService.SearchZonesAsync(DepartmentId, term); + + var results = zones.Select(z => new + { + id = z.IndoorMapZoneId, + text = z.Name, + floorId = z.IndoorMapFloorId + }); + + return Json(new { results }); + } + [HttpGet] public IActionResult Index() { @@ -48,5 +78,27 @@ public IActionResult GetFloorImage(string id) { return RedirectToAction("GetLayerImage", "CustomMaps", new { area = "User", id = id }); } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task DeleteFloor(string id, CancellationToken cancellationToken) + { + var floor = await _indoorMapService.GetFloorByIdAsync(id); + if (floor == null) + return NotFound(); + + var map = await _indoorMapService.GetIndoorMapByIdAsync(floor.IndoorMapId); + if (map == null || map.DepartmentId != DepartmentId) + return NotFound(); + + var success = await _indoorMapService.DeleteFloorAsync(id, cancellationToken); + if (!success) + { + _logger.LogWarning("DeleteFloor failed for floor {FloorId} in department {DepartmentId}.", id, DepartmentId); + TempData["ErrorMessage"] = "Failed to delete the floor. Please try again."; + } + + return RedirectToAction("Layers", "CustomMaps", new { area = "User", id = floor.IndoorMapId }); + } } } diff --git a/Web/Resgrid.Web/Areas/User/Controllers/RoutesController.cs b/Web/Resgrid.Web/Areas/User/Controllers/RoutesController.cs index 7ce2f096..a7fc1c11 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/RoutesController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/RoutesController.cs @@ -2,9 +2,11 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Resgrid.Model; using Resgrid.Model.Services; +using Resgrid.Providers.Claims; using Resgrid.Web.Areas.User.Models.Routes; namespace Resgrid.Web.Areas.User.Controllers @@ -14,14 +16,17 @@ public class RoutesController : SecureBaseController { private readonly IRouteService _routeService; private readonly IUnitsService _unitsService; + private readonly ICallsService _callsService; - public RoutesController(IRouteService routeService, IUnitsService unitsService) + public RoutesController(IRouteService routeService, IUnitsService unitsService, ICallsService callsService) { _routeService = routeService; _unitsService = unitsService; + _callsService = callsService; } [HttpGet] + [Authorize(Policy = ResgridResources.Route_View)] public async Task Index() { var model = new RouteIndexView(); @@ -30,6 +35,7 @@ public async Task Index() } [HttpGet] + [Authorize(Policy = ResgridResources.Route_Create)] public async Task New() { var model = new RouteNewView(); @@ -39,6 +45,7 @@ public async Task New() [HttpPost] [ValidateAntiForgeryToken] + [Authorize(Policy = ResgridResources.Route_Create)] public async Task New(RouteNewView model, CancellationToken cancellationToken) { if (ModelState.IsValid) @@ -58,6 +65,7 @@ public async Task New(RouteNewView model, CancellationToken cance } [HttpGet] + [Authorize(Policy = ResgridResources.Route_Update)] public async Task Edit(string id) { var plan = await _routeService.GetRoutePlanByIdAsync(id); @@ -74,6 +82,7 @@ public async Task Edit(string id) [HttpPost] [ValidateAntiForgeryToken] + [Authorize(Policy = ResgridResources.Route_Update)] public async Task Edit(RouteEditView model, CancellationToken cancellationToken) { if (ModelState.IsValid) @@ -99,6 +108,7 @@ public async Task Edit(RouteEditView model, CancellationToken can [HttpPost] [ValidateAntiForgeryToken] + [Authorize(Policy = ResgridResources.Route_Delete)] public async Task Delete(string id, CancellationToken cancellationToken) { var plan = await _routeService.GetRoutePlanByIdAsync(id); @@ -111,6 +121,7 @@ public async Task Delete(string id, CancellationToken cancellatio } [HttpGet] + [Authorize(Policy = ResgridResources.Route_View)] public async Task View(string id) { var plan = await _routeService.GetRoutePlanByIdAsync(id); @@ -124,6 +135,7 @@ public async Task View(string id) } [HttpGet] + [Authorize(Policy = ResgridResources.Route_View)] public async Task Instances(string routePlanId) { var plan = await _routeService.GetRoutePlanByIdAsync(routePlanId); @@ -140,6 +152,7 @@ public async Task Instances(string routePlanId) } [HttpGet] + [Authorize(Policy = ResgridResources.Route_View)] public async Task ActiveRoutes() { var instances = await _routeService.GetInstancesForDepartmentAsync(DepartmentId); @@ -153,6 +166,82 @@ public async Task ActiveRoutes() } [HttpGet] + [Authorize(Policy = ResgridResources.Route_View)] + public async Task GetCallsForLinking() + { + var calls = await _callsService.GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(DepartmentId); + var active = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + var all = calls.Union(active).Distinct().OrderBy(c => c.Name).Select(c => new { id = c.CallId, name = c.Name, address = c.Address }).ToList(); + return Json(all); + } + + [HttpPost] + [ValidateAntiForgeryToken] + [Authorize(Policy = ResgridResources.Route_Update)] + public async Task AddStop(string routePlanId, string name, string description, int stopType, int priority, + decimal latitude, decimal longitude, string address, int? callId, int? geofenceRadius, + string plannedArrival, string plannedDeparture, int? dwellMinutes, string contactName, string contactNumber, string notes, + CancellationToken cancellationToken) + { + var plan = await _routeService.GetRoutePlanByIdAsync(routePlanId); + if (plan == null || plan.DepartmentId != DepartmentId) + return Json(new { success = false, message = "Not found" }); + + var existingStops = await _routeService.GetRouteStopsForPlanAsync(routePlanId); + var stop = new RouteStop + { + RoutePlanId = routePlanId, + Name = name, + Description = description, + StopType = stopType, + Priority = priority, + Latitude = latitude, + Longitude = longitude, + Address = address, + CallId = callId, + GeofenceRadiusMeters = geofenceRadius, + EstimatedDwellMinutes = dwellMinutes, + ContactName = contactName, + ContactNumber = contactNumber, + Notes = notes, + StopOrder = existingStops.Count + 1, + AddedOn = DateTime.UtcNow, + IsDeleted = false + }; + + if (!string.IsNullOrWhiteSpace(plannedArrival) && DateTime.TryParse(plannedArrival, out var arrivalDt)) + stop.PlannedArrivalTime = arrivalDt.ToUniversalTime(); + if (!string.IsNullOrWhiteSpace(plannedDeparture) && DateTime.TryParse(plannedDeparture, out var departureDt)) + stop.PlannedDepartureTime = departureDt.ToUniversalTime(); + + await _routeService.SaveRouteStopAsync(stop, cancellationToken); + return Json(new { success = true }); + } + + [HttpPost] + [ValidateAntiForgeryToken] + [Authorize(Policy = ResgridResources.Route_Delete)] + public async Task DeleteStop(string stopId, CancellationToken cancellationToken) + { + // Verify ownership by loading the stop via the plan + // We load all stops for the department's plans to validate ownership + var deleted = false; + var plans = await _routeService.GetRoutePlansForDepartmentAsync(DepartmentId); + foreach (var p in plans) + { + var stops = await _routeService.GetRouteStopsForPlanAsync(p.RoutePlanId); + if (stops.Any(s => s.RouteStopId == stopId)) + { + deleted = await _routeService.DeleteRouteStopAsync(stopId, cancellationToken); + break; + } + } + + return Json(new { success = deleted }); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Route_View)] public async Task InstanceDetail(string instanceId) { var instance = await _routeService.GetInstanceByIdAsync(instanceId); diff --git a/Web/Resgrid.Web/Areas/User/Views/Calendar/Edit.cshtml b/Web/Resgrid.Web/Areas/User/Views/Calendar/Edit.cshtml index ac52874a..f1b80059 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Calendar/Edit.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Calendar/Edit.cshtml @@ -365,7 +365,7 @@
- +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Calendar/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Calendar/New.cshtml index d59b7069..ec6f0462 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Calendar/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Calendar/New.cshtml @@ -322,7 +322,7 @@
- +
diff --git a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Edit.cshtml b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Edit.cshtml index 3d65cd66..44fac027 100644 --- a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Edit.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Edit.cshtml @@ -1,21 +1,21 @@ @model Resgrid.Web.Areas.User.Models.CustomMaps.CustomMapNewView @using Resgrid.Model +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Edit Custom Map"; + ViewBag.Title = "Resgrid | " + localizer["EditCustomMapPageTitle"]; } @section Styles { - - + }
-

Edit Custom Map

+

@localizer["EditCustomMapHeader"]

@@ -33,34 +33,34 @@ @Html.AntiForgeryToken()
- +
- +
- +
- +
- +
- +
-

Draw a rectangle on the map below to update the bounds. Click the map to set the center point.

+

@localizer["DrawBoundsEditHelp"]

@@ -77,8 +77,8 @@
- Cancel - + @localizer["Cancel"] +
@@ -89,11 +89,12 @@ @section Scripts { - - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Import.cshtml b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Import.cshtml index e07bc1ba..cecdcb09 100644 --- a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Import.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Import.cshtml @@ -1,16 +1,17 @@ @model Resgrid.Web.Areas.User.Models.CustomMaps.CustomMapImportView @using Resgrid.Model +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Import - " + Model.Map.Name; + ViewBag.Title = "Resgrid | " + localizer["ImportPageTitlePrefix"] + " - " + Model.Map.Name; }
-

Import - @Model.Map.Name

+

@localizer["ImportHeaderPrefix"] - @Model.Map.Name

@@ -20,7 +21,7 @@
-
Import Geospatial Data
+
@localizer["ImportGeospatialTitle"]
@if (!string.IsNullOrWhiteSpace(Model.Message)) @@ -31,7 +32,7 @@ @Html.AntiForgeryToken()
- +
- Supported formats: GeoJSON (.geojson, .json), KML (.kml), KMZ (.kmz) + @localizer["ImportFileHelp"]
- +
@@ -60,18 +61,18 @@
-
Import History
+
@localizer["ImportHistoryTitle"]
- - - - - + + + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Index.cshtml index a47ecc41..b9e4a2c5 100644 --- a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Index.cshtml @@ -1,24 +1,27 @@ @model Resgrid.Web.Areas.User.Models.CustomMaps.CustomMapIndexView @using Resgrid.Model +@using System.Text.Encodings.Web +@inject IStringLocalizer localizer +@inject JavaScriptEncoder JsEncoder @{ - ViewBag.Title = "Resgrid | Custom Maps"; + ViewBag.Title = "Resgrid | " + localizer["CustomMapsPageTitle"]; }
-

Custom Maps

+

@localizer["CustomMapsHeader"]

@@ -30,29 +33,29 @@
FileTypeStatusDateError@localizer["File"]@localizer["Type"]@localizer["Status"]@localizer["Date"]@localizer["Error"]
- - - - + + + + @@ -67,10 +70,10 @@ } diff --git a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Layers.cshtml b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Layers.cshtml index 681e0ba6..32222e38 100644 --- a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Layers.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/Layers.cshtml @@ -1,16 +1,17 @@ @model Resgrid.Web.Areas.User.Models.CustomMaps.CustomMapLayersView @using Resgrid.Model +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Layers - " + Model.Map.Name; + ViewBag.Title = "Resgrid | " + localizer["LayersPageTitlePrefix"] + " - " + Model.Map.Name; }
-

Layers - @Model.Map.Name

+

@localizer["LayersHeaderPrefix"] - @Model.Map.Name

@@ -20,39 +21,39 @@
-
Add Layer
+
@localizer["AddLayerTitle"]
@Html.AntiForgeryToken()
- +
- +
- +
- +
- +
- Images larger than 2048px will be automatically tiled. + @localizer["LayerImageHelp"]
- +
@@ -61,18 +62,18 @@
-
Layers
+
@localizer["LayersBreadcrumb"]
NameTypeDescriptionCreated@localizer["Name"]@localizer["Type"]@localizer["Description"]@localizer["Created"]
@map.Description @map.AddedOn.ToString("g") - Layers - Import - Edit - Delete + @localizer["Layers"] + @localizer["Import"] + @localizer["Edit"] + @localizer["Delete"]
- - - - - + + + + + @@ -85,7 +86,7 @@ - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/New.cshtml index 788e9edc..fa8de45c 100644 --- a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/New.cshtml @@ -1,21 +1,21 @@ @model Resgrid.Web.Areas.User.Models.CustomMaps.CustomMapNewView @using Resgrid.Model +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Custom Map"; + ViewBag.Title = "Resgrid | " + localizer["NewCustomMapPageTitle"]; } @section Styles { - - + }
-

New Custom Map

+

@localizer["NewCustomMapHeader"]

@@ -32,34 +32,34 @@
@Html.AntiForgeryToken()
- +
- +
- +
- +
- +
- +
-

Draw a rectangle on the map below to define the bounds. Click the map to set the center point.

+

@localizer["DrawBoundsHelp"]

@@ -76,8 +76,8 @@
- Cancel - + @localizer["Cancel"] +
@@ -88,11 +88,12 @@ @section Scripts { - - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/RegionEditor.cshtml b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/RegionEditor.cshtml index 81957703..3523230c 100644 --- a/Web/Resgrid.Web/Areas/User/Views/CustomMaps/RegionEditor.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/CustomMaps/RegionEditor.cshtml @@ -1,12 +1,12 @@ @model Resgrid.Web.Areas.User.Models.CustomMaps.CustomMapRegionEditorView @using Resgrid.Model +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Region Editor - " + Model.Layer.Name; + ViewBag.Title = "Resgrid | " + localizer["RegionEditorPageTitlePrefix"] + " - " + Model.Layer.Name; } @section Styles { - - + } - -

@localizer["AddArchivedCallHeader"]

@@ -400,6 +398,8 @@ var newCallFormData = '@Html.Raw(Model.NewCallFormData)'; var osmTileUrl = '@Resgrid.Config.MappingConfig.GetWebsiteOSMUrl()'; var osmTileAttribution = '@Resgrid.Config.MappingConfig.LeafletAttribution'; + var nominatimUrl = '@Resgrid.Config.MappingConfig.NominatimUrl'; + var osrmUrl = '@Resgrid.Config.MappingConfig.OsrmUrl'; @if (Model.CenterCoordinates != null && Model.CenterCoordinates.Latitude.HasValue && Model.CenterCoordinates.Longitude.HasValue) diff --git a/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExport.cshtml index 2e7b8a4a..f7456a35 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExport.cshtml @@ -17,7 +17,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExportEx.cshtml b/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExportEx.cshtml index 3265421a..4e5d92b7 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExportEx.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Dispatch/CallExportEx.cshtml @@ -17,7 +17,7 @@ -
- + - + @@ -555,67 +555,63 @@ - + + @if (Model.Station != null) { } diff --git a/Web/Resgrid.Web/Areas/User/Views/Dispatch/Dashboard.cshtml b/Web/Resgrid.Web/Areas/User/Views/Dispatch/Dashboard.cshtml index 641cf8b2..9740429b 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Dispatch/Dashboard.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Dispatch/Dashboard.cshtml @@ -25,8 +25,6 @@ } - -

@commonLocalizer["CallsModule"]

@@ -42,15 +40,15 @@
- @localizer["ArchivedCalls"] - @if (ClaimsAuthorizationHelper.CanCreateCall()) - { - @localizer["NewCall"] - } @if (ClaimsAuthorizationHelper.CanViewRoutes()) { Routes } + @localizer["ArchivedCalls"] + @if (ClaimsAuthorizationHelper.CanCreateCall()) + { + @localizer["NewCall"] + }
@@ -104,8 +102,6 @@ @section Scripts { - - @if (Model.CenterCoordinates != null && Model.CenterCoordinates.Latitude.HasValue && Model.CenterCoordinates.Longitude.HasValue) diff --git a/Web/Resgrid.Web/Areas/User/Views/Dispatch/UpdateCall.cshtml b/Web/Resgrid.Web/Areas/User/Views/Dispatch/UpdateCall.cshtml index 7058a2bf..5a8c9880 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Dispatch/UpdateCall.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Dispatch/UpdateCall.cshtml @@ -402,7 +402,6 @@ @section Scripts { - diff --git a/Web/Resgrid.Web/Areas/User/Views/Dispatch/ViewCall.cshtml b/Web/Resgrid.Web/Areas/User/Views/Dispatch/ViewCall.cshtml index 4ffd43f5..d1fd9dbb 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Dispatch/ViewCall.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Dispatch/ViewCall.cshtml @@ -11,8 +11,8 @@ @section Styles { - - + + } @Html.HiddenFor(m => m.Latitude) @@ -801,8 +801,8 @@ - - + + - @if (Model.Group == null || String.IsNullOrWhiteSpace(Model.Group.Geofence)) - { - - } - else - { - - } + + @if (Model.Group == null || String.IsNullOrWhiteSpace(Model.Group.Geofence)) + { + + } + else + { + + } - + - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Edit.cshtml b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Edit.cshtml index f812b6e3..c7d96aa1 100644 --- a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Edit.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Edit.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.IndoorMaps.IndoorMapNewView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Edit Indoor Map"; + ViewBag.Title = "Resgrid | " + localizer["EditIndoorMapPageTitle"]; }
-

Edit Indoor Map

+

@localizer["EditIndoorMapHeader"]

@@ -27,43 +28,43 @@ @Html.AntiForgeryToken()
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
@@ -71,8 +72,8 @@
- Cancel - + @localizer["Cancel"] +
@@ -84,5 +85,9 @@
@section Scripts { + } diff --git a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Floors.cshtml b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Floors.cshtml index a82165f8..aa1c1f27 100644 --- a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Floors.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Floors.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.IndoorMaps.IndoorMapFloorsView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Floors - " + Model.IndoorMap.Name; + ViewBag.Title = "Resgrid | " + localizer["FloorsPageTitlePrefix"] + " - " + Model.IndoorMap.Name; }
-

Floors - @Model.IndoorMap.Name

+

@localizer["FloorsPageTitlePrefix"] - @Model.IndoorMap.Name

@@ -19,29 +20,29 @@
-
Add Floor
+
@localizer["AddFloorTitle"]
@Html.AntiForgeryToken()
- +
- +
- +
- +
- +
@@ -50,16 +51,16 @@
-
Floors
+
@localizer["FloorsTableTitle"]
OrderNameTypeHas ImageTiled@localizer["Order"]@localizer["Name"]@localizer["Type"]@localizer["HasImage"]@localizer["Tiled"]
@layer.FloorOrder @layer.Name @((CustomMapLayerType)layer.LayerType)@(layer.ImageData != null || layer.IsTiled ? "Yes" : "No")@(layer.ImageData != null || layer.IsTiled ? localizer["Yes"].Value : localizer["No"].Value) @if (layer.IsTiled) { @@ -93,12 +94,12 @@ } else { - No + @localizer["No"] } - Region Editor - Delete + @localizer["RegionEditor"] + @localizer["Delete"]
- - - + + + @@ -71,10 +72,13 @@ - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Index.cshtml index 30a2457a..83b47b0d 100644 --- a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/Index.cshtml @@ -1,23 +1,24 @@ @model Resgrid.Web.Areas.User.Models.IndoorMaps.IndoorMapIndexView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Indoor Maps"; + ViewBag.Title = "Resgrid | " + localizer["IndoorMapsPageTitle"]; }
-

Indoor Maps

+

@localizer["IndoorMapsHeader"]

@@ -31,9 +32,9 @@
OrderNameHas Image@localizer["Order"]@localizer["Name"]@localizer["HasImage"]
@floor.FloorOrder @floor.Name@(floor.ImageData != null ? "Yes" : "No")@(floor.ImageData != null ? localizer["Yes"].Value : localizer["No"].Value) - Zone Editor - Delete + @localizer["ZoneEditor"] +
+ + +
- - - + + + @@ -47,9 +48,9 @@ } @@ -64,11 +65,5 @@ @section Scripts { - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/New.cshtml index 31336db9..157757fd 100644 --- a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/New.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.IndoorMaps.IndoorMapNewView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Indoor Map"; + ViewBag.Title = "Resgrid | " + localizer["NewIndoorMapPageTitle"]; }
-

New Indoor Map

+

@localizer["NewIndoorMapHeader"]

@@ -26,43 +27,43 @@
@Html.AntiForgeryToken()
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
@@ -70,8 +71,8 @@
- Cancel - + @localizer["Cancel"] +
@@ -83,5 +84,9 @@
@section Scripts { + } diff --git a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/ZoneEditor.cshtml b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/ZoneEditor.cshtml index 361594c6..0ea94ace 100644 --- a/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/ZoneEditor.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/IndoorMaps/ZoneEditor.cshtml @@ -1,11 +1,11 @@ @model Resgrid.Web.Areas.User.Models.IndoorMaps.IndoorMapZoneEditorView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Zone Editor - " + Model.Floor.Name; + ViewBag.Title = "Resgrid | " + localizer["ZoneEditorPageTitlePrefix"] + " - " + Model.Floor.Name; } @section Styles { - - + } - -
-

Mapping

+

@localizer["MappingHeader"]

@@ -41,10 +40,10 @@ { } @@ -68,17 +67,17 @@
diff --git a/Web/Resgrid.Web/Areas/User/Views/Mapping/Layers.cshtml b/Web/Resgrid.Web/Areas/User/Views/Mapping/Layers.cshtml index 04dcb2ed..67a9d367 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Mapping/Layers.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Mapping/Layers.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Web.Helpers +@using Resgrid.Web.Helpers @model Resgrid.Web.Areas.User.Models.Mapping.LayersView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Layers"; + ViewBag.Title = "Resgrid | " + localizer["LayersPageTitle"]; }
-

Layers

+

@localizer["LayersHeader"]

@@ -23,7 +24,7 @@ { } @@ -39,13 +40,13 @@
@@ -65,8 +66,8 @@ @layer.Data.Features.Count } diff --git a/Web/Resgrid.Web/Areas/User/Views/Mapping/LiveRouting.cshtml b/Web/Resgrid.Web/Areas/User/Views/Mapping/LiveRouting.cshtml index 80d182ab..6d3b618d 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Mapping/LiveRouting.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Mapping/LiveRouting.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.WebCore.Areas.User.Models.Mapping.StationRoutingView +@model Resgrid.WebCore.Areas.User.Models.Mapping.StationRoutingView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Live Navigation"; + ViewBag.Title = "Resgrid | " + localizer["LiveRoutingPageTitle"]; } @section Styles @@ -14,16 +15,16 @@
-

Live Routing

+

@localizer["LiveRoutingHeader"]

@@ -57,71 +58,67 @@ @section Scripts { - diff --git a/Web/Resgrid.Web/Areas/User/Views/Mapping/NewLayer.cshtml b/Web/Resgrid.Web/Areas/User/Views/Mapping/NewLayer.cshtml index f0f5b4b9..52c0bee9 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Mapping/NewLayer.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Mapping/NewLayer.cshtml @@ -1,7 +1,8 @@ - + @model Resgrid.Web.Areas.User.Models.Mapping.NewLayerView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Layer"; + ViewBag.Title = "Resgrid | " + localizer["NewLayerPageTitle"]; } @section Styles @@ -39,16 +40,16 @@
-

New Layer

+

@localizer["NewLayerHeader"]

@@ -78,7 +79,7 @@
@@ -88,29 +89,29 @@
@Html.CheckBoxFor(x => x.IsOnByDefault) - Do you want this layer to be visible every time a map loads? Note: Having too many layers visible by default will complicate the map. Users can turn layers on if they want to see them in the map control. + @localizer["IsVisibleByDefaultHelp"]
@Html.CheckBoxFor(x => x.IsSearchable) - This will allow address searching to use coordinates from this layer in the search. Note, if you don't have searchable points (text fields) don't mark as searchable as it can slow down dispatching.' + @localizer["IsSearchableHelp"]
@@ -120,7 +121,7 @@
@@ -128,8 +129,8 @@
@@ -207,7 +208,7 @@ break; default: } - + return geo; }); @@ -216,30 +217,8 @@ features, }; - //for (let i = 0; i < layers.length; i++) { - - // const geo = layers[i].toGeoJSON(); - // geo.properties.shape = layers[i].pm.getShape(); - // geo.properties.color = $('#Color').val(); - // geo.properties.name = $('#Name').val(); - // geo.properties.category = "default"; - - // switch (geo.properties.shape) { - // case "Text": - // geo.properties.text = layer.pm.getText().trim(); - // break; - // default: - // } - - // //layers[i].setStyle({ color: $('#Color').val() }); - // fg.addLayer(layers[i]); - //} - - //const geojson = fg.toGeoJSON(); - //const json = JSON.stringify(geojson); const json = JSON.stringify(featureCollection); - - //const json = JSON.stringify(map.pm.getGeomanLayers(true).toGeoJSON()); + $('#GeoJson').val(json); $("#newLayerForm").submit(); diff --git a/Web/Resgrid.Web/Areas/User/Views/Mapping/POIs.cshtml b/Web/Resgrid.Web/Areas/User/Views/Mapping/POIs.cshtml index fb659e7e..6fbd943c 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Mapping/POIs.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Mapping/POIs.cshtml @@ -1,22 +1,23 @@ -@using Resgrid.Web.Helpers +@using Resgrid.Web.Helpers @model Resgrid.Web.Areas.User.Models.Mapping.POIsView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | POIs"; + ViewBag.Title = "Resgrid | " + localizer["POIsPageTitle"]; }
-

POIs

+

@localizer["POIsHeader"]

@@ -24,7 +25,7 @@ { } @@ -40,13 +41,13 @@
@@ -66,13 +67,13 @@ @u.Pois.Count @@ -100,4 +101,4 @@ }); //]]> -} \ No newline at end of file +} diff --git a/Web/Resgrid.Web/Areas/User/Views/Mapping/StationRouting.cshtml b/Web/Resgrid.Web/Areas/User/Views/Mapping/StationRouting.cshtml index 410e78eb..d3a158e1 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Mapping/StationRouting.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Mapping/StationRouting.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.WebCore.Areas.User.Models.Mapping.StationRoutingView +@model Resgrid.WebCore.Areas.User.Models.Mapping.StationRoutingView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Station Navigation"; + ViewBag.Title = "Resgrid | " + localizer["StationRoutingPageTitle"]; } @section Styles @@ -12,20 +13,19 @@ } -
-

Station Routing

+

@localizer["StationRoutingHeader"]

@@ -52,62 +52,57 @@ @section Scripts { } diff --git a/Web/Resgrid.Web/Areas/User/Views/Mapping/ViewType.cshtml b/Web/Resgrid.Web/Areas/User/Views/Mapping/ViewType.cshtml index df48d17c..a0e861ba 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Mapping/ViewType.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Mapping/ViewType.cshtml @@ -1,8 +1,9 @@ -@using Resgrid.Model +@using Resgrid.Model @using Resgrid.Web.Helpers @model Resgrid.Web.Areas.User.Models.Mapping.ViewTypeView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | View Type"; + ViewBag.Title = "Resgrid | " + localizer["ViewTypePageTitle"]; Layout = "~/Areas/User/Views/Shared/_UserLayout.cshtml"; } @@ -27,19 +28,19 @@
-

View Type

+

@localizer["ViewTypeHeader"]

@@ -49,9 +50,9 @@
@@ -65,7 +66,7 @@
@@ -75,24 +76,24 @@
@if (Model.Type.IsDestination) { - True + @localizer["True"] } else { - False + @localizer["False"] }
@@ -116,11 +117,12 @@ @section Scripts { - - - + + } diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml index 0dfe9c37..90f800fb 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml @@ -15,7 +15,7 @@ - - + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/ActiveCallsResourcesReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/ActiveCallsResourcesReport.cshtml index 01b3f2ff..d908fa10 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/ActiveCallsResourcesReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/ActiveCallsResourcesReport.cshtml @@ -15,7 +15,7 @@ -
- - + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml index 6b21e438..58e6c324 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml @@ -15,7 +15,7 @@ -
- - + + + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml index 3433263d..ceed41bb 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml @@ -15,7 +15,7 @@ -
- - + + - + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml index ecaff9bc..bbd1fd36 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml @@ -16,7 +16,7 @@ - - + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml index 27480174..d764b2d5 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml @@ -15,7 +15,7 @@ -
- - + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml index ffc8b25c..05fd8dea 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml @@ -15,7 +15,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml index c7130513..4c452597 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml @@ -15,7 +15,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml index 1817daa1..8a1b0c3f 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml @@ -14,7 +14,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelStaffingHistoryReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelStaffingHistoryReport.cshtml index c9deb056..f569e73c 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelStaffingHistoryReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelStaffingHistoryReport.cshtml @@ -15,7 +15,7 @@ - - + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/StaffingReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/StaffingReport.cshtml index 90af2095..3cc399a1 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/StaffingReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/StaffingReport.cshtml @@ -15,7 +15,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/UnitEventsReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/UnitEventsReport.cshtml index c517ce49..7c66f716 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/UnitEventsReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/UnitEventsReport.cshtml @@ -15,7 +15,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/UnitStateHistoryReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/UnitStateHistoryReport.cshtml index 8df8d95c..3cc34164 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/UnitStateHistoryReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/UnitStateHistoryReport.cshtml @@ -15,7 +15,7 @@ - - + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/UpcomingShiftReadinessReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/UpcomingShiftReadinessReport.cshtml index bd4c93a9..5b1f88ac 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/UpcomingShiftReadinessReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/UpcomingShiftReadinessReport.cshtml @@ -12,7 +12,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/ActiveRoutes.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/ActiveRoutes.cshtml index 9866f83b..c33b1a4b 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/ActiveRoutes.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/ActiveRoutes.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.Routes.ActiveRoutesView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Active Routes"; + ViewBag.Title = "Resgrid | " + localizer["ActiveRoutesPageTitle"]; }
-

Active Routes

+

@localizer["ActiveRoutesHeader"]

@@ -21,8 +22,8 @@
-

No Active Routes

-

There are no route instances currently in progress.

+

@localizer["NoActiveRoutes"]

+

@localizer["NoActiveRoutesMessage"]

@@ -40,11 +41,11 @@
- Unit + @localizer["UnitLabel"]

@instance.UnitId

- Stops + @localizer["StopsLabel"]

@instance.StopsCompleted / @instance.StopsTotal

@@ -52,10 +53,10 @@
- Started: @(instance.ActualStartOn?.ToString("HH:mm") ?? "-") + @localizer["StartedLabel"]: @(instance.ActualStartOn?.ToString("HH:mm") ?? "-")
- View Details + @localizer["ViewDetails"]
diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/Edit.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/Edit.cshtml index 8266d80d..c0e64316 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/Edit.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/Edit.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.Routes.RouteEditView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Edit Route"; + ViewBag.Title = "Resgrid | " + localizer["EditRoutePageTitle"]; }
-

Edit Route Plan

+

@localizer["EditRoutePlanHeader"]

@@ -18,31 +19,31 @@
-
Route Details
+
@localizer["RouteDetailsTitle"]
@Html.AntiForgeryToken()
- +
- +
- +
- - - - + + + +
- +
- +
- +
@@ -93,40 +94,51 @@
-

Stops (@Model.Stops.Count)

+
+

@localizer["Stops"] (@Model.Stops.Count)

+ +
NameDescriptionCreated@localizer["Name"]@localizer["Description"]@localizer["Created"]
@map.Description @map.AddedOn.ToString("g") - Floors - Edit - Delete + @localizer["Floors"] + @localizer["Edit"] + @localizer["Delete"]
- Name + @localizer["Name"] - Color + @localizer["Color"] - Item Count + @localizer["ItemCount"] - Edit - Delete + @localizer["Edit"] + @localizer["Delete"]
- Name + @localizer["Name"] - Color + @localizer["Color"] - Point Count + @localizer["PointCount"] - View + @localizer["View"] @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { - Add - Import - Delete + @localizer["Add"] + @localizer["Import"] + @localizer["Delete"] }
- - - - - + + + + + + - + @foreach (var stop in Model.Stops) { - + + } @@ -139,8 +151,8 @@
- Cancel - + @localizer["Cancel"] +
@@ -150,11 +162,127 @@ + + + @section Scripts { } diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/Index.cshtml index 3d27dd6c..7ac3cdf5 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/Index.cshtml @@ -1,25 +1,26 @@ @model Resgrid.Web.Areas.User.Models.Routes.RouteIndexView @using Resgrid.Model +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Routes"; + ViewBag.Title = "Resgrid | " + localizer["RoutesPageTitle"]; }
-

Routes

+

@localizer["RoutesHeader"]

@@ -33,12 +34,12 @@
#NameTypeAddressPriority@localizer["StopsTableHash"]@localizer["Name"]@localizer["StopType"]@localizer["Address"]@localizer["Priority"]
@stop.StopOrder @stop.Name @((Resgrid.Model.RouteStopType)stop.StopType) @stop.Address @((Resgrid.Model.RouteStopPriority)stop.Priority) + +
- - - - - - + + + + + + @@ -52,18 +53,18 @@
NameStatusStopsProfileCreatedActions@localizer["Name"]@localizer["Status"]@localizer["Stops"]@localizer["Profile"]@localizer["Created"]@localizer["Actions"]
@plan.AddedOn.ToString("yyyy-MM-dd") - View + @localizer["View"] - Edit + @localizer["Edit"] - History + @localizer["History"]
@Html.AntiForgeryToken() -
diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/InstanceDetail.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/InstanceDetail.cshtml index 72333d6c..dd6480d5 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/InstanceDetail.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/InstanceDetail.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.Routes.RouteInstanceDetailView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Route Instance Detail"; + ViewBag.Title = "Resgrid | " + localizer["RouteInstanceDetailPageTitle"]; }
-

Route Instance - @Model.Plan.Name

+

@localizer["RouteInstanceHeaderPrefix"] - @Model.Plan.Name

@@ -18,7 +19,7 @@
-
Route Map
+
@localizer["RouteMapTitle"]
@@ -26,18 +27,18 @@
-
Instance Info
+
@localizer["InstanceInfoTitle"]
-
Status
+
@localizer["StatusLabel"]
@((Resgrid.Model.RouteInstanceStatus)Model.Instance.Status)
-
Unit
+
@localizer["Unit"]
@Model.Instance.UnitId
-
Started
+
@localizer["StartedDt"]
@(Model.Instance.ActualStartOn?.ToString("yyyy-MM-dd HH:mm") ?? "-")
-
Ended
+
@localizer["EndedDt"]
@(Model.Instance.ActualEndOn?.ToString("yyyy-MM-dd HH:mm") ?? "-")
-
Progress
+
@localizer["Progress"]
@Model.Instance.StopsCompleted / @Model.Instance.StopsTotal
@@ -50,35 +51,35 @@
-
Stop Timeline
+
@localizer["StopTimelineTitle"]
@foreach (var stop in Model.Stops.OrderBy(s => s.StopOrder)) { var statusClass = stop.Status switch { 1 => "lazur-bg", 2 => "navy-bg", 3 => "warning-bg", _ => "default-bg" }; - var statusText = stop.Status switch { 0 => "Pending", 1 => "Checked In", 2 => "Completed", 3 => "Skipped", _ => "Unknown" }; + var statusText = stop.Status switch { 0 => localizer["StopStatusPending"].Value, 1 => localizer["StopStatusCheckedIn"].Value, 2 => localizer["StopStatusCompleted"].Value, 3 => localizer["StopStatusSkipped"].Value, _ => localizer["StopStatusUnknown"].Value };
-

Stop @(stop.StopOrder + 1)

+

@localizer["StopLabel"] @(stop.StopOrder + 1)

@statusText

@if (stop.CheckInOn.HasValue) { -

In: @stop.CheckInOn.Value.ToString("HH:mm:ss")

+

@localizer["StopInPrefix"] @stop.CheckInOn.Value.ToString("HH:mm:ss")

} @if (stop.CheckOutOn.HasValue) { -

Out: @stop.CheckOutOn.Value.ToString("HH:mm:ss")

+

@localizer["StopOutPrefix"] @stop.CheckOutOn.Value.ToString("HH:mm:ss")

} @if (stop.DwellSeconds.HasValue) { -

Dwell: @(stop.DwellSeconds.Value / 60)m @(stop.DwellSeconds.Value % 60)s

+

@localizer["StopDwellPrefix"] @(stop.DwellSeconds.Value / 60)m @(stop.DwellSeconds.Value % 60)s

} @if (!string.IsNullOrEmpty(stop.SkipReason)) { -

Skip: @stop.SkipReason

+

@localizer["StopSkipPrefix"] @stop.SkipReason

}
diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/Instances.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/Instances.cshtml index feb90027..ef420dbf 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/Instances.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/Instances.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.Routes.RouteInstancesView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Route History"; + ViewBag.Title = "Resgrid | " + localizer["RouteHistoryPageTitle"]; }
-

Route History - @Model.Plan.Name

+

@localizer["RouteHistoryHeaderPrefix"] - @Model.Plan.Name

@@ -23,12 +24,12 @@ - - - - - - + + + + + + @@ -42,7 +43,7 @@ diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/New.cshtml index 09b248b9..dd42b2f3 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/New.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.Routes.RouteNewView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Route"; + ViewBag.Title = "Resgrid | " + localizer["NewRoutePageTitle"]; }
-

New Route Plan

+

@localizer["NewRoutePlanHeader"]

@@ -19,31 +20,31 @@
-
Route Details
+
@localizer["RouteDetailsTitle"]
@Html.AntiForgeryToken()
- +
- +
- +
- - + +
- +
- +
- +
@@ -92,29 +93,29 @@
-

Map & Stops

-

Stops can be managed after creating the route via the API or edit form.

+

@localizer["MapAndStopsTitle"]

+

@localizer["MapAndStopsHelp"]

- Cancel - + @localizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Routes/View.cshtml b/Web/Resgrid.Web/Areas/User/Views/Routes/View.cshtml index 9050d60e..14938540 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Routes/View.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Routes/View.cshtml @@ -1,15 +1,16 @@ @model Resgrid.Web.Areas.User.Models.Routes.RouteDetailView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Route Detail"; + ViewBag.Title = "Resgrid | " + localizer["RouteDetailPageTitle"]; }

@Model.Plan.Name

@@ -18,7 +19,7 @@
-
Route Map
+
@localizer["RouteMapTitle"]
@@ -26,23 +27,23 @@
-
Details
+
@localizer["DetailsTitle"]
-
Status
+
@localizer["StatusLabel"]
@((Resgrid.Model.RouteStatus)Model.Plan.RouteStatus)
-
Profile
+
@localizer["ProfileLabel"]
@(Model.Plan.MapboxRouteProfile ?? "driving")
-
Geofence
+
@localizer["GeofenceLabel"]
@Model.Plan.GeofenceRadiusMeters m
@if (Model.Plan.EstimatedDistanceMeters.HasValue) { -
Distance
+
@localizer["DistanceLabel"]
@(Math.Round(Model.Plan.EstimatedDistanceMeters.Value / 1000, 1)) km
} @if (Model.Plan.EstimatedDurationSeconds.HasValue) { -
Duration
+
@localizer["DurationLabel"]
@(Math.Round(Model.Plan.EstimatedDurationSeconds.Value / 60, 0)) min
}
@@ -50,7 +51,7 @@
-
Stops (@Model.Stops.Count)
+
@localizer["Stops"] (@Model.Stops.Count)
@foreach (var stop in Model.Stops.OrderBy(s => s.StopOrder)) @@ -77,8 +78,8 @@ var osmTileUrl = '@Resgrid.Config.MappingConfig.GetWebsiteOSMUrl()'; var osmTileAttribution = '@Resgrid.Config.MappingConfig.LeafletAttribution'; var routeStops = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Stops.OrderBy(s => s.StopOrder).Select(s => new { s.Name, lat = s.Latitude, lng = s.Longitude }))); - var routeGeometry = '@Html.Raw(Model.Plan.MapboxRouteGeometry ?? "")'; - var routeColor = '@Html.Raw(Model.Plan.RouteColor ?? "#3388ff")'; + var routeGeometry = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Plan.MapboxRouteGeometry ?? "")); + var routeColor = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Plan.RouteColor ?? "#3388ff")); } diff --git a/Web/Resgrid.Web/Areas/User/Views/Shared/_ChatWidget.cshtml b/Web/Resgrid.Web/Areas/User/Views/Shared/_ChatWidget.cshtml index ce86b323..7bf54376 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Shared/_ChatWidget.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Shared/_ChatWidget.cshtml @@ -1,5 +1,5 @@ - - + +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Shared/_TopNavbar.cshtml b/Web/Resgrid.Web/Areas/User/Views/Shared/_TopNavbar.cshtml index e57ded54..01191333 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Shared/_TopNavbar.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Shared/_TopNavbar.cshtml @@ -85,6 +85,9 @@ +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Subscription/ViewInvoice.cshtml b/Web/Resgrid.Web/Areas/User/Views/Subscription/ViewInvoice.cshtml index c9819a89..202989ee 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Subscription/ViewInvoice.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Subscription/ViewInvoice.cshtml @@ -15,7 +15,7 @@ -
- + - + diff --git a/Web/Resgrid.Web/Views/Account/AffiliateRegister.cshtml b/Web/Resgrid.Web/Views/Account/AffiliateRegister.cshtml index 07966569..8fc9584d 100644 --- a/Web/Resgrid.Web/Views/Account/AffiliateRegister.cshtml +++ b/Web/Resgrid.Web/Views/Account/AffiliateRegister.cshtml @@ -83,7 +83,7 @@ }
- + diff --git a/Web/Resgrid.Web/Views/Account/CompletedInvite.cshtml b/Web/Resgrid.Web/Views/Account/CompletedInvite.cshtml index 59d313c7..79f9785c 100644 --- a/Web/Resgrid.Web/Views/Account/CompletedInvite.cshtml +++ b/Web/Resgrid.Web/Views/Account/CompletedInvite.cshtml @@ -13,7 +13,7 @@ Resgrid | @localizer["CompletedInviteHeader"] -
- + - + diff --git a/Web/Resgrid.Web/Views/Account/ForgotPassword.cshtml b/Web/Resgrid.Web/Views/Account/ForgotPassword.cshtml index c05c35ae..dc31f9b0 100644 --- a/Web/Resgrid.Web/Views/Account/ForgotPassword.cshtml +++ b/Web/Resgrid.Web/Views/Account/ForgotPassword.cshtml @@ -65,7 +65,7 @@
- + diff --git a/Web/Resgrid.Web/Views/Account/Lockout.cshtml b/Web/Resgrid.Web/Views/Account/Lockout.cshtml index b771e5b6..722ecb7c 100644 --- a/Web/Resgrid.Web/Views/Account/Lockout.cshtml +++ b/Web/Resgrid.Web/Views/Account/Lockout.cshtml @@ -12,7 +12,7 @@ Resgrid | @localizer["LockedOutHeader"] -
- + - + diff --git a/Web/Resgrid.Web/Views/Account/LogOn.cshtml b/Web/Resgrid.Web/Views/Account/LogOn.cshtml index a696457f..c08d520a 100644 --- a/Web/Resgrid.Web/Views/Account/LogOn.cshtml +++ b/Web/Resgrid.Web/Views/Account/LogOn.cshtml @@ -126,6 +126,9 @@ +
@@ -177,7 +180,8 @@ 'fr': '/images/flags/32/France.png', 'it': '/images/flags/32/Italy.png', 'pl': '/images/flags/32/Poland.png', - 'uk': '/images/flags/32/Ukraine.png' + 'uk': '/images/flags/32/Ukraine.png', + 'ar': '/images/flags/32/Saudi-Arabia.png' }; if (langCookieValue) { diff --git a/Web/Resgrid.Web/Views/Account/MissingCode.cshtml b/Web/Resgrid.Web/Views/Account/MissingCode.cshtml index 9792958d..0a5e7fdc 100644 --- a/Web/Resgrid.Web/Views/Account/MissingCode.cshtml +++ b/Web/Resgrid.Web/Views/Account/MissingCode.cshtml @@ -11,7 +11,7 @@ - -
- + - + diff --git a/Web/Resgrid.Web/Views/Account/MissingInvite.cshtml b/Web/Resgrid.Web/Views/Account/MissingInvite.cshtml index 04c5e3f0..dd7163b6 100644 --- a/Web/Resgrid.Web/Views/Account/MissingInvite.cshtml +++ b/Web/Resgrid.Web/Views/Account/MissingInvite.cshtml @@ -13,7 +13,7 @@ Resgrid | @localizer["MissingInviteHeader"] -
- + - + diff --git a/Web/Resgrid.Web/Views/Account/Register.cshtml b/Web/Resgrid.Web/Views/Account/Register.cshtml index 5906d9cd..74f0b5c4 100644 --- a/Web/Resgrid.Web/Views/Account/Register.cshtml +++ b/Web/Resgrid.Web/Views/Account/Register.cshtml @@ -140,7 +140,7 @@
- + diff --git a/Web/Resgrid.Web/Views/Shared/Error.cshtml b/Web/Resgrid.Web/Views/Shared/Error.cshtml index 33b24598..6b00ab81 100644 --- a/Web/Resgrid.Web/Views/Shared/Error.cshtml +++ b/Web/Resgrid.Web/Views/Shared/Error.cshtml @@ -10,7 +10,7 @@ Resgrid - Error - - + - + diff --git a/Web/Resgrid.Web/Views/Shared/Unauthorized.cshtml b/Web/Resgrid.Web/Views/Shared/Unauthorized.cshtml index 8efdc7aa..b68831dd 100644 --- a/Web/Resgrid.Web/Views/Shared/Unauthorized.cshtml +++ b/Web/Resgrid.Web/Views/Shared/Unauthorized.cshtml @@ -10,7 +10,7 @@ Resgrid - Unauthorized - - + - + diff --git a/Web/Resgrid.Web/Views/Shared/_ScriptsPartial.cshtml b/Web/Resgrid.Web/Views/Shared/_ScriptsPartial.cshtml index aafd1f66..1b232877 100644 --- a/Web/Resgrid.Web/Views/Shared/_ScriptsPartial.cshtml +++ b/Web/Resgrid.Web/Views/Shared/_ScriptsPartial.cshtml @@ -1,10 +1,10 @@ - -
StatusUnitStartedEndedStopsActions@localizer["Status"]@localizer["Unit"]@localizer["Started"]@localizer["Ended"]@localizer["Stops"]@localizer["Actions"]
@instance.StopsCompleted / @instance.StopsTotal - Detail + @localizer["Detail"]