mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
394201cd32
* chore: bump version to 4.1.0 [skip ci] * fix(collections): stop findDuplicateCollectionPlace merging places by coordinates alone Three places answered "is this a place the trip already has?", not two: PlacesService.findDuplicatePlace and isPlaceDuplicate got the shared strategy list in #2130; CollectionsService.findDuplicateCollectionPlace was missed and kept its own hand-rolled copy of the pre-#2130 order. Unlike findDuplicatePlace, this one had no isPlaceDuplicate() guard in front of it — savePlace calls it directly — so the coordinate fallback for a NAMED candidate was live, not latent: two distinct places sharing an address (a restaurant and the bar upstairs) would report each other as duplicates the moment their coordinates round to the same ~11 m box, regardless of name. It also never read google_place_id/google_ftid/osm_id at all, even though every collection_places row stores them, so a place renamed since it was saved could be saved again instead of being recognised by its provider id. Now walks placeMatchStrategies() from @trek/shared, same as findMatchingPlaceId: provider id, then name, then coordinates only when there is no name. savePlace passes the provider id fields through since they are already on the request body; the two bulk call sites (importablePlaces, saveFromTripPlaces) are unchanged, since their source rows don't carry provider ids to pass. Closes #2137 * fix(collections): ask the same question at all three call sites savePlace was not the only caller of findDuplicateCollectionPlace. The bulk copy already carries google_place_id/google_ftid/osm_id into the row it writes but asked without them, and the import picker never selected them at all, so a renamed place was recognised on one path and not on the other two. The picker answering differently from the import is the drift the method exists to prevent: a row shown as new would come back refused. COLLECTIONS-SVC-102 and -103 cover the bulk copy and the picker. * fix(map): give the Leaflet map its own zoom ceiling, so a vector basemap cannot take the planner down Opening a trip on 4.1.0 could land on the error boundary with "Map has no maxZoom specified", and so could the map settings tab, which left no screen from which to pick a different basemap. Leaflet answers getMaxZoom() from the map options first and otherwise from a layer that brought one, and only a GridLayer ever contributes via its beforeAdd hook. A vector basemap is a GL canvas on a plain L.Layer, so it contributes nothing, and MapContainer set no ceiling of its own. MarkerClusterGroup.onAdd refuses an infinite one by throwing, before any clustering, so an empty trip hit it too. That path opened when the default basemap became a MapLibre style. It reaches further than an operator choosing OpenFreeMap: resolveTileUrl sends a keyless CARTO template to the app default, which is now a vector style, so every instance still carrying the old CARTO basemap fell into it on upgrade. The ceiling belongs on the map rather than on the base layer, because it has to hold whichever of the three branches renders. 19 matches what the raster and satellite layers already carried, so nothing changes for the maps that worked. SharedTripPage gets the same treatment: it has no cluster to throw, but it draws the same vector basemap and its fitBounds asks for a ceiling. mapZoomCeiling.test.ts pins Leaflet's own semantics against the real library rather than a mock, since a mocked react-leaflet would have kept passing through all of this. * fix(map): put the CARTO key back on the template the settings preview draws The map settings fields hold what the user is editing rather than what useTileUrl already resolved, so the preview received a bare template with no key on it. resolveTileUrl then read it as a keyless CARTO url and did what it is meant to do with one: fall back to the app default. The preview drew OpenFreeMap while the fields said CARTO, whether or not a key was saved. Same reason the tab crashed for anyone on a CARTO basemap even after entering a key, which is the loop that made this hard to escape: the key is entered on the page the fallback had taken down. FE-COMP-MAP-033b pins the template the preview is handed, with and without a key. * fix(admin): put the CARTO key back on the default-settings map preview too Same shape as the user-facing map tab, and reported alongside it: the field holds what the admin is editing, so the preview resolved a keyless CARTO template and drew the app default instead of the basemap being set. * fix(mobile): put the CARTO key back on the phone map settings preview too The third preview with the same shape, and the one that matters most while the crash is live: the phone layout is where someone would go to change the basemap when the desktop tab will not open. * fix(calendar): a fully timed stay is its two hand-overs, not a week-long bar Closes #2136 A stay was always exported as an all-day block across its whole range, and the check-in and check-out markers came on top of it. When the stay records both ends of its clock the markers already say everything the block does, and the block is the half nobody can act on: it takes a week of calendar to repeat what two one-hour events state precisely. Same shape as the parking and rental windows in #2068. Only where the markers actually stand in for the booking, though. They are emitted once per stay and titled from its lowest-id reservation, so a second room on the same stay would otherwise be left with nothing at all. A stay that knows only one end keeps its block too, since nothing else carries the other end's date. CAL-025b covers the drop, -025c the one-sided stay, -025d the second room. * fix(mobile): the phone admin map preview needs the CARTO key too The fourth preview with the same shape, missed when the other three were fixed. Sonar pointed at it: the desktop and phone admin pages are near-identical, so the duplication report named the file the change had not reached. * chore: bump version to 4.1.1 [skip ci] * feat(plugins): admin editor for instance-wide plugin settings The scope:'instance' settings a plugin declares had API endpoints but no UI. - shared: plugins.schema.ts — the settings-field descriptor and the admin instance-config GET/PUT wire contracts, imported by both sides - server: GET /api/admin/plugins/:id/config now returns the declared fields alongside the (masked) values; PUT re-spawns an ACTIVE plugin (its child reads config once, at init) and reports it via 'restarted'; the admin list carries instanceSettingsCount so the UI gates its menu item without a fetch - client: 'Instance settings' row action opening a form modal (desktop) / MSheet (phone) in both admin shells — checkbox/select/secret rendering as in the user settings form; an untouched secret mask is never sent back - i18n: three new admin.plugins.* keys in every locale * refactor(plugins): move the admin body contracts to @trek/shared The remaining plugin DTO schemas (install, link, activate, uninstall, retrust, update, egress-hosts, user-settings update, route) now live in shared/src/plugins/plugins.schema.ts with their inferred types, alongside the instance-config contracts. The journey-contract doctrine notes (#1842) moved with them — each body stays deliberately loose so the handlers keep the rejections and fallbacks they already own, and new spec tests pin that looseness so a well-meant tightening breaks a test that explains itself. plugins.dto.ts is now thin createZodDto wrappers over the shared schemas (same class names, no controller changes), and the client's pluginInstall types its options and body against PluginInstallRequest. * fix(admin): offer Allowed hosts only to plugins that declared operatorEgress The row's egress chip was already gated on the declaration, but the kebab menu (desktop) and row action sheet (phone) offered Allowed hosts on every installed plugin — inviting the admin to widen egress for plugins that never asked for it. Both entries now render only when the plugin declares operatorEgress; the dialog's unsupported-notice fallback stays as the truth-teller for stale list data. * test(admin): close the Sonar gaps on the instance-settings form The PR gate flagged new-code coverage (76.4%) and duplication (10.9%). - The two identical 39-line handler blocks were logic, not markup — they move into one shared useInstanceSettings hook; each shell keeps its own markup (the deliberate desktop/phone divergence stays) - New tests per shell cover the untested branches: every field type renders and round-trips into the save payload (select, checkbox/MToggle, number, hint, no-label key fallback), a failed fetch is a toast, a rejected save shows the server reason and keeps the edits, and the dialog/sheet closes without saving - INS-009 covers the controller's no-body '|| {}' fallback --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: michael-bohr <263459669+michael-bohr@users.noreply.github.com> Co-authored-by: Maurice <mauriceboe@icloud.com>
693 lines
60 KiB
TypeScript
693 lines
60 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
|
|
|
const admin: TranslationStrings = {
|
|
'admin.notifications.title': 'الإشعارات',
|
|
'admin.notifications.hint': 'اختر قناة إشعارات واحدة. يمكن تفعيل واحدة فقط في كل مرة.',
|
|
'admin.notifications.none': 'معطّل',
|
|
'admin.notifications.email': 'البريد الإلكتروني (SMTP)',
|
|
'admin.ntfy.hint':
|
|
'تسمح للمستخدمين بإعداد موضوعات ntfy الخاصة لتلقي إشعارات الدفع. قم بتعيين الخادم الافتراضي أدناه لملء إعدادات المستخدم مسبقًا.',
|
|
'admin.notifications.save': 'حفظ إعدادات الإشعارات',
|
|
'admin.notifications.saved': 'تم حفظ إعدادات الإشعارات',
|
|
'admin.notifications.testWebhook': 'إرسال webhook تجريبي',
|
|
'admin.notifications.testWebhookSuccess': 'تم إرسال webhook التجريبي بنجاح',
|
|
'admin.notifications.testWebhookFailed': 'فشل إرسال webhook التجريبي',
|
|
'admin.notifications.testNtfy': 'إرسال Ntfy تجريبي',
|
|
'admin.notifications.testNtfySuccess': 'تم إرسال Ntfy التجريبي بنجاح',
|
|
'admin.notifications.testNtfyFailed': 'فشل إرسال Ntfy التجريبي',
|
|
'admin.notifications.inappPanel.hint': 'الإشعارات داخل التطبيق نشطة دائمًا ولا يمكن تعطيلها بشكل عام.',
|
|
'admin.notifications.adminWebhookPanel.title': 'Webhook المسؤول',
|
|
'admin.notifications.adminWebhookPanel.hint':
|
|
'يُستخدم هذا الـ Webhook حصريًا لإشعارات المسؤول (مثل تنبيهات الإصدارات). وهو مستقل عن Webhooks المستخدمين ويُرسل تلقائيًا عند تعيين رابط URL.',
|
|
'admin.notifications.adminWebhookPanel.saved': 'تم حفظ رابط Webhook المسؤول',
|
|
'admin.notifications.adminWebhookPanel.testSuccess': 'تم إرسال Webhook الاختباري بنجاح',
|
|
'admin.notifications.adminWebhookPanel.testFailed': 'فشل إرسال Webhook الاختباري',
|
|
'admin.notifications.adminWebhookPanel.alwaysOnHint': 'يُرسل Webhook المسؤول تلقائيًا عند تعيين رابط URL',
|
|
'admin.notifications.adminNtfyPanel.title': 'Ntfy المسؤول',
|
|
'admin.notifications.adminNtfyPanel.hint':
|
|
'يُستخدم موضوع Ntfy هذا حصريًا لإشعارات المسؤول (مثل تنبيهات الإصدارات). وهو مستقل عن مواضيع المستخدمين ويُرسل دائمًا عند تهيئته.',
|
|
'admin.notifications.adminNtfyPanel.serverLabel': 'عنوان URL خادم Ntfy',
|
|
'admin.notifications.adminNtfyPanel.serverHint':
|
|
'يُستخدم أيضًا كخادم افتراضي لإشعارات ntfy للمستخدمين. اتركه فارغًا لاستخدام ntfy.sh. يمكن للمستخدمين تغييره في إعداداتهم الخاصة.',
|
|
'admin.notifications.adminNtfyPanel.topicLabel': 'موضوع المسؤول',
|
|
'admin.notifications.adminNtfyPanel.tokenLabel': 'رمز الوصول (اختياري)',
|
|
'admin.notifications.adminNtfyPanel.tokenCleared': 'تم مسح رمز وصول المسؤول',
|
|
'admin.notifications.adminNtfyPanel.saved': 'تم حفظ إعدادات Ntfy للمسؤول',
|
|
'admin.notifications.adminNtfyPanel.test': 'إرسال Ntfy تجريبي',
|
|
'admin.notifications.adminNtfyPanel.testSuccess': 'تم إرسال Ntfy التجريبي بنجاح',
|
|
'admin.notifications.adminNtfyPanel.testFailed': 'فشل إرسال Ntfy التجريبي',
|
|
'admin.notifications.adminNtfyPanel.alwaysOnHint': 'يُرسل Ntfy للمسؤول دائمًا عند تهيئة موضوع',
|
|
'admin.notifications.adminNotificationsHint':
|
|
'حدد القنوات التي تُسلّم إشعارات المسؤول (مثل تنبيهات الإصدارات). يُرسل الـ Webhook تلقائيًا عند تعيين رابط URL لـ Webhook المسؤول.',
|
|
'admin.notifications.tripReminders.title': 'تذكيرات الرحلات',
|
|
'admin.notifications.tripReminders.hint': 'إرسال تذكير قبل بدء الرحلة (يتطلب تعيين أيام التذكير على الرحلة).',
|
|
'admin.notifications.tripReminders.enabled': 'تم تفعيل تذكيرات الرحلات',
|
|
'admin.notifications.tripReminders.disabled': 'تم تعطيل تذكيرات الرحلات',
|
|
'admin.smtp.title': 'البريد والإشعارات',
|
|
'admin.smtp.hint': 'تكوين SMTP لإرسال إشعارات البريد الإلكتروني.',
|
|
'admin.smtp.testButton': 'إرسال بريد تجريبي',
|
|
'admin.webhook.hint': 'إرسال الإشعارات إلى webhook خارجي (Discord، Slack، إلخ).',
|
|
'admin.smtp.testSuccess': 'تم إرسال البريد التجريبي بنجاح',
|
|
'admin.smtp.testFailed': 'فشل إرسال البريد التجريبي',
|
|
'admin.title': 'الإدارة',
|
|
'admin.subtitle': 'إدارة المستخدمين وإعدادات النظام',
|
|
'admin.tabs.users': 'المستخدمون',
|
|
'admin.tabs.categories': 'الفئات',
|
|
'admin.tabs.backup': 'النسخ الاحتياطي',
|
|
'admin.tabs.notifications': 'الإشعارات',
|
|
'admin.tabs.audit': 'تدقيق',
|
|
'admin.stats.users': 'المستخدمون',
|
|
'admin.stats.trips': 'الرحلات',
|
|
'admin.stats.places': 'الأماكن',
|
|
'admin.stats.photos': 'الصور',
|
|
'admin.stats.files': 'الملفات',
|
|
'admin.table.user': 'المستخدم',
|
|
'admin.table.email': 'البريد الإلكتروني',
|
|
'admin.table.role': 'الدور',
|
|
'admin.table.created': 'تم الإنشاء',
|
|
'admin.table.lastLogin': 'آخر تسجيل دخول',
|
|
'admin.table.actions': 'الإجراءات',
|
|
'admin.you': '(أنت)',
|
|
'admin.editUser': 'تعديل المستخدم',
|
|
'admin.newPassword': 'كلمة مرور جديدة',
|
|
'admin.newPasswordHint': 'اتركه فارغًا للاحتفاظ بالحالية',
|
|
'admin.deleteUser': 'حذف المستخدم "{name}"؟ سيتم حذف جميع الرحلات نهائيًا.',
|
|
'admin.deleteUserTitle': 'حذف المستخدم',
|
|
'admin.newPasswordPlaceholder': 'أدخل كلمة مرور جديدة…',
|
|
'admin.toast.loadError': 'فشل تحميل بيانات الإدارة',
|
|
'admin.toast.userUpdated': 'تم تحديث المستخدم',
|
|
'admin.toast.updateError': 'فشل التحديث',
|
|
'admin.toast.userDeleted': 'تم حذف المستخدم',
|
|
'admin.toast.deleteError': 'فشل الحذف',
|
|
'admin.toast.cannotDeleteSelf': 'لا يمكنك حذف حسابك الخاص',
|
|
'admin.toast.userCreated': 'تم إنشاء المستخدم',
|
|
'admin.toast.createError': 'فشل إنشاء المستخدم',
|
|
'admin.toast.fieldsRequired': 'اسم المستخدم والبريد الإلكتروني وكلمة المرور مطلوبة',
|
|
'admin.createUser': 'إنشاء مستخدم',
|
|
'admin.invite.title': 'روابط الدعوة',
|
|
'admin.invite.subtitle': 'إنشاء روابط تسجيل للاستخدام المحدود',
|
|
'admin.invite.create': 'إنشاء رابط',
|
|
'admin.invite.createAndCopy': 'إنشاء ونسخ',
|
|
'admin.invite.empty': 'لم يتم إنشاء روابط دعوة بعد',
|
|
'admin.invite.maxUses': 'الحد الأقصى للاستخدام',
|
|
'admin.invite.expiry': 'تنتهي بعد',
|
|
'admin.invite.uses': 'مستخدم',
|
|
'admin.invite.expiresAt': 'تنتهي في',
|
|
'admin.invite.createdBy': 'بواسطة',
|
|
'admin.invite.active': 'نشط',
|
|
'admin.invite.expired': 'منتهي',
|
|
'admin.invite.usedUp': 'مستنفد',
|
|
'admin.invite.copied': 'تم نسخ رابط الدعوة',
|
|
'admin.invite.copyLink': 'نسخ الرابط',
|
|
'admin.invite.deleted': 'تم حذف رابط الدعوة',
|
|
'admin.invite.createError': 'فشل إنشاء رابط الدعوة',
|
|
'admin.invite.deleteError': 'فشل حذف رابط الدعوة',
|
|
'admin.tabs.settings': 'الإعدادات',
|
|
'admin.allowRegistration': 'السماح بالتسجيل',
|
|
'admin.allowRegistrationHint': 'يمكن للمستخدمين الجدد التسجيل بأنفسهم',
|
|
'admin.requireMfa': 'فرض المصادقة الثنائية (2FA)',
|
|
'admin.requireMfaHint': 'يجب على المستخدمين الذين لا يملكون 2FA إكمال الإعداد في الإعدادات قبل استخدام التطبيق.',
|
|
'admin.apiKeys': 'مفاتيح API',
|
|
'admin.apiKeysHint': 'اختياري. يُفعّل بيانات الأماكن الموسعة مثل الصور والطقس.',
|
|
'admin.mapsKey': 'مفتاح Google Maps API',
|
|
'admin.mapsKeyHint': 'مطلوب للبحث عن الأماكن. احصل عليه من console.cloud.google.com',
|
|
'admin.mapsKeyHintLong':
|
|
'بدون مفتاح API، يُستخدم OpenStreetMap للبحث. مع مفتاح Google يمكن تحميل الصور والتقييمات وساعات العمل أيضًا. احصل عليه من console.cloud.google.com.',
|
|
'admin.recommended': 'مُوصى به',
|
|
'admin.weatherKey': 'مفتاح OpenWeatherMap API',
|
|
'admin.weatherKeyHint': 'لبيانات الطقس. مجاني من openweathermap.org',
|
|
'admin.unsplashKey': 'مفتاح واجهة برمجة تطبيقات Unsplash',
|
|
'admin.unsplashKeyHint': 'للبحث عن الصور. مجاني من unsplash.com/developers',
|
|
'admin.validateKey': 'اختبار',
|
|
'admin.keyValid': 'متصل',
|
|
'admin.keyInvalid': 'غير صالح',
|
|
'admin.keySaved': 'تم حفظ مفاتيح API',
|
|
'admin.oidcTitle': 'تسجيل الدخول الموحد (OIDC)',
|
|
'admin.oidcSubtitle': 'السماح بتسجيل الدخول عبر مزودين خارجيين مثل Google أو Apple أو Authentik أو Keycloak.',
|
|
'admin.oidcDisplayName': 'الاسم المعروض',
|
|
'admin.oidcIssuer': 'عنوان URL للمُصدر',
|
|
'admin.oidcIssuerHint': 'عنوان OpenID Connect Issuer URL للمزود. مثال: https://accounts.google.com',
|
|
'admin.oidcSaved': 'تم حفظ إعدادات OIDC',
|
|
'admin.oidcOnlyMode': 'تعطيل المصادقة بكلمة المرور',
|
|
'admin.oidcOnlyModeHint':
|
|
'عند التفعيل، يُسمح فقط بتسجيل الدخول عبر SSO. سيتم حظر تسجيل الدخول والتسجيل بكلمة المرور.',
|
|
'admin.fileTypes': 'أنواع الملفات المسموح بها',
|
|
'admin.fileTypesHint': 'حدد أنواع الملفات التي يمكن للمستخدمين رفعها.',
|
|
'admin.fileTypesFormat': 'امتدادات مفصولة بفواصل (مثل jpg,png,pdf,doc). استخدم * للسماح بجميع الأنواع.',
|
|
'admin.fileTypesSaved': 'تم حفظ إعدادات أنواع الملفات',
|
|
'admin.placesPhotos.title': 'صور الأماكن',
|
|
'admin.placesPhotos.subtitle': 'جلب الصور من Google Places API. عطّلها للحفاظ على حصة API. صور Wikimedia غير متأثرة.',
|
|
'admin.placesAutocomplete.title': 'الإكمال التلقائي للأماكن',
|
|
'admin.placesAutocomplete.subtitle': 'استخدام Google Places API لاقتراحات البحث. عطّلها للحفاظ على حصة API.',
|
|
'admin.placesDetails.title': 'تفاصيل الأماكن',
|
|
'admin.placesDetails.subtitle':
|
|
'جلب معلومات تفصيلية عن الأماكن (الساعات، التقييم، الموقع) من Google Places API. عطّلها للحفاظ على حصة API.',
|
|
'admin.placesEnrich.title': 'إثراء الأماكن',
|
|
'admin.placesEnrich.subtitle':
|
|
'يعرض صورًا ووصفًا أثناء إضافة مكان. تُستخدم ويكيبيديا وOpenStreetMap دائمًا، وتُضاف Google عند تفعيل صور الأماكن أو تفاصيل الأماكن.',
|
|
'admin.bagTracking.title': 'تتبع الأمتعة',
|
|
'admin.bagTracking.subtitle': 'تفعيل الوزن وتعيين الأمتعة للعناصر',
|
|
'admin.collab.chat.title': 'الدردشة',
|
|
'admin.collab.chat.subtitle': 'المراسلة في الوقت الفعلي للتعاون',
|
|
'admin.collab.notes.title': 'الملاحظات',
|
|
'admin.collab.notes.subtitle': 'ملاحظات ومستندات مشتركة',
|
|
'admin.collab.polls.title': 'الاستطلاعات',
|
|
'admin.collab.polls.subtitle': 'استطلاعات وتصويت جماعي',
|
|
'admin.collab.whatsnext.title': 'ما التالي',
|
|
'admin.collab.whatsnext.subtitle': 'اقتراحات الأنشطة والخطوات التالية',
|
|
'admin.tabs.config': 'التخصيص',
|
|
'admin.tabs.defaults': 'الإعدادات الافتراضية',
|
|
'admin.defaultSettings.title': 'إعدادات المستخدم الافتراضية',
|
|
'admin.defaultSettings.description':
|
|
'تعيين الإعدادات الافتراضية على مستوى النظام. سيرى المستخدمون الذين لم يغيروا إعدادًا هذه القيم. تحظى تغييراتهم دائمًا بالأولوية.',
|
|
'admin.defaultSettings.saved': 'تم حفظ الإعداد الافتراضي',
|
|
'admin.defaultSettings.reset': 'إعادة التعيين إلى الإعداد الافتراضي المدمج',
|
|
'admin.defaultSettings.resetToBuiltIn': 'إعادة تعيين',
|
|
'admin.tabs.templates': 'قوالب التعبئة',
|
|
'admin.packingTemplates.title': 'قوالب التعبئة',
|
|
'admin.packingTemplates.subtitle': 'إنشاء قوائم تعبئة قابلة لإعادة الاستخدام',
|
|
'admin.packingTemplates.create': 'قالب جديد',
|
|
'admin.packingTemplates.namePlaceholder': 'اسم القالب (مثال: عطلة شاطئية)',
|
|
'admin.packingTemplates.empty': 'لم يتم إنشاء قوالب بعد',
|
|
'admin.packingTemplates.items': 'عناصر',
|
|
'admin.packingTemplates.categories': 'فئات',
|
|
'admin.packingTemplates.itemName': 'اسم العنصر',
|
|
'admin.packingTemplates.itemCategory': 'الفئة',
|
|
'admin.packingTemplates.categoryName': 'اسم الفئة (مثال: ملابس)',
|
|
'admin.packingTemplates.addCategory': 'إضافة فئة',
|
|
'admin.packingTemplates.created': 'تم إنشاء القالب',
|
|
'admin.packingTemplates.deleted': 'تم حذف القالب',
|
|
'admin.packingTemplates.loadError': 'فشل تحميل القوالب',
|
|
'admin.packingTemplates.createError': 'فشل إنشاء القالب',
|
|
'admin.packingTemplates.deleteError': 'فشل حذف القالب',
|
|
'admin.packingTemplates.deleteCategoryError': 'فشل حذف الفئة',
|
|
'admin.packingTemplates.deleteItemError': 'فشل حذف العنصر',
|
|
'admin.packingTemplates.saveError': 'فشل الحفظ',
|
|
'admin.tabs.addons': 'الإضافات',
|
|
'admin.tabs.plugins': 'الإضافات الخارجية',
|
|
'admin.tabs.storage': 'التخزين',
|
|
'admin.plugins.rescan': 'إعادة الفحص',
|
|
'admin.plugins.rescanned': 'تمت إعادة فحص مجلد الإضافات',
|
|
'admin.plugins.upload': 'رفع إضافة',
|
|
'admin.plugins.dropToUpload': 'أفلت ملف .zip لتثبيت الإضافة',
|
|
'admin.plugins.uploaded': 'تم رفع الإضافة “{name}” — فعّلها لتشغيلها',
|
|
'admin.plugins.sideloaded': 'محمّلة يدويًا',
|
|
'admin.plugins.devLinkBadge': 'Dev-Link',
|
|
'admin.plugins.devLinkHint': 'يُحمّل من دليل بناء محلي ويُعاد تحميله فوريًا ببيانات حقيقية — للتطوير فقط',
|
|
'admin.plugins.devLinkTitle': 'ربط إضافة محلية',
|
|
'admin.plugins.devLinkPathPlaceholder': '/absolute/path/to/your/plugin',
|
|
'admin.plugins.devLinkButton': 'ربط',
|
|
'admin.plugins.devLinkLinked': 'تم ربط {id} — فعّلها للتشغيل',
|
|
'admin.plugins.sideloadedHint': 'تم رفعها يدويًا — ليست من السجل، غير موقّعة وغير مراجَعة',
|
|
'admin.plugins.browse': 'تصفح الإضافات',
|
|
'admin.plugins.installed': 'مثبّتة',
|
|
'admin.plugins.install': 'تثبيت',
|
|
'admin.plugins.registryEmpty': 'لا توجد إضافات متاحة في السجل بعد.',
|
|
'admin.plugins.actionError': 'فشل الإجراء',
|
|
'admin.plugins.activate': 'تفعيل',
|
|
'admin.plugins.activated': 'تم تفعيل الإضافة',
|
|
'admin.plugins.deactivate': 'تعطيل',
|
|
'admin.plugins.deactivated': 'تم تعطيل الإضافة',
|
|
'admin.plugins.viewErrors': 'عرض سجل الأخطاء',
|
|
'admin.plugins.errorLog': 'سجل الأخطاء',
|
|
'admin.plugins.allowedHosts': 'المضيفون المسموح بهم',
|
|
'admin.plugins.allowedHosts.hint':
|
|
'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). أضف المضيفين الذين يمكنها الوصول إليهم — ولن تصل إلى غيرهم.',
|
|
'admin.plugins.allowedHosts.none': 'لم تتم إضافة أي مضيف بعد.',
|
|
'admin.plugins.allowedHosts.unsupported':
|
|
'لا تستخدم هذه الإضافة مضيفين يحددهم المشغّل. مضيفوها المسموح بهم ثابتون في ملف التعريف.',
|
|
'admin.plugins.allowedHosts.restartNote': 'الحفظ يعيد تشغيل الإضافة لتأخذ القائمة الجديدة.',
|
|
'admin.plugins.allowedHosts.add': 'إضافة مضيف مسموح به',
|
|
'admin.plugins.allowedHosts.count': '{n} مضيف مسموح به',
|
|
'admin.plugins.operatorEgressPill': '+ مضيفون تضيفهم',
|
|
'admin.plugins.operatorEgressHint':
|
|
'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). بعد التثبيت أضف المضيفين من ⋯ ← المضيفون المسموح بهم. ولن تصل إلى غيرهم.',
|
|
'admin.plugins.noErrors': 'لا توجد أخطاء مسجّلة.',
|
|
'admin.plugins.uninstalled': 'تمت إزالة الإضافة',
|
|
'admin.plugins.uninstallTitle': 'إزالة الإضافة؟',
|
|
'admin.plugins.uninstallBody':
|
|
'سيؤدي هذا إلى إيقاف الإضافة وإزالة تعليماتها البرمجية وحذف جميع بياناتها. لا يمكن التراجع عن هذا الإجراء.',
|
|
'admin.plugins.status.starting': 'جارٍ البدء…',
|
|
'admin.plugins.type.widget': 'Widget',
|
|
'admin.plugins.type.page': 'صفحة',
|
|
'admin.plugins.type.integration': 'تكامل',
|
|
'admin.plugins.type.trip-page': 'صفحة الرحلة',
|
|
'admin.plugins.reviewed': 'تمت مراجعتها',
|
|
'admin.plugins.unreviewed': 'لم تتم مراجعتها',
|
|
'admin.plugins.updated': 'تم تحديث الإضافة',
|
|
'admin.plugins.updateTo': 'Update → v{version}',
|
|
'admin.plugins.enabledToggle': 'تفعيل الإضافة',
|
|
'plugins.notFound': 'الإضافة غير موجودة',
|
|
'plugins.frameLoadFailed': 'This plugin could not be loaded.',
|
|
'admin.plugins.title': 'الإضافات الخارجية',
|
|
'admin.plugins.subtitle': 'ثبّت وأدر إضافات الجهات الخارجية على خادمك.',
|
|
'admin.plugins.disabledTitle': 'الإضافات الخارجية معطّلة',
|
|
'admin.plugins.disabledBody':
|
|
'بيئة تشغيل الإضافات متوقفة (TREK_PLUGINS_ENABLED). لا يمكن تشغيل أي إضافة حتى يقوم مسؤول بتفعيلها في إعدادات الخادم.',
|
|
'admin.plugins.empty': 'لم يتم تثبيت أي إضافات بعد.',
|
|
'admin.plugins.loadError': 'تعذّر تحميل الإضافات.',
|
|
'admin.plugins.scaffoldNote':
|
|
'سيتوفر تثبيت الإضافات وتفعيلها في تحديث لاحق. تعرض هذه اللوحة حاليًا الإضافات المثبّتة فقط.',
|
|
'admin.plugins.status.active': 'نشطة',
|
|
'admin.plugins.status.inactive': 'غير نشطة',
|
|
'admin.plugins.status.disabled': 'معطّلة',
|
|
'admin.plugins.status.error': 'خطأ',
|
|
'admin.plugins.status.incompatible': 'غير متوافقة',
|
|
'admin.plugins.details': 'التفاصيل',
|
|
'admin.plugins.detailError': 'تعذّر تحميل تفاصيل الإضافة.',
|
|
'admin.plugins.permissionsTitle': 'الأذونات',
|
|
'admin.plugins.noPermissions': 'لا تطلب هذه الإضافة أي أذونات خاصة.',
|
|
'admin.plugins.egressNote': 'قد تتصل بـ: {hosts}',
|
|
'admin.plugins.setupTitle': 'الإعداد',
|
|
'admin.plugins.noSetup': 'تعمل مباشرة — لا حاجة إلى أي تهيئة.',
|
|
'admin.plugins.scope.instance': 'على مستوى المثيل',
|
|
'admin.plugins.scope.user': 'لكل مستخدم',
|
|
'admin.plugins.fieldRequired': 'مطلوب',
|
|
'admin.plugins.sourceRepo': 'مستودع المصدر',
|
|
'admin.plugins.reportIssue': 'الإبلاغ عن مشكلة',
|
|
'admin.plugins.homepage': 'الصفحة الرئيسية',
|
|
'admin.plugins.requiresTrek': 'يتطلب TREK {version}+',
|
|
'admin.plugins.reviewedOn': 'تمت المراجعة {date}',
|
|
'admin.plugins.perm.db:own': 'تخزين بياناتها الخاصة في قاعدة بيانات معزولة',
|
|
'admin.plugins.perm.db:read:trips': 'قراءة الرحلات التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:read:users':
|
|
'قراءة معلومات الملف الشخصي الأساسية (الاسم والصورة الرمزية — وليس بيانات الاعتماد أبدًا)',
|
|
'admin.plugins.perm.db:read:costs': 'قراءة المصروفات (بنود الميزانية) التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:read:packing': 'قراءة قوائم الأمتعة للرحلات التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:write:packing':
|
|
'إنشاء عناصر قائمة الأمتعة وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.weather:read': 'قراءة توقعات الطقس المخزنة مؤقتًا للمضيف (حسب الإحداثيات)',
|
|
'admin.plugins.perm.db:read:categories': 'قراءة قائمة فئات الأماكن العامة',
|
|
'admin.plugins.perm.db:read:tags': 'قراءة وسوم المستخدم الحالي',
|
|
'admin.plugins.perm.db:write:tags': 'إنشاء وسوم المستخدم الحالي وتعديلها وحذفها',
|
|
'admin.plugins.perm.db:read:todos': 'قراءة مهام الرحلات التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:write:todos': 'إنشاء مهام وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:write:atlas':
|
|
'وضع علامة على البلدان والمناطق كمُزارة وإدارة قائمة أمنيات المستخدم الحالي (يتطلب إضافة Atlas)',
|
|
'admin.plugins.perm.db:write:vacay':
|
|
'تبديل أيام الإجازة وعطلات الشركة في الخطة النشطة للمستخدم الحالي (يتطلب إضافة Vacay)',
|
|
'admin.plugins.perm.db:write:journal':
|
|
'إنشاء إدخالات اليوميات وتعديلها وحذفها في اليوميات التي يمكن للمستخدم الحالي تعديلها (يتطلب إضافة Journey)',
|
|
'admin.plugins.perm.db:write:collections':
|
|
'إنشاء المجموعات وتعديلها وحفظ الأماكن فيها، بدور المجموعة الخاص بالمستخدم الحالي (يتطلب إضافة Collections)',
|
|
'admin.plugins.perm.db:write:files':
|
|
'إرفاق ملفات بالرحلات التي يمكن للمستخدم الحالي تعديلها (حد 10 ميغابايت، الامتدادات المحظورة مرفوضة) وإدارة روابطها',
|
|
'admin.plugins.perm.db:write:collab':
|
|
'نشر ملاحظات واستطلاعات ورسائل دردشة في الرحلات التي يمكن للمستخدم الحالي تعديلها (يتطلب إضافة Collab)',
|
|
'admin.plugins.perm.db:write:members':
|
|
'إضافة مستخدمين إلى الرحلات — يمنح الوصول إلى الرحلة؛ محمي بحق إدارة الأعضاء الخاص بالمستخدم الحالي',
|
|
'admin.plugins.perm.notify:send':
|
|
'إرسال إشعار (صندوق الجرس + بريد إلكتروني/ntfy) إلى المستخدم الحالي أو رحلة ينتمي إليها — لا إلى مستلم عشوائي أبدًا',
|
|
'admin.plugins.perm.ai:invoke':
|
|
'تشغيل مزود الذكاء الاصطناعي الذي أعده المسؤول (إكمال النص + استخراج المستندات) نيابة عن المستخدم الحالي — لا تحتفظ الإضافة بمفتاح أبدًا',
|
|
'admin.plugins.perm.oauth:client':
|
|
'الاتصال بخدمة خارجية نيابة عنك عبر OAuth يديره المضيف (يحتفظ المضيف بالرموز، ولا تراها الإضافة أبدًا)',
|
|
'admin.plugins.perm.db:read:files': 'قراءة ملفات الرحلات التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:write:reservations':
|
|
'إنشاء الحجوزات وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:write:accommodations':
|
|
'إنشاء أماكن الإقامة وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:read:journal': 'قراءة يوميات السفر الخاصة بالمستخدم الحالي (يتطلب إضافة Journey)',
|
|
'admin.plugins.perm.db:read:atlas': 'قراءة البلدان والمناطق التي زارها المستخدم الحالي (يتطلب إضافة Atlas)',
|
|
'admin.plugins.perm.db:read:vacay': 'قراءة خطة الإجازة الخاصة بالمستخدم الحالي (يتطلب إضافة Vacay)',
|
|
'admin.plugins.perm.db:read:daynotes': 'قراءة ملاحظات اليوم للرحلات التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:read:collections':
|
|
'قراءة مجموعات الأماكن المحفوظة الخاصة بالمستخدم الحالي (يتطلب إضافة Collections)',
|
|
'admin.plugins.perm.db:write:daynotes':
|
|
'إنشاء ملاحظات اليوم وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.jobs:run':
|
|
'تشغيل مهام الخلفية المُعلنة وفق جدول زمني (بدون سياق مستخدم — لا يمكنه قراءة بيانات المستخدم)',
|
|
'admin.plugins.perm.db:write:costs': 'إنشاء مصروفات (بنود الميزانية) على الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:write:places': 'إضافة الأماكن وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:write:days': 'إضافة الأيام وتعديلها وحذفها في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:write:itinerary': 'إسناد الأماكن وإزالتها من أيام الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:write:trips':
|
|
'تعديل تفاصيل الرحلة (العنوان، التواريخ، العملة…) في الرحلات التي يمكن للمستخدم الحالي تعديلها',
|
|
'admin.plugins.perm.db:meta': 'إرفاق بياناته الخاصة بالرحلات والأماكن والأيام التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.ws:broadcast:trip': 'إرسال تحديثات فورية إلى أعضاء الرحلة',
|
|
'admin.plugins.perm.ws:broadcast:user': 'إرسال تحديثات فورية إلى مستخدمين بعينهم',
|
|
'admin.plugins.perm.hook:photo-provider': 'توفير الصور لميزة الذكريات',
|
|
'admin.plugins.perm.hook:calendar-source': 'توفير الأحداث للتقويم',
|
|
'admin.plugins.perm.hook:place-detail-provider': 'المساهمة بتفاصيل إضافية (مراجعات، تقييمات، روابط) لمكان ما',
|
|
'admin.plugins.perm.hook:trip-warning-provider': 'إظهار تحذيرات التحقق على الرحلة (تظهر في المخطط)',
|
|
'admin.plugins.perm.hook:table-contributor': 'إضافة أعمدة وإجراءات إلى عروض الرحلة (الحجوزات، الأماكن، الأيام)',
|
|
'admin.plugins.perm.hook:map-marker-provider': 'إضافة علامات إلى خريطة الرحلة (مثل عرض الحجوزات أو نقاط الاهتمام)',
|
|
'admin.plugins.perm.hook:map-layer-provider': 'رسم مسارات وممرات ومناطق على خريطة الرحلة',
|
|
'admin.plugins.perm.hook:route-provider':
|
|
'توفير ملفات تعريف توجيه يحسب بها المخطط مسارات الأيام (مثل توجيه السيارات الكهربائية مع توقفات للشحن)',
|
|
'admin.plugins.perm.hook:day-schedule-provider': 'إلحاق مدخلات زمنية بخطة اليوم (توقفات للشحن، هوامش احتياطية)',
|
|
'admin.plugins.perm.hook:day-tint-provider':
|
|
'تلوين الأيام في خطة اليوم (مثلاً تحديد المرحلة التي ينتمي إليها كل يوم)',
|
|
'admin.plugins.cap.mcpTools': 'ينشر أدوات ذكاء اصطناعي',
|
|
'admin.plugins.mcpToolsTitle': 'أدوات الذكاء الاصطناعي المنشورة',
|
|
'admin.plugins.mcpToolsHint': 'يمكن لمساعد ذكي تشغيلها نيابة عن المستخدم. وتعمل كل أداة بالصلاحيات الممنوحة أعلاه.',
|
|
'admin.plugins.perm.mcp:tools':
|
|
'نشر أدوات يمكن لمساعد ذكاء اصطناعي تشغيلها نيابة عنك (يعمل بالصلاحيات التي تمنحها للإضافة هنا، وليس بصلاحياته هو)',
|
|
'admin.plugins.perm.geolocation:read':
|
|
'الاستعلام عن موقعك المباشر ما دامت إحدى واجهاته مفتوحة (يقرأه TREK بإذن الموقع الممنوح لهذا الموقع الإلكتروني، لا بإذن خاص بالإضافة)',
|
|
'admin.plugins.perm.hook:pdf-section-provider': 'إضافة أقسام نصية إلى تصدير PDF للرحلة',
|
|
'admin.plugins.perm.hook:atlas-layer-provider':
|
|
'إبراز دول على خريطة أطلس العالمية (مثل قوائم الأمنيات أو تحذيرات السفر)',
|
|
'admin.plugins.perm.hook:journal-entry-provider': 'إضافة صفوف إضافية (روابط، إحصاءات) إلى مدخلات اليوميات',
|
|
'admin.plugins.perm.hook:user-data':
|
|
'محو أو تصدير البيانات التي يخزّنها عن مستخدم (اللائحة العامة لحماية البيانات: حذف الحساب وطلبات البيانات)',
|
|
'admin.plugins.perm.hook:trip-card-provider': 'إضافة شارات صغيرة (الحالة، الأعداد) إلى بطاقات الرحلات في لوحة التحكم',
|
|
'admin.plugins.perm.hook:notification-channel': 'تسليم إشعاراتك عبر قناة إضافية',
|
|
'admin.plugins.perm.events:subscribe': 'التفاعل مع أحداث النشاط الأساسية (اسم الحدث والرحلة فقط، دون المحتوى مطلقًا)',
|
|
'admin.plugins.perm.http:outbound': 'إجراء طلبات صادرة إلى المضيفات المُعلنة الخاصة بها',
|
|
'admin.plugins.perm.db:read:collab':
|
|
'قراءة الملاحظات والاستطلاعات ورسائل الدردشة في الرحلات التي يمكن للمستخدم الحالي الوصول إليها (يتطلب إضافة Collab)',
|
|
'admin.plugins.perm.db:read:files:content':
|
|
'قراءة محتوى (بايتات) ملفات الرحلات التي يمكن للمستخدم الحالي الوصول إليها',
|
|
'admin.plugins.perm.db:create:trips': 'إنشاء رحلات جديدة يملكها المستخدم الحالي',
|
|
'admin.plugins.perm.rates:read': 'قراءة أسعار صرف العملات المخزنة مؤقتًا للمضيف',
|
|
'admin.plugins.updateConsentTitle': 'يتطلب هذا التحديث أذونات جديدة',
|
|
'admin.plugins.updateConsentBody':
|
|
'{name} v{version} يطلب أذونات لم تمنحها بعد. تم تثبيت الإصدار الجديد لكنه يبقى متوقفًا حتى توافق عليه.',
|
|
'admin.plugins.updateNewPermissions': 'الأذونات المطلوبة حديثًا',
|
|
'admin.plugins.updateNewEgress': 'اتصالات صادرة جديدة',
|
|
'admin.plugins.updateApprove': 'الموافقة والتفعيل',
|
|
'admin.plugins.updateLater': 'إبقاؤه متوقفًا الآن',
|
|
'admin.plugins.updateKeptOff': 'تم تثبيت التحديث — يبقى متوقفًا حتى توافق على الأذونات الجديدة',
|
|
'admin.plugins.reviewedMeaning':
|
|
'"تمت مراجعتها" تعني أن أحد القائمين على TREK فحص هذه الإضافة بحثًا عن البرمجيات الخبيثة في كل إصدار — وليس من حيث الجودة أو ما إذا كانت تعمل. وهي ليست ضمانًا بأن الإضافة غير ضارة.',
|
|
'admin.plugins.security.title': 'كيف يتم احتواء الإضافات — وحدود ذلك',
|
|
'admin.plugins.security.isolationTitle': 'كل إضافة تعمل في بيئة معزولة',
|
|
'admin.plugins.security.isolationBody':
|
|
'تعمل الإضافة كعملية معزولة خاصة بها لا يمكنها قراءة سوى ملفاتها الخاصة. لا يمكنها قراءة قاعدة بياناتك أو سر تسجيل دخولك أو مفتاح التشفير الخاص بك، ولا يمكنها تشغيل برامج أخرى، ولا يمكنها كتابة ملفات في أي مكان. تعمل واجهتها داخل إطار متصفح محكم لا يمكنه قراءة ملف تعريف ارتباط جلستك أو المساس بصفحة TREK المحيطة به.',
|
|
'admin.plugins.security.permsTitle': 'ماذا تعني الأذونات',
|
|
'admin.plugins.security.permsBody':
|
|
'الأذونات المعروضة قبل التثبيت هي حد صارم يفرضه TREK أثناء تشغيل الإضافة — فهي لا تستطيع فعليًا القيام بأي شيء ليس على القائمة. لكنها تخبرك بما يمكن للإضافة فعله، لا بما تفعله بالفعل. الإضافة المسموح لها بقراءة رحلاتك والوصول إلى خادم يمكنها إرسال رحلاتك إلى ذلك الخادم، لذا اقرأ الأذونات والمضيفات الصادرة، وليس الوصف فقط.',
|
|
'admin.plugins.security.limitsTitle': 'ما لا يمكننا ضمانه',
|
|
'admin.plugins.security.limitsBody':
|
|
'العزل هو حدّ برمجي قوي، لكنه ليس مطلقًا. تعمل الإضافة بالأذونات التي توافق عليها تمامًا، لذا يمكنها ضمن تلك الأذونات أن تتصرف بشكل مختلف عمّا يوحي به وصفها، ويمكنها إرسال البيانات التي تملكها بشكل مشروع إلى المضيفات التي أعلنتها. لا يقرأ TREK ولا يحكم على ما تفعله شيفرة الإضافة فعليًا.',
|
|
'admin.plugins.security.worstTitle': 'أسوأ الحالات',
|
|
'admin.plugins.security.worstBody':
|
|
'الإضافة الضارة التي تُفعّلها يمكنها إساءة استخدام البيانات والاتصالات التي منحتها إياها — على سبيل المثال، تسريب الرحلات المسموح لها بقراءتها. لا يمكنها سرقة كلمات المرور، أو تزوير تسجيل دخول مسؤول، أو تنفيذ أوامر على خادمك، أو الوصول إلى بيانات لم تمنحها. يبقى الضرر ضمن ما وافقت عليه، وإيقاف الإضافة يوقفه.',
|
|
'admin.plugins.security.reviewedTitle': 'ماذا تعني "تمت مراجعتها"',
|
|
'admin.plugins.security.reviewedBody':
|
|
'الإضافة التي تمت مراجعتها فُحصت يدويًا بحثًا عن البرمجيات الخبيثة بواسطة أحد القائمين على TREK في كل إصدار — جرى فحصها بحثًا عن شيفرة ضارة، لا لمعرفة ما إذا كانت تعمل جيدًا. وهي ليست وعدًا بأن الإضافة غير ضارة.',
|
|
'admin.plugins.security.signedTitle': 'ماذا تعني "موقّعة"',
|
|
'admin.plugins.security.signedBody':
|
|
'المجموع الاختباري الذي يتحقق منه TREK عند كل تثبيت يثبت أن الملفات هي بالضبط ما يضمنه السجل. أما التوقيع فيثبت شيئًا مختلفًا: أنها جاءت من المؤلف، موقّعة بمفتاح لا يملكه سواه. الإضافة الموقّعة تجمع الاثنين معًا. وغير الموقّعة ليست غير آمنة — إنها ببساطة تحمل ضمانًا واحدًا أقل، ومعظم الإضافات في السجل غير موقّعة اليوم.',
|
|
'admin.plugins.signed': 'موقّعة',
|
|
'admin.plugins.signedHint': 'جرى التحقق منها مقابل مفتاح توقيع المؤلف عند تثبيتها',
|
|
'admin.plugins.unsigned': 'غير موقّعة',
|
|
'admin.plugins.unsignedHint':
|
|
'الملفات تطابق ما يضمنه السجل، لكن لا شيء يربطها بالمؤلف. ضمان واحد أقل — وليست غير آمنة.',
|
|
'admin.plugins.updateBlocked': 'تم حظر التحديث — {reason}',
|
|
'admin.plugins.reviewBlock': 'مراجعة',
|
|
'admin.plugins.retrusted': 'تم الوثوق بمفتاح التوقيع الجديد — وتم تحديث الإضافة',
|
|
'admin.plugins.sig.title': 'تعذّر التحقق من توقيع {name}',
|
|
'admin.plugins.sig.keyChangedBody':
|
|
'مفتاح توقيع المؤلف ليس المفتاح الذي ثُبّتت به هذه الإضافة. المؤلفون يبدّلون مفاتيحهم أحيانًا — لكن مهاجمًا استولى على الإضافة سيبدو تمامًا هكذا.',
|
|
'admin.plugins.sig.invalidBody':
|
|
'الملفات لا تطابق توقيع المؤلف. إنها ليست ما وقّعه المؤلف — فإما أنها تلفت، وإما أنه جرى العبث بها. لا يمكن تجاوز ذلك.',
|
|
'admin.plugins.sig.missingBody':
|
|
'كانت هذه الإضافة موقّعة عند تثبيتها، لكن الإصدار الجديد لا يحمل أي توقيع. لن يقبل TREK هذا التراجع بصمت. لا يمكن تجاوز ذلك.',
|
|
'admin.plugins.sig.incompleteBody':
|
|
'مدخل السجل موقّع نصف توقيع: يعلن عن مفتاح للمؤلف لكن الإصدار لا يحمل توقيعًا (أو العكس). هذا خطأ من جانب الإضافة. لا يمكن تجاوز ذلك.',
|
|
'admin.plugins.sig.pinnedKey': 'المفتاح الذي ثُبّتت به',
|
|
'admin.plugins.sig.newKey': 'المفتاح الذي تقدّمه الآن',
|
|
'admin.plugins.sig.confirmOutOfBand':
|
|
'لا يستطيع TREK التمييز بين تبديل مشروع للمفتاح وبين استيلاء على الإضافة — يبدو الأمران متطابقين من هنا. تحقّق من المفتاح الجديد مع المؤلف عبر قناة تثق بها أصلًا قبل قبوله. وحين تفعل، يتم تحديث الإضافة ويُحفظ المفتاح الجديد.',
|
|
'admin.plugins.sig.retrustConfirm': 'الوثوق بالمفتاح الجديد والتحديث',
|
|
'admin.plugins.sig.cancel': 'عدم الوثوق به',
|
|
'admin.plugins.sig.consentUnsigned':
|
|
'لا شيء يربط هذا الإصدار بمؤلفه — الملفات تطابق السجل، لكنها لا تحمل توقيع المؤلف.',
|
|
'admin.plugins.security.trustTitle': 'الخلاصة',
|
|
'admin.plugins.security.trustBody':
|
|
'تثبيت إضافة يشبه تثبيت أي تطبيق من جهة خارجية: لا تُضِف سوى شيفرة من مطورين تثق بهم، وعند الشك، افحصها بنفسك أولًا. لا يتحمل TREK أي مسؤولية عن إضافات الجهات الخارجية.',
|
|
'admin.plugins.runtimeOn': 'بيئة التشغيل مفعّلة',
|
|
'admin.plugins.tabDiscover': 'اكتشاف',
|
|
'admin.plugins.searchPlaceholder': 'ابحث عن الإضافات…',
|
|
'admin.plugins.filterType': 'النوع',
|
|
'admin.plugins.filterStatus': 'الحالة',
|
|
'admin.plugins.sortBy': 'الترتيب',
|
|
'admin.plugins.allTypes': 'كل الأنواع',
|
|
'admin.plugins.allStatuses': 'الكل',
|
|
'admin.plugins.stateOff': 'متوقفة',
|
|
'admin.plugins.filterUpdate': 'يتوفر تحديث',
|
|
'admin.plugins.sortName': 'الاسم',
|
|
'admin.plugins.sortRecent': 'المحدّثة حديثًا',
|
|
'admin.plugins.sortUpdates': 'التحديثات أولًا',
|
|
'admin.plugins.sortDownloads': 'الأكثر تنزيلًا',
|
|
'admin.plugins.updatesAvailable': '{count} تحديثات متاحة لإضافاتك.',
|
|
'admin.plugins.newerNeedsTrek': 'الإصدار v{version} متوفر — يتطلب TREK {range}',
|
|
'admin.plugins.versionsTitle': 'الإصدارات',
|
|
'admin.plugins.versionPickerTitle': 'تغيير الإصدار — {name}',
|
|
'admin.plugins.versionSwitch': 'التبديل إلى {version}',
|
|
'admin.plugins.versionNeedsTrek': 'يتطلب TREK {range}',
|
|
'admin.plugins.changeVersion': 'تغيير الإصدار…',
|
|
'admin.plugins.noVersions': 'لم يتم العثور على إصدارات منشورة في السجل.',
|
|
'admin.plugins.downgradeTitle': 'التراجع عن هذه الإضافة؟',
|
|
'admin.plugins.downgradeBody': 'التبديل من v{from} إلى v{to}: تبقى البيانات المكتوبة بواسطة الإصدار الأحدث في مكانها، وقد لا يفهمها الإصدار الأقدم.',
|
|
'admin.plugins.downgradeConfirm': 'تراجع',
|
|
'admin.plugins.updatesHeld': 'التحديثات متوقفة عند v{version}',
|
|
'admin.plugins.resumeUpdates': 'استئناف التحديثات',
|
|
'admin.plugins.updatesResumed': 'تم استئناف التحديثات',
|
|
'admin.plugins.updateAll': 'تحديث الكل',
|
|
'admin.plugins.noMatchInstalled': 'لا توجد إضافات مثبّتة تطابق بحثك.',
|
|
'admin.plugins.noMatchRegistry': 'لا توجد إضافات في السجل تطابق بحثك.',
|
|
'admin.plugins.restart': 'إعادة التشغيل',
|
|
'admin.plugins.restarted': 'تمت إعادة تشغيل الإضافة',
|
|
'admin.plugins.instanceSettings': 'إعدادات مستوى الخادم',
|
|
'admin.plugins.settingsSaved': 'تم حفظ الإعدادات',
|
|
'admin.plugins.settingsSavedRestarted': 'تم حفظ الإعدادات — تمت إعادة تشغيل الإضافة',
|
|
'admin.plugins.cap.readsTrips': 'يقرأ رحلاتك',
|
|
'admin.plugins.cap.readsUsers': 'يقرأ الملفات الشخصية الأساسية',
|
|
'admin.plugins.cap.readsCosts': 'يقرأ مصروفاتك',
|
|
'admin.plugins.cap.readsPacking': 'يقرأ قوائم الأمتعة',
|
|
'admin.plugins.cap.readsFiles': 'يقرأ ملفات الرحلة',
|
|
'admin.plugins.cap.writesCosts': 'يضيف مصروفات',
|
|
'admin.plugins.cap.writesPlaces': 'يعدّل الأماكن',
|
|
'admin.plugins.cap.writesDays': 'يعدّل الأيام',
|
|
'admin.plugins.cap.writesItinerary': 'يعدّل خط السير',
|
|
'admin.plugins.cap.writesTrips': 'يعدّل الرحلات',
|
|
'admin.plugins.cap.metadata': 'يضيف بيانات وصفية',
|
|
'admin.plugins.cap.widget': 'أداة لوحة التحكم',
|
|
'admin.plugins.cap.heroWidget': 'أداة بطاقة الصعود',
|
|
'admin.plugins.cap.placeSlot': 'تفاصيل المكان',
|
|
'admin.plugins.cap.daySlot': 'تفاصيل اليوم',
|
|
'admin.plugins.cap.reservationSlot': 'تفاصيل الحجز',
|
|
'admin.plugins.cap.replacesTabs': 'يستبدل تبويبات المخطط',
|
|
'admin.plugins.cap.realtime': 'تحديثات فورية',
|
|
'admin.plugins.cap.notificationChannel': 'قناة الإشعارات',
|
|
'admin.plugins.cap.photos': 'يوفّر الصور',
|
|
'admin.plugins.cap.calendar': 'يوفّر أحداث التقويم',
|
|
'admin.plugins.cap.placeDetails': 'يُثري الأماكن',
|
|
'admin.plugins.cap.warnings': 'يرصد المشكلات',
|
|
'admin.plugins.cap.mapLayers': 'يرسم على الخريطة',
|
|
'admin.plugins.cap.routing': 'يوفّر التوجيه',
|
|
'admin.plugins.cap.daySchedule': 'يضيف أوقات الخطة',
|
|
'admin.plugins.cap.dayTint': 'يلوّن الأيام',
|
|
'admin.plugins.cap.geolocation': 'يقرأ موقعك',
|
|
'admin.plugins.cap.events': 'يتفاعل مع النشاط',
|
|
'admin.plugins.cap.requiresAddon': 'يتطلب {addon}',
|
|
'admin.plugins.cap.dependsOn': 'يحتاج إلى {id} {version}',
|
|
'admin.plugins.dep.addonDisabledToast': 'فعّل الإضافات المطلوبة أولاً: {addons}',
|
|
'admin.plugins.dep.autoEnabled': 'تم تفعيل الإضافات المطلوبة أولاً: {plugins}',
|
|
'admin.plugins.dep.downloaded': 'تم تنزيل {id}',
|
|
'admin.plugins.dep.resolveTitle': 'تبعيات مفقودة',
|
|
'admin.plugins.dep.resolveBody': 'يحتاج “{name}” إلى تثبيت هذه الإضافات قبل تفعيله.',
|
|
'admin.plugins.dep.requires': 'يتطلب {version}',
|
|
'admin.plugins.dep.mismatch': 'يحتاج إلى {wanted} — المثبَّت هو {installed}',
|
|
'admin.plugins.dep.download': 'تنزيل',
|
|
'admin.plugins.dep.update': 'تحديث',
|
|
'admin.plugins.dep.resolveHint': 'ينزّل أحدث إصدار متوافق، بما في ذلك تبعياته الخاصة.',
|
|
'admin.plugins.dep.trekIncompatible': 'يتطلب TREK {range} — يعمل هذا الخادم بالإصدار {host}',
|
|
'admin.plugins.dep.trekUnknown': 'لا يحدد إصدارات TREK المدعومة',
|
|
'admin.plugins.installCompatible': 'تثبيت {version}',
|
|
'admin.plugins.incompatible': 'غير متوافق',
|
|
'admin.plugins.accessTitle': 'ما الذي يمكنها الوصول إليه',
|
|
'admin.plugins.connectsTitle': 'يتصل بـ',
|
|
'admin.plugins.detailsTitle': 'التفاصيل',
|
|
'admin.plugins.noAccess': 'لا يحتاج إلى أي وصول خاص.',
|
|
'admin.plugins.metaVersion': 'الإصدار',
|
|
'admin.plugins.metaSize': 'الحجم',
|
|
'admin.plugins.metaRequires': 'يتطلب',
|
|
'admin.plugins.metaReviewed': 'تمت المراجعة',
|
|
'admin.plugins.downloads': 'التنزيلات',
|
|
'admin.addons.title': 'الإضافات',
|
|
'admin.addons.subtitle': 'فعّل أو عطّل الميزات لتخصيص تجربة TREK.',
|
|
'admin.addons.catalog.packing.name': 'القوائم',
|
|
'admin.addons.catalog.packing.description': 'قوائم التعبئة والمهام لرحلاتك',
|
|
'admin.addons.catalog.budget.name': 'التكاليف',
|
|
'admin.addons.catalog.budget.description': 'تتبع النفقات وخطط ميزانية الرحلة',
|
|
'admin.addons.catalog.documents.name': 'المستندات',
|
|
'admin.addons.catalog.documents.description': 'حفظ وإدارة وثائق السفر',
|
|
'admin.addons.catalog.vacay.name': 'الإجازة',
|
|
'admin.addons.catalog.vacay.description': 'مخطط إجازات شخصي مع عرض تقويم',
|
|
'admin.addons.catalog.atlas.name': 'الأطلس',
|
|
'admin.addons.catalog.atlas.description': 'خريطة العالم مع الدول التي تمت زيارتها وإحصائيات السفر',
|
|
'admin.addons.catalog.collab.name': 'التعاون',
|
|
'admin.addons.catalog.collab.description': 'ملاحظات واستطلاعات ودردشة لحظية لتخطيط الرحلة',
|
|
'admin.addons.catalog.memories.name': 'صور (Immich)',
|
|
'admin.addons.catalog.memories.description': 'شارك صور رحلتك عبر Immich',
|
|
'admin.addons.catalog.mcp.description': 'بروتوكول سياق النموذج لتكامل مساعد الذكاء الاصطناعي',
|
|
'admin.addons.subtitleBefore': 'فعّل أو عطّل الميزات لتخصيص تجربة ',
|
|
'admin.addons.subtitleAfter': '.',
|
|
'admin.addons.enabled': 'مفعّل',
|
|
'admin.addons.disabled': 'معطّل',
|
|
'admin.addons.type.trip': 'رحلة',
|
|
'admin.addons.type.global': 'عام',
|
|
'admin.addons.type.integration': 'تكامل',
|
|
'admin.addons.tripHint': 'متاح كعلامة تبويب داخل كل رحلة',
|
|
'admin.addons.globalHint': 'متاح كقسم مستقل في التنقل الرئيسي',
|
|
'admin.addons.integrationHint': 'خدمات الواجهة الخلفية وتكاملات API بدون صفحة مخصصة',
|
|
'admin.addons.toast.updated': 'تم تحديث الإضافة',
|
|
'admin.addons.toast.error': 'فشل تحديث الإضافة',
|
|
'admin.addons.noAddons': 'لا توجد إضافات متاحة',
|
|
'admin.weather.title': 'بيانات الطقس',
|
|
'admin.weather.badge': 'منذ 24 مارس 2026',
|
|
'admin.weather.description':
|
|
'يستخدم TREK خدمة Open-Meteo كمصدر لبيانات الطقس. وهي خدمة مجانية ومفتوحة المصدر ولا تتطلب مفتاح API.',
|
|
'admin.weather.forecast': 'توقعات 16 يومًا',
|
|
'admin.weather.forecastDesc': 'سابقًا 5 أيام (OpenWeatherMap)',
|
|
'admin.weather.climate': 'بيانات المناخ التاريخية',
|
|
'admin.weather.climateDesc': 'متوسطات آخر 85 سنة للأيام بعد توقعات الـ 16 يومًا',
|
|
'admin.weather.requests': '10,000 طلب / يوم',
|
|
'admin.weather.requestsDesc': 'مجاني، بدون مفتاح API',
|
|
'admin.weather.locationHint':
|
|
'يعتمد الطقس على أول مكان بإحداثيات في كل يوم. إذا لم يكن هناك مكان مخصص ليوم ما، يُستخدم أي مكان من قائمة الأماكن كمرجع.',
|
|
'admin.tabs.mcpTokens': 'وصول MCP',
|
|
'admin.mcpTokens.title': 'وصول MCP',
|
|
'admin.mcpTokens.subtitle': 'إدارة جلسات OAuth ورموز API لجميع المستخدمين',
|
|
'admin.mcpTokens.sectionTitle': 'رموز API',
|
|
'admin.mcpTokens.owner': 'المالك',
|
|
'admin.mcpTokens.tokenName': 'اسم الرمز',
|
|
'admin.mcpTokens.created': 'تاريخ الإنشاء',
|
|
'admin.mcpTokens.lastUsed': 'آخر استخدام',
|
|
'admin.mcpTokens.never': 'أبداً',
|
|
'admin.mcpTokens.empty': 'لم يتم إنشاء أي رموز MCP بعد',
|
|
'admin.mcpTokens.deleteTitle': 'حذف الرمز',
|
|
'admin.mcpTokens.deleteMessage': 'سيتم إلغاء هذا الرمز فوراً. سيفقد المستخدم وصوله إلى MCP عبر هذا الرمز.',
|
|
'admin.mcpTokens.deleteSuccess': 'تم حذف الرمز',
|
|
'admin.mcpTokens.deleteError': 'فشل حذف الرمز',
|
|
'admin.mcpTokens.loadError': 'فشل تحميل الرموز',
|
|
'admin.oauthSessions.sectionTitle': 'جلسات OAuth',
|
|
'admin.oauthSessions.clientName': 'العميل',
|
|
'admin.oauthSessions.owner': 'المالك',
|
|
'admin.oauthSessions.scopes': 'الصلاحيات',
|
|
'admin.oauthSessions.created': 'تاريخ الإنشاء',
|
|
'admin.oauthSessions.empty': 'لا توجد جلسات OAuth نشطة',
|
|
'admin.oauthSessions.revokeTitle': 'إلغاء الجلسة',
|
|
'admin.oauthSessions.revokeMessage': 'سيتم إلغاء جلسة OAuth هذه فوراً. سيفقد العميل وصوله إلى MCP.',
|
|
'admin.oauthSessions.revokeSuccess': 'تم إلغاء الجلسة',
|
|
'admin.oauthSessions.revokeError': 'فشل إلغاء الجلسة',
|
|
'admin.oauthSessions.loadError': 'فشل تحميل جلسات OAuth',
|
|
'admin.audit.subtitle': 'أحداث الأمان والإدارة (النسخ الاحتياطية، المستخدمون، المصادقة الثنائية، الإعدادات).',
|
|
'admin.audit.empty': 'لا توجد سجلات تدقيق بعد.',
|
|
'admin.audit.refresh': 'تحديث',
|
|
'admin.audit.loadMore': 'تحميل المزيد',
|
|
'admin.audit.showing': 'تم تحميل {count} · الإجمالي {total}',
|
|
'admin.audit.col.time': 'الوقت',
|
|
'admin.audit.col.user': 'المستخدم',
|
|
'admin.audit.col.action': 'الإجراء',
|
|
'admin.audit.col.resource': 'المورد',
|
|
'admin.audit.col.ip': 'عنوان IP',
|
|
'admin.audit.col.details': 'التفاصيل',
|
|
'admin.github.title': 'سجل الإصدارات',
|
|
'admin.github.subtitle': 'آخر التحديثات من {repo}',
|
|
'admin.github.latest': 'الأحدث',
|
|
'admin.github.prerelease': 'إصدار تجريبي',
|
|
'admin.github.showDetails': 'إظهار التفاصيل',
|
|
'admin.github.hideDetails': 'إخفاء التفاصيل',
|
|
'admin.github.loadMore': 'تحميل المزيد',
|
|
'admin.github.loading': 'جارٍ التحميل...',
|
|
'admin.github.error': 'فشل تحميل الإصدارات',
|
|
'admin.github.by': 'بواسطة',
|
|
'admin.github.support': 'يساعدني في تطوير TREK',
|
|
'admin.update.available': 'يتوفر تحديث',
|
|
'admin.update.text': 'TREK {version} متوفر. أنت تستخدم {current}.',
|
|
'admin.update.button': 'عرض على GitHub',
|
|
'admin.update.install': 'تثبيت التحديث',
|
|
'admin.update.confirmTitle': 'تثبيت التحديث؟',
|
|
'admin.update.confirmText': 'سيتم تحديث TREK من {current} إلى {version}. سيُعاد تشغيل الخادم تلقائيًا بعد ذلك.',
|
|
'admin.update.dataInfo':
|
|
'جميع بياناتك (الرحلات، المستخدمون، مفاتيح API، المرفوعات، الإجازة، الأطلس، الميزانيات) ستبقى محفوظة.',
|
|
'admin.update.warning': 'سيكون التطبيق غير متاح لفترة وجيزة أثناء إعادة التشغيل.',
|
|
'admin.update.confirm': 'حدّث الآن',
|
|
'admin.update.installing': 'جارٍ التحديث…',
|
|
'admin.update.success': 'تم تثبيت التحديث. ستتم إعادة تشغيل الخادم…',
|
|
'admin.update.failed': 'فشل التحديث',
|
|
'admin.update.backupHint': 'نوصي بإنشاء نسخة احتياطية قبل التحديث.',
|
|
'admin.update.backupLink': 'الذهاب إلى النسخ الاحتياطي',
|
|
'admin.update.howTo': 'كيفية التحديث',
|
|
'admin.update.dockerText': 'يعمل TREK الخاص بك في Docker. للتحديث إلى {version}، نفّذ الأوامر التالية على الخادم:',
|
|
'admin.update.nonDockerText':
|
|
'لا يعمل TREK هذا في Docker. للتحديث إلى {version}، أعد تشغيل طريقة التثبيت أو التحديث التي استخدمتها — على سبيل المثال، في Proxmox Community Scripts نفّذ التحديث من وحدة تحكم LXC:',
|
|
'admin.update.wikiLink': 'فتح دليل التحديث',
|
|
'admin.update.reloadHint': 'يرجى إعادة تحميل الصفحة بعد بضع ثوانٍ.',
|
|
'admin.tabs.permissions': 'الصلاحيات',
|
|
'admin.notifications.webhook': 'Webhook', // en-fallback
|
|
'admin.notifications.ntfy': 'Ntfy', // en-fallback
|
|
'admin.notifications.emailPanel.title': 'Email (SMTP)', // en-fallback
|
|
'admin.notifications.webhookPanel.title': 'Webhook', // en-fallback
|
|
'admin.notifications.inappPanel.title': 'In-App', // en-fallback
|
|
'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh', // en-fallback
|
|
'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts', // en-fallback
|
|
'admin.authMethods': 'Authentication Methods', // en-fallback
|
|
'admin.passwordLogin': 'Password Login', // en-fallback
|
|
'admin.passwordLoginHint': 'Allow users to sign in with email and password', // en-fallback
|
|
'admin.passwordRegistration': 'Password Registration', // en-fallback
|
|
'admin.passwordRegistrationHint': 'Allow new users to register with email and password', // en-fallback
|
|
'admin.oidcLogin': 'SSO Login', // en-fallback
|
|
'admin.oidcLoginHint': 'Allow users to sign in with SSO', // en-fallback
|
|
'admin.oidcRegistration': 'SSO Auto-Provisioning', // en-fallback
|
|
'admin.oidcRegistrationHint': 'Automatically create accounts for new SSO users', // en-fallback
|
|
'admin.envOverrideHint':
|
|
'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.', // en-fallback
|
|
'admin.lockoutWarning': 'At least one login method must remain enabled', // en-fallback
|
|
'admin.addons.catalog.mcp.name': 'MCP', // en-fallback
|
|
'admin.tabs.github': 'GitHub', // en-fallback
|
|
'admin.addons.catalog.journey.name': 'Journey', // en-fallback
|
|
'admin.addons.catalog.journey.description':
|
|
'Trip tracking & travel journal with check-ins, photos, and daily stories', // en-fallback
|
|
'admin.addons.catalog.collections.name': 'المجموعات',
|
|
'admin.addons.catalog.collections.description':
|
|
'مكتبة أماكن شخصية — احفظ الأماكن عبر الرحلات في قوائم مسماة، وانسخها إلى أي رحلة، وشاركها مع الآخرين',
|
|
'admin.passkey.title': 'تسجيل الدخول بمفتاح المرور',
|
|
'admin.passkey.cardHint': 'اسمح للمستخدمين بتسجيل الدخول باستخدام مفاتيح المرور (WebAuthn). معطّل افتراضيًا.',
|
|
'admin.passkey.login': 'تفعيل تسجيل الدخول بمفتاح المرور',
|
|
'admin.passkey.loginHint':
|
|
'إظهار خيار "تسجيل الدخول باستخدام مفتاح المرور" والسماح للمستخدمين بتسجيل مفاتيح المرور في إعداداتهم.',
|
|
'admin.passkey.notConfigured':
|
|
'لا يوجد نطاق WebAuthn صالح لهذا التثبيت بعد. عيّن APP_URL أو Relying Party ID أدناه — تبقى مفاتيح المرور مخفية حتى ذلك الحين.',
|
|
'admin.passkey.rpId': 'Relying Party ID (النطاق)',
|
|
'admin.passkey.rpIdHint':
|
|
'النطاق المجرّد الذي تُربط به مفاتيح المرور، مثل trek.example.org. اتركه فارغًا لاشتقاقه من APP_URL. تغييره لاحقًا يُبطل مفاتيح المرور الموجودة.',
|
|
'admin.passkey.origins': 'الأصول المسموح بها',
|
|
'admin.passkey.originsHint': 'أصول كاملة مفصولة بفواصل، مثل https://trek.example.org. اتركه فارغًا لاستخدام APP_URL.',
|
|
'admin.passkey.reset': 'إعادة تعيين مفاتيح المرور',
|
|
'admin.passkey.resetHint':
|
|
'إزالة جميع مفاتيح المرور لهذا المستخدم (مثلًا عند فقدان جهاز). سيظل بإمكانه تسجيل الدخول بكلمة المرور.',
|
|
'admin.passkey.resetConfirm': 'إزالة جميع مفاتيح المرور لـ {name}؟',
|
|
'admin.passkey.resetDone': 'تمت إزالة {count} من مفاتيح المرور',
|
|
'admin.defaultSettings.mapProvider': 'محرك الخرائط',
|
|
'admin.defaultSettings.mapProviderHint':
|
|
'الخريطة الافتراضية لجميع المستخدمين على هذا الخادم. لا يزال بإمكان كل مستخدم تجاوزها في إعداداته الخاصة.',
|
|
'admin.defaultSettings.providerLeaflet': 'قياسي (مجاني)',
|
|
'admin.defaultSettings.providerMapbox': 'Mapbox (ثلاثي الأبعاد)',
|
|
'admin.defaultSettings.providerMapLibre': 'MapLibre (OpenFreeMap)',
|
|
'admin.defaultSettings.mapboxToken': 'رمز Mapbox المشترك',
|
|
'admin.defaultSettings.mapboxTokenHint':
|
|
'يُستخدم لكل مستخدم لم يُدخل رمزه الخاص — حتى يحصل الخادم بأكمله على Mapbox دون مشاركة المفتاح بشكل فردي. يُخزَّن مشفّرًا.',
|
|
'admin.defaultSettings.mapboxStyle': 'نمط الخريطة',
|
|
'admin.defaultSettings.mapboxStylePlaceholder': 'اختر نمطًا…',
|
|
'admin.defaultSettings.mapbox3d': 'المباني والتضاريس ثلاثية الأبعاد',
|
|
'admin.defaultSettings.mapboxQuality': 'وضع الجودة العالية',
|
|
'admin.defaultSettings.cartoKey': 'مفتاح CARTO المشترك',
|
|
'admin.defaultSettings.cartoKeyHint':
|
|
'يُستخدم لكل مستخدم لم يُدخل مفتاحه الخاص، حتى يحصل الخادم بأكمله على بلاطات CARTO بدون علامة مائية. يُخزَّن مشفّرًا.',
|
|
'admin.group.users': 'Users',
|
|
'admin.group.config': 'Configuration',
|
|
'admin.group.integration': 'Integrations',
|
|
'admin.group.maintenance': 'Maintenance',
|
|
'admin.invite.tripLabel': 'إضافة إلى رحلة (اختياري)',
|
|
'admin.invite.tripNone': 'بدون رحلة',
|
|
'admin.invite.tripHint': 'تتم إضافة المستخدم الجديد تلقائيًا إلى هذه الرحلة عند تسجيله عبر الرابط.',
|
|
'admin.invite.boundTo': 'يُضاف إلى {trip}',
|
|
};
|
|
export default admin;
|