Files
TREK/shared/src/i18n/ar/settings.ts
T
Maurice b401da2264 fix(maps): default the Leaflet basemap to OpenFreeMap
CARTO started stamping "API KEY REQUIRED" across every keyless basemap tile
on 26.08.2026. #2060 added a key field as the immediate answer, but it leaves
a self-hosted instance needing an email exchange with CARTO before its maps
look right, and every default in the client still pointed at CARTO. Default
to OpenFreeMap Positron instead: no key, no account, no request limit,
commercial use allowed, attribution required.

OpenFreeMap serves vector tiles only, so the Leaflet basemap is a MapLibre
style document rather than an XYZ template. maplibre-gl-leaflet hangs a GL
canvas into Leaflet's own tile pane, which leaves everything above it alone -
markers, GeoJSON, clusters, plugin layers, the custom panes, and the click
handling, since Leaflet's CSS already puts pointer-events:none on that layer.
maplibre-gl still arrives only through a dynamic import, so no chunk that
draws a map grows by a megabyte.

Switched: the trip planner, the MapView fallback every preview goes through,
the journey map, collections, the atlas, the shared trip page and the offline
tile prefetch. OpenFreeMap Positron and Bright join the tile presets in
settings, the admin defaults and both mobile screens.

A CARTO template that is already saved keeps working when a key backs it -
that stays a supported choice. Without a key it is not drawn at all:
resolveTileUrl falls back to the default rather than to a watermark, so an
instance that upgrades with one in its settings sees the new basemap
immediately and needs no migration. The stored value is left as it is, so the
Map settings tab still shows what was chosen and the warning underneath it
explains why - one sentence appended, in all 23 locales.

OpenFreeMap asks for a credit of its own; OpenStreetMap alone under its tiles
is wrong and a licence problem. attributionForTile() derives it from the URL
rather than from a flag at each call site, and the shared trip map, which
carried no attribution at all, now gets one.

Offline maps keep working and get cheaper. A vector style is four things
instead of one, so sync/glPrefetcher.ts walks the style document, its sprite,
the Latin glyph ranges of each font stack it uses, the TileJSON - the planet
path is versioned, so guessing it answers 200 with an empty body - and then
the .pbf tiles. Over the Berlin bounding box TREK computes, raster z10-16 is
2237 requests and 34.6 MB and gives up above z16; vector z10-14 is 177
requests and 32.1 MB and stays sharp above that, because MapLibre scales the
z14 tile rather than asking for another. The Workbox rule for
tiles.openfreemap.org moves to CacheFirst and shares the prefetcher's cache,
so browsing tops a downloaded region up instead of filling a second copy
beside it - a versioned tile path can never be stale. Clearing offline maps
clears it too.

The atlas loses its second raster layer. It existed to warm the HTTP cache of
neighbouring zoom levels, which a vector basemap does not need; a second one
would only cost a second WebGL context. OpenFreeMap has no label-free style,
so its labels are switched off on the live map instead - they are all symbol
layers, while borders and coastlines are line and fill - re-armed on
style.load so a theme switch keeps them off.

Theme changes call setStyle in place rather than rebuilding the layer: a swap
per toggle would leak a WebGL context, and browsers cap those in the low
teens.
2026-08-29 00:51:43 +02:00

546 lines
41 KiB
TypeScript

import type { TranslationStrings } from '../types';
const settings: TranslationStrings = {
'settings.title': 'الإعدادات',
'settings.subtitle': 'ضبط إعداداتك الشخصية',
'settings.tabs.display': 'العرض',
'settings.tabs.map': 'الخريطة',
'settings.tabs.notifications': 'الإشعارات',
'settings.tabs.integrations': 'التكاملات',
'settings.plugins.oauth.connected': 'متصل',
'settings.plugins.oauth.notConnected': 'غير متصل',
'settings.plugins.oauth.connect': 'اتصال',
'settings.plugins.oauth.disconnect': 'قطع الاتصال',
'settings.tabs.plugins': 'الإضافات',
'settings.plugins.title': 'إعدادات الإضافات',
'settings.plugins.subtitle': 'إعداداتك الشخصية للإضافات التي تستخدمها (مفاتيح API، التفضيلات).',
'settings.plugins.empty': 'لا توجد إضافات نشطة.',
'settings.plugins.saved': 'تم حفظ الإعدادات',
'settings.tabs.account': 'الحساب',
'settings.tabs.about': 'حول',
'settings.map': 'الخريطة',
'settings.mapTemplate': 'قالب الخريطة',
'settings.mapTemplatePlaceholder.select': 'اختر قالبًا...',
'settings.mapDefaultHint': 'اتركه فارغًا لاستخدام OpenStreetMap افتراضيًا',
'settings.mapHint': 'قالب URL لبلاطات الخريطة',
'settings.mapProvider': 'مزود الخريطة',
'settings.mapProviderHint': 'يؤثر على خرائط Trip Planner و Journey. يستخدم Atlas دائمًا Leaflet.',
'settings.mapLeafletSubtitle': '2D كلاسيكي، أي بلاطات نقطية',
'settings.mapMapboxSubtitle': 'بلاطات متجهية ومبانٍ ثلاثية الأبعاد وتضاريس',
'settings.mapMapLibreSubtitle': 'بلاطات متجهية من OpenFreeMap، بدون رمز',
'settings.mapExperimental': 'تجريبي',
'settings.mapMapboxToken': 'رمز وصول Mapbox',
'settings.mapMapboxTokenHint': 'الرمز العام (pk.*) من',
'settings.mapMapboxTokenLink': 'mapbox.com ← رموز الوصول',
'settings.mapCartoKey': 'مفتاح CARTO API',
'settings.mapCartoKeyHint': 'تعرض خرائط CARTO الأساسية علامة مائية بدون مفتاح. مجاني وبدون حساب، من',
'settings.mapCartoKeyLink': 'مفتاح API لخرائط carto.com الأساسية',
'settings.mapCartoKeyMissing':
'هذا القالب خريطة أساسية من CARTO. بدون مفتاح تطبع CARTO عبارة "API KEY REQUIRED" على كل بلاطة. إلى أن تُدخل مفتاحًا، تعرض TREK الخريطة الأساسية الافتراضية بدلاً منها.',
'settings.mapStyle': 'نمط الخريطة',
'settings.mapStylePlaceholder': 'اختر نمط Mapbox',
'settings.mapStyleHint': 'إعداد مسبق أو عنوان URL mapbox://styles/USER/ID خاص بك',
'settings.mapOpenFreeMapStylePlaceholder': 'اختر نمط OpenFreeMap',
'settings.mapOpenFreeMapStyleHint': 'إعداد مسبق أو عنوان URL لنمط OpenFreeMap. تعمل أنماط OpenFreeMap بدون رمز.',
'settings.map3dBuildings': 'مبانٍ ثلاثية الأبعاد وتضاريس',
'settings.map3dHint': 'إمالة + مبانٍ ثلاثية الأبعاد حقيقية — يعمل مع كل نمط بما في ذلك الأقمار الصناعية.',
'settings.mapHighQuality': 'وضع الجودة العالية',
'settings.mapHighQualityHint': 'تحسين الحواف + إسقاط كروي لحواف أكثر حدة وعرض واقعي للعالم.',
'settings.mapHighQualityWarning': 'قد يؤثر على الأداء في الأجهزة الأقل قدرة.',
'settings.mapTipLabel': 'نصيحة:',
'settings.mapTip':
'انقر بزر الماوس الأيمن واسحب لتدوير/إمالة الخريطة. النقر الأوسط لإضافة مكان (النقر الأيمن مخصص للتدوير).',
'settings.saveMap': 'حفظ الخريطة',
'settings.apiKeys': 'مفاتيح API',
'settings.mapsKey': 'مفتاح Google Maps API',
'settings.mapsKeyHint': 'للبحث عن الأماكن. يتطلب Places API (New).',
'settings.weatherKey': 'مفتاح OpenWeatherMap API',
'settings.weatherKeyHint': 'لبيانات الطقس.',
'settings.keyPlaceholder': 'أدخل المفتاح...',
'settings.configured': 'مُعدّ',
'settings.saveKeys': 'حفظ المفاتيح',
'settings.display': 'العرض',
'settings.colorMode': 'نمط الألوان',
'settings.light': 'فاتح',
'settings.dark': 'داكن',
'settings.auto': 'تلقائي',
'settings.language': 'اللغة',
'settings.temperature': 'وحدة الحرارة',
'settings.distance': 'وحدة المسافة',
'settings.timeFormat': 'تنسيق الوقت',
'settings.bookingLabels': 'تسميات مسارات الحجوزات',
'settings.bookingLabelsHint': 'عرض أسماء المحطات/المطارات على الخريطة. عند الإيقاف، يتم عرض الرمز فقط.',
'settings.blurBookingCodes': 'إخفاء رموز الحجز',
'settings.aiAlwaysRetry': 'Always retry booking imports with AI',
'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.',
'settings.optimizeFromAccommodation': 'تحسين المسار انطلاقًا من مكان الإقامة',
'settings.optimizeFromAccommodationHint':
'عند تحسين يوم ما، يبدأ المسار من الفندق الذي تستيقظ فيه وينتهي عند الفندق الذي تسجّل الوصول إليه في تلك الليلة.',
'settings.notifications': 'الإشعارات',
'settings.notifyTripInvite': 'دعوات الرحلات',
'settings.notifyBookingChange': 'تغييرات الحجز',
'settings.notifyTripReminder': 'تذكيرات الرحلات',
'settings.notifyTodoDue': 'مهمة مستحقة',
'settings.notifyVacayInvite': 'دعوات دمج الإجازات',
'settings.notifyVacayShare': 'مشاركات تقويم Vacay',
'settings.notifyPhotosShared': 'صور مشتركة (Immich)',
'settings.notifyCollabMessage': 'رسائل الدردشة (Collab)',
'settings.notifyPackingTagged': 'قائمة الأمتعة: التعيينات',
'settings.notifyWebhook': 'إشعارات Webhook',
'settings.notifyVersionAvailable': 'إصدار جديد متاح',
'settings.notificationPreferences.noChannels':
'لم يتم تكوين قنوات إشعارات. اطلب من المسؤول إعداد إشعارات البريد الإلكتروني أو webhook.',
'settings.webhookUrl.label': 'رابط Webhook',
'settings.webhookUrl.hint': 'أدخل رابط Webhook الخاص بـ Discord أو Slack أو المخصص لتلقي الإشعارات.',
'settings.webhookUrl.saved': 'تم حفظ رابط Webhook',
'settings.webhookUrl.test': 'اختبار',
'settings.webhookUrl.testSuccess': 'تم إرسال Webhook الاختباري بنجاح',
'settings.webhookUrl.testFailed': 'فشل إرسال Webhook الاختباري',
'settings.ntfyUrl.topicLabel': 'موضوع Ntfy',
'settings.ntfyUrl.serverLabel': 'عنوان URL خادم Ntfy (اختياري)',
'settings.ntfyUrl.hint':
'أدخل موضوع Ntfy الخاص بك لتلقي الإشعارات الفورية. اترك حقل الخادم فارغاً لاستخدام الإعداد الافتراضي الذي حدده المسؤول.',
'settings.ntfyUrl.tokenLabel': 'رمز الوصول (اختياري)',
'settings.ntfyUrl.tokenHint': 'مطلوب للمواضيع المحمية بكلمة مرور.',
'settings.ntfyUrl.saved': 'تم حفظ إعدادات Ntfy',
'settings.ntfyUrl.test': 'اختبار',
'settings.ntfyUrl.testSuccess': 'تم إرسال إشعار Ntfy التجريبي بنجاح',
'settings.ntfyUrl.testFailed': 'فشل إشعار Ntfy التجريبي',
'settings.ntfyUrl.tokenCleared': 'تم مسح رمز الوصول',
'settings.notificationsDisabled': 'الإشعارات غير مكوّنة. اطلب من المسؤول تفعيل إشعارات البريد الإلكتروني أو Webhook.',
'settings.notificationsActive': 'القناة النشطة',
'settings.notificationsManagedByAdmin': 'يتم تكوين أحداث الإشعارات بواسطة المسؤول.',
'settings.on': 'تشغيل',
'settings.off': 'إيقاف',
'settings.mcp.title': 'إعداد MCP',
'settings.mcp.endpoint': 'نقطة نهاية MCP',
'settings.mcp.clientConfig': 'إعداد العميل',
'settings.mcp.clientConfigHint':
'استبدل <your_token> برمز API من القائمة أدناه. قد يحتاج مسار npx إلى ضبط وفق نظامك (مثلاً C:\\PROGRA~1\\nodejs\\npx.cmd على Windows).',
'settings.mcp.clientConfigHintOAuth':
'استبدل <your_client_id> و<your_client_secret> ببيانات الاعتماد المعروضة في عميل OAuth 2.1 الذي أنشأته أعلاه. سيفتح mcp-remote متصفحك لإتمام التفويض في أول اتصال. قد يحتاج مسار npx إلى تعديل حسب نظامك (مثال: C:PROGRA~1\nodejs\npx.cmd على Windows).',
'settings.mcp.copy': 'نسخ',
'settings.mcp.copied': 'تم النسخ!',
'settings.mcp.apiTokens': 'رموز API',
'settings.mcp.createToken': 'إنشاء رمز جديد',
'settings.mcp.noTokens': 'لا توجد رموز بعد. أنشئ رمزاً للاتصال بعملاء MCP.',
'settings.mcp.tokenCreatedAt': 'أُنشئ',
'settings.mcp.tokenUsedAt': 'استُخدم',
'settings.mcp.deleteTokenTitle': 'حذف الرمز',
'settings.mcp.deleteTokenMessage': 'سيتوقف هذا الرمز عن العمل فوراً. أي عميل MCP يستخدمه سيفقد الوصول.',
'settings.mcp.modal.createTitle': 'إنشاء رمز API',
'settings.mcp.modal.tokenName': 'اسم الرمز',
'settings.mcp.modal.tokenNamePlaceholder': 'مثال: Claude Desktop، حاسوب العمل',
'settings.mcp.modal.creating': 'جارٍ الإنشاء…',
'settings.mcp.modal.create': 'إنشاء الرمز',
'settings.mcp.modal.createdTitle': 'تم إنشاء الرمز',
'settings.mcp.modal.createdWarning': 'سيُعرض هذا الرمز مرة واحدة فقط. انسخه واحفظه الآن — لا يمكن استرداده.',
'settings.mcp.modal.done': 'تم',
'settings.mcp.toast.created': 'تم إنشاء الرمز',
'settings.mcp.toast.createError': 'فشل إنشاء الرمز',
'settings.mcp.toast.deleted': 'تم حذف الرمز',
'settings.mcp.toast.deleteError': 'فشل حذف الرمز',
'settings.mcp.apiTokensDeprecated':
'رموز API قديمة وستُزال في إصدار مستقبلي. يُرجى استخدام عملاء OAuth 2.1 بدلاً منها.',
'settings.oauth.clients': 'عملاء OAuth 2.1',
'settings.oauth.clientsHint':
'سجّل عملاء OAuth 2.1 للسماح لتطبيقات MCP الخارجية (Claude Web وCursor وغيرها) بالاتصال دون رموز ثابتة.',
'settings.oauth.createClient': 'عميل جديد',
'settings.oauth.noClients': 'لا يوجد عملاء OAuth مسجلون.',
'settings.oauth.clientId': 'معرّف العميل',
'settings.oauth.clientSecret': 'سر العميل',
'settings.oauth.deleteClient': 'حذف العميل',
'settings.oauth.deleteClientMessage':
'سيتم حذف هذا العميل وجميع الجلسات النشطة بشكل دائم. ستفقد أي تطبيق يستخدمه وصوله فوراً.',
'settings.oauth.rotateSecret': 'تجديد السر',
'settings.oauth.rotateSecretMessage':
'سيتم إنشاء سر عميل جديد وإبطال جميع الجلسات الحالية فوراً. حدّث تطبيقك قبل إغلاق هذا الحوار.',
'settings.oauth.rotateSecretConfirm': 'تجديد',
'settings.oauth.rotateSecretConfirming': 'جارٍ التجديد…',
'settings.oauth.rotateSecretDoneTitle': 'تم إنشاء سر جديد',
'settings.oauth.rotateSecretDoneWarning':
'يُعرض هذا السر مرة واحدة فقط. انسخه الآن وحدّث تطبيقك — تم إبطال جميع الجلسات السابقة.',
'settings.oauth.activeSessions': 'جلسات OAuth النشطة',
'settings.oauth.sessionScopes': 'النطاقات',
'settings.oauth.sessionExpires': 'تنتهي',
'settings.oauth.revoke': 'إلغاء',
'settings.oauth.revokeSession': 'إلغاء الجلسة',
'settings.oauth.revokeSessionMessage': 'سيؤدي هذا إلى إلغاء الوصول لهذه الجلسة OAuth فوراً.',
'settings.oauth.modal.createTitle': 'تسجيل عميل OAuth',
'settings.oauth.modal.presets': 'إعدادات سريعة',
'settings.oauth.modal.clientName': 'اسم التطبيق',
'settings.oauth.modal.clientNamePlaceholder': 'مثال: Claude Web، تطبيق MCP الخاص بي',
'settings.oauth.modal.redirectUris': 'عناوين URI لإعادة التوجيه',
'settings.oauth.modal.redirectUrisHint': 'عنوان URI واحد لكل سطر. يُطلب HTTPS (localhost مستثنى). يُطبق تطابق دقيق.',
'settings.oauth.modal.scopes': 'النطاقات المسموح بها',
'settings.oauth.modal.scopesHint':
'list_trips وget_trip_summary متاحان دائماً — لا يُطلب نطاق. يساعدان الذكاء الاصطناعي في اكتشاف معرّفات الرحلات.',
'settings.oauth.modal.selectAll': 'تحديد الكل',
'settings.oauth.modal.deselectAll': 'إلغاء تحديد الكل',
'settings.oauth.modal.creating': 'جارٍ التسجيل…',
'settings.oauth.modal.create': 'تسجيل العميل',
'settings.oauth.modal.createdTitle': 'تم تسجيل العميل',
'settings.oauth.modal.createdWarning': 'يُعرض سر العميل مرة واحدة فقط. انسخه الآن — لا يمكن استرداده.',
'settings.oauth.toast.createError': 'فشل تسجيل عميل OAuth',
'settings.oauth.toast.deleted': 'تم حذف عميل OAuth',
'settings.oauth.toast.deleteError': 'فشل حذف عميل OAuth',
'settings.oauth.toast.revoked': 'تم إلغاء الجلسة',
'settings.oauth.toast.revokeError': 'فشل إلغاء الجلسة',
'settings.oauth.toast.rotateError': 'فشل تجديد سر العميل',
'settings.oauth.modal.machineClient': 'عميل آلي (بدون تسجيل دخول عبر المتصفح)',
'settings.oauth.modal.machineClientHint':
'استخدام منحة client_credentials — لا تحتاج إلى عناوين إعادة التوجيه. يُصدر الرمز المميز مباشرةً عبر client_id + client_secret ويعمل بصلاحياتك ضمن النطاقات المحددة.',
'settings.oauth.modal.machineClientUsage':
'للحصول على رمز مميز: POST /oauth/token مع grant_type=client_credentials وclient_id وclient_secret. بدون متصفح، بدون رمز تحديث.',
'settings.oauth.badge.machine': 'آلي',
'settings.account': 'الحساب',
'settings.about': 'حول',
'settings.about.reportBug': 'الإبلاغ عن خطأ',
'settings.about.reportBugHint': 'وجدت مشكلة؟ أخبرنا',
'settings.about.featureRequest': 'اقتراح ميزة',
'settings.about.featureRequestHint': 'اقترح ميزة جديدة',
'settings.about.wikiHint': 'التوثيق والأدلة',
'settings.about.descriptionManaged':
'TREK helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place.',
'settings.about.sourceTitle': 'Source code',
'settings.about.sourceHint': 'TREK is open source, licensed AGPL-3.0',
'settings.about.supporters.badge': 'الداعمون الشهريون',
'settings.about.supporters.title': 'رفاق رحلة TREK',
'settings.about.supporters.subtitle':
'بينما تخطّط لمسارك التالي، يساعد هؤلاء الأشخاص في التخطيط لمستقبل TREK. تذهب مساهمتهم الشهرية مباشرةً إلى التطوير والساعات الفعلية المبذولة — حتى يظلّ TREK مفتوح المصدر.',
'settings.about.supporters.since': 'داعم منذ {date}',
'settings.about.supporters.tierEmpty': 'كن الأول',
'settings.about.description':
'TREK هو مخطط سفر مستضاف ذاتيًا يساعدك على تنظيم رحلاتك من أول فكرة حتى آخر ذكرى. تخطيط يومي، ميزانية، قوائم تعبئة، صور والمزيد — كل شيء في مكان واحد، على خادمك الخاص.',
'settings.about.madeWith': 'صُنع بـ',
'settings.about.madeBy': 'بواسطة موريس ومجتمع مفتوح المصدر متنامٍ.',
'settings.username': 'اسم المستخدم',
'settings.email': 'البريد الإلكتروني',
'settings.role': 'الدور',
'settings.roleAdmin': 'مسؤول',
'settings.oidcLinked': 'مرتبط مع',
'settings.changePassword': 'تغيير كلمة المرور',
'settings.currentPassword': 'كلمة المرور الحالية',
'settings.currentPasswordRequired': 'كلمة المرور الحالية مطلوبة',
'settings.newPassword': 'كلمة المرور الجديدة',
'settings.confirmPassword': 'تأكيد كلمة المرور الجديدة',
'settings.updatePassword': 'تحديث كلمة المرور',
'settings.passwordRequired': 'أدخل كلمة المرور الحالية والجديدة',
'settings.passwordTooShort': 'يجب أن تتكون كلمة المرور من 8 أحرف على الأقل',
'settings.passwordMismatch': 'كلمتا المرور غير متطابقتين',
'settings.passwordWeak': 'يجب أن تحتوي كلمة المرور على حرف كبير وحرف صغير ورقم ورمز خاص',
'settings.passwordChanged': 'تم تغيير كلمة المرور بنجاح',
'settings.mustChangePassword': 'يجب عليك تغيير كلمة المرور قبل المتابعة. يرجى تعيين كلمة مرور جديدة أدناه.',
'settings.deleteAccount': 'حذف الحساب',
'settings.deleteAccountTitle': 'هل تريد حذف حسابك؟',
'settings.deleteAccountWarning': 'سيتم حذف حسابك وجميع رحلاتك وأماكنك وملفاتك نهائيًا. لا يمكن التراجع عن ذلك.',
'settings.deleteAccountConfirm': 'حذف نهائي',
'settings.deleteBlockedTitle': 'الحذف غير ممكن',
'settings.deleteBlockedMessage': 'أنت المسؤول الوحيد. قم بترقية مستخدم آخر إلى مسؤول قبل حذف حسابك.',
'settings.roleUser': 'مستخدم',
'settings.saveProfile': 'حفظ الملف الشخصي',
'settings.toast.mapSaved': 'تم حفظ إعدادات الخريطة',
'settings.toast.keysSaved': 'تم حفظ مفاتيح API',
'settings.toast.displaySaved': 'تم حفظ إعدادات العرض',
'settings.toast.profileSaved': 'تم حفظ الملف الشخصي',
'settings.uploadAvatar': 'رفع صورة الملف الشخصي',
'settings.removeAvatar': 'إزالة صورة الملف الشخصي',
'settings.avatarUploaded': 'تم تحديث صورة الملف الشخصي',
'settings.avatarRemoved': 'تمت إزالة صورة الملف الشخصي',
'settings.avatarError': 'فشل الرفع',
'settings.avatarRemoveError': 'فشل الحذف',
'settings.mfa.title': 'المصادقة الثنائية (2FA)',
'settings.mfa.description':
'تضيف خطوة ثانية عند تسجيل الدخول. استخدم تطبيق مصادقة (Google Authenticator، Authy، إلخ).',
'settings.mfa.requiredByPolicy': 'المسؤول يتطلب المصادقة الثنائية. اضبط تطبيق المصادقة أدناه قبل المتابعة.',
'settings.mfa.backupTitle': 'رموز النسخ الاحتياطي',
'settings.mfa.backupDescription': 'استخدم هذه الرموز لمرة واحدة إذا فقدت الوصول إلى تطبيق المصادقة.',
'settings.mfa.backupWarning': 'احفظ هذه الرموز الآن. كل رمز يمكن استخدامه مرة واحدة فقط.',
'settings.mfa.backupCopy': 'نسخ الرموز',
'settings.mfa.backupDownload': 'تنزيل TXT',
'settings.mfa.backupPrint': 'طباعة / PDF',
'settings.mfa.backupCopied': 'تم نسخ رموز النسخ الاحتياطي',
'settings.mfa.enabled': 'المصادقة الثنائية مفعّلة على حسابك.',
'settings.mfa.disabled': 'المصادقة الثنائية غير مفعّلة.',
'settings.mfa.setup': 'إعداد المصادقة',
'settings.mfa.scanQr': 'امسح رمز QR بتطبيقك أو أدخل المفتاح يدويًا.',
'settings.mfa.secretLabel': 'المفتاح السري (إدخال يدوي)',
'settings.mfa.codePlaceholder': 'رمز من 6 أرقام',
'settings.mfa.enable': 'تفعيل 2FA',
'settings.mfa.cancelSetup': 'إلغاء',
'settings.mfa.disableTitle': 'تعطيل 2FA',
'settings.mfa.disableHint': 'أدخل كلمة مرور حسابك ورمزًا حاليًا من المصادقة.',
'settings.mfa.disable': 'تعطيل 2FA',
'settings.mfa.toastEnabled': 'تم تفعيل المصادقة الثنائية',
'settings.mfa.toastDisabled': 'تم تعطيل المصادقة الثنائية',
'settings.mfa.demoBlocked': 'غير متاح في الوضع التجريبي',
'settings.tabs.offline': 'Offline', // en-fallback
'settings.notificationPreferences.email': 'Email', // en-fallback
'settings.notificationPreferences.webhook': 'Webhook', // en-fallback
'settings.notificationPreferences.inapp': 'In-App', // en-fallback
'settings.notificationPreferences.notConfigured': 'لم يتم الإعداد بعد — قم بإعداده من إعدادات الإضافة',
'settings.plugins.actions': 'الإجراءات',
'settings.plugins.actions.confirm': 'تنفيذ هذا الإجراء؟',
'settings.notificationPreferences.sendTest': 'إرسال اختبار',
'settings.notificationPreferences.configure': 'تهيئة',
'settings.notificationPreferences.testSuccess': 'تم إرسال إشعار اختباري.',
'settings.notificationPreferences.testFailed': 'فشل الاختبار.',
'settings.notificationPreferences.pluginConfigured': 'تم الإعداد. أدر بيانات الاعتماد من صفحة إعدادات الإضافة.',
'settings.notificationPreferences.ntfy': 'Ntfy', // en-fallback
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', // en-fallback
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts', // en-fallback
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh', // en-fallback
'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth', // en-fallback
'settings.about.supporter.tier.noReturnTicket': 'No Return Ticket', // en-fallback
'settings.about.supporter.tier.lostLuggageVip': 'Lost Luggage VIP', // en-fallback
'settings.about.supporter.tier.businessClassDreamer': 'Business Class Dreamer', // en-fallback
'settings.about.supporter.tier.budgetTraveller': 'Budget Traveller', // en-fallback
'settings.about.supporter.tier.hostelBunkmate': 'Hostel Bunkmate', // en-fallback
'settings.currency': 'عملة العرض',
'settings.currencyHint':
'تُعرض المبالغ في التكاليف محوّلة إلى هذه العملة للعرض فقط — تبقى المبالغ الأصلية دون تغيير.',
'settings.currencyTrip': 'عملة الرحلة',
'settings.passkey.title': 'مفاتيح المرور',
'settings.passkey.description':
'سجّل الدخول بشكل أسرع وأكثر مقاومة للتصيّد باستخدام مفتاح مرور — ببصمة إصبعك أو وجهك أو رمز PIN أو مفتاح أمان مادي. تبقى كلمة المرور كنسخة احتياطية.',
'settings.passkey.notConfigured':
'مفاتيح المرور مفعّلة لكنها لم تُهيّأ بالكامل على هذا الخادم بعد. اطلب من المسؤول تعيين نطاق WebAuthn.',
'settings.passkey.add': 'إضافة مفتاح مرور',
'settings.passkey.addTitle': 'إضافة مفتاح مرور',
'settings.passkey.passwordPrompt': 'أكّد كلمة المرور الحالية، ثم اتبع التعليمات على جهازك.',
'settings.passkey.passwordRequired': 'كلمة المرور الحالية مطلوبة.',
'settings.passkey.namePlaceholder': 'الاسم (اختياري، مثل "iPhone")',
'settings.passkey.addedToast': 'تمت إضافة مفتاح المرور',
'settings.passkey.added': 'تمت الإضافة',
'settings.passkey.addError': 'تعذّرت إضافة مفتاح المرور',
'settings.passkey.cancelled': 'تم إلغاء إعداد مفتاح المرور',
'settings.passkey.deleted': 'تمت إزالة مفتاح المرور',
'settings.passkey.deleteConfirm': 'إزالة مفتاح المرور هذا؟ أكّد بكلمة المرور الخاصة بك.',
'settings.passkey.rename': 'إعادة التسمية',
'settings.passkey.defaultName': 'مفتاح المرور',
'settings.passkey.synced': 'متزامن',
'settings.passkey.deviceBound': 'هذا الجهاز',
'settings.passkey.lastUsed': 'آخر استخدام',
'settings.passkey.neverUsed': 'لم يُستخدم قط',
'settings.mapPoiPill': 'استكشاف الأماكن على الخريطة',
'settings.mapPoiPillHint':
'أظهر شريط فئات على خريطة الرحلة للعثور على المطاعم والفنادق والمزيد القريبة من OpenStreetMap.',
'settings.airtrail.title': 'AirTrail',
'settings.airtrail.hint':
'اربط نسخة AirTrail المُستضافة ذاتيًا لاستيراد الرحلات ومزامنتها. أنشئ مفتاح API في AirTrail ضمن الإعدادات ← الأمان.',
'settings.airtrail.url': 'رابط النسخة',
'settings.airtrail.apiKey': 'مفتاح API',
'settings.airtrail.apiKeyPlaceholder': 'مفتاح API من نوع Bearer',
'settings.airtrail.apiKeyHint': 'يُنشأ في AirTrail ضمن الإعدادات ← الأمان. يُخزَّن مشفّرًا.',
'settings.airtrail.allowInsecureTls': 'السماح بالشهادات الموقّعة ذاتيًا',
'settings.airtrail.allowInsecureTlsHint': 'فعّل هذا فقط لنسخة موثوقة على شبكتك الخاصة.',
'settings.airtrail.writeBack': 'كتابة التغييرات إلى AirTrail',
'settings.airtrail.writeBackHint':
'مُعطّل افتراضيًا: AirTrail هو مصدر الحقيقة وTREK يقرأ منه فقط. فعّله لإرسال التعديلات التي تجريها في TREK إلى AirTrail.',
'settings.airtrail.connected': 'متصل',
'settings.airtrail.notConnected': 'غير متصل',
'settings.airtrail.toast.saved': 'تم حفظ اتصال AirTrail',
'settings.airtrail.toast.saveError': 'تعذّر حفظ الاتصال',
'settings.airtrail.test.button': 'اختبار الاتصال',
'settings.airtrail.test.success': 'متصل — تم العثور على {count} رحلة/رحلات',
'settings.airtrail.test.failed': 'فشل الاتصال',
'settings.aiParsing.title': 'التحليل بالذكاء الاصطناعي',
'settings.aiParsing.hint':
'اختر نموذج الذكاء الاصطناعي المستخدم لاستخراج الحجوزات من الملفات المرفوعة. لا يسري هذا إلا عندما لا يكون المسؤول قد أعدّ نموذجًا للنظام بأكمله.',
'settings.aiParsing.provider': 'المزوّد',
'settings.aiParsing.providerLocal': 'محلي (Ollama)',
'settings.aiParsing.providerOpenai': 'OpenAI',
'settings.aiParsing.providerAnthropic': 'Anthropic',
'settings.aiParsing.localAdminOnly':
'يتم إعداد نقطة نهاية محلية (Ollama) مرة واحدة للمثيل بأكمله من إعدادات المسؤول. ولا يزال بإمكانك استخدام مفتاح OpenAI أو Anthropic الخاص بك هنا.',
'settings.aiParsing.model': 'النموذج',
'settings.aiParsing.baseUrl': 'عنوان URL الأساسي',
'settings.aiParsing.baseUrlHint': 'المكان الذي يعمل فيه النموذج — خادم Ollama محلي أو نقطة نهاية متوافقة مع OpenAI.',
'settings.aiParsing.apiKey': 'مفتاح API',
'settings.aiParsing.apiKeyHint': 'يُخزَّن مشفّرًا. اتركه فارغًا للإبقاء على المفتاح الحالي.',
'settings.aiParsing.multimodal': 'إرسال المستندات كصور',
'settings.aiParsing.multimodalHint': 'للنماذج القادرة على الرؤية — يرسل ملف PDF الأصلي بدلًا من النص المستخرج.',
'settings.aiParsing.toast.saved': 'تم حفظ إعدادات الذكاء الاصطناعي',
'settings.aiParsing.toast.saveError': 'تعذّر حفظ إعدادات الذكاء الاصطناعي',
'settings.tabs.appearance': 'Appearance',
'settings.appearance.theme': 'Theme',
'settings.appearance.scheme': 'Color scheme',
'settings.appearance.scheme.default': 'Default',
'settings.appearance.scheme.highContrast': 'High contrast',
'settings.appearance.scheme.indigo': 'Indigo',
'settings.appearance.scheme.teal': 'Teal',
'settings.appearance.scheme.rose': 'Rose',
'settings.appearance.scheme.amber': 'Amber',
'settings.appearance.scheme.violet': 'Violet',
'settings.appearance.scheme.custom': 'Custom',
'settings.appearance.customAccent': 'Custom accent',
'settings.appearance.contrastOk': 'Good contrast',
'settings.appearance.contrastLow': 'Low contrast',
'settings.appearance.readability': 'Readability',
'settings.appearance.transparency': 'Transparency',
'settings.appearance.transparencyHint':
'Glassy translucent surfaces. Turn off for solid, higher-contrast backgrounds.',
'settings.appearance.reduceMotion': 'Reduce motion',
'settings.appearance.reduceMotionHint': 'Minimize animations and transitions.',
'settings.appearance.density': 'Density',
'settings.appearance.comfortable': 'Comfortable',
'settings.appearance.compact': 'Compact',
'settings.appearance.textSize': 'Text size',
'settings.appearance.advancedTextSizes': 'Advanced text sizes',
'settings.appearance.hideAdvanced': 'Hide advanced',
'settings.appearance.tier.title': 'Titles',
'settings.appearance.tier.subtitle': 'Subtitles',
'settings.appearance.tier.body': 'Body',
'settings.appearance.tier.caption': 'Captions',
'settings.appearance.dashboardWidgets': 'Dashboard widgets',
'settings.appearance.dashboardWidgetsHint': 'Show or hide dashboard widgets independently on desktop and mobile.',
'settings.appearance.desktop': 'Desktop',
'settings.appearance.mobile': 'Mobile',
'settings.appearance.widget.sidebar': 'Right sidebar',
'settings.appearance.widget.currency': 'Currency',
'settings.appearance.widget.collections': 'المجموعات',
'settings.appearance.widget.timezones': 'Timezones',
'settings.appearance.widget.upcomingReservations': 'Upcoming reservations',
'settings.appearance.widget.atlas': 'Atlas / countries',
'settings.appearance.widget.tripsTotal': 'Trips total',
'settings.appearance.widget.daysTraveled': 'Days traveled',
'settings.appearance.widget.distanceFlown': 'Distance flown',
'settings.appearance.reset': 'Reset to defaults',
'settings.appearance.group.belowHero': 'Below the hero',
'settings.appearance.group.bottomOfPage': 'Bottom of page',
'settings.appearance.sidebarHint': 'The whole right column. Turn off and the dashboard centers.',
'settings.appearance.densityHint':
'Compact tightens spacing and padding for a denser layout that fits more on screen.',
'settings.appearance.textSizeAll': 'Everything',
'settings.appearance.perSize': 'Adjust each size separately',
'settings.appearance.size.large': 'Large',
'settings.appearance.size.medium': 'Medium',
'settings.appearance.size.normal': 'Normal',
'settings.appearance.size.small': 'Small',
'settings.appearance.preview.large': 'Large heading',
'settings.appearance.preview.medium': 'Medium subtitle',
'settings.appearance.preview.normal': 'Normal body text',
'settings.appearance.preview.small': 'Small caption / address',
'settings.appearance.example.large': 'Headings, big numbers',
'settings.appearance.example.medium': 'Sub-headings',
'settings.appearance.example.normal': 'Place names, descriptions',
'settings.appearance.example.small': 'Addresses, labels',
'settings.appearance.experimental': 'Experimental',
'settings.appearance.mobileNav': 'شريط التنقّل السفلي',
'settings.appearance.mobileNav.hint':
'اختَر العناصر التي تظهر في الشريط وتلك التي توضَع ضمن «المزيد». تبقى لوحة التحكّم دائماً في المقدّمة.',
'settings.appearance.mobileNav.inBar': 'في الشريط',
'settings.appearance.mobileNav.underMore': 'ضمن «المزيد»',
'settings.appearance.mobileNav.moreEmpty': 'لا شيء هنا بعد — كل العناصر تتّسع في الشريط.',
'settings.appearance.mobileNav.pinned': 'مثبَّت',
'settings.appearance.mobileNav.toMore': 'نقل إلى «المزيد»',
'settings.appearance.mobileNav.toBar': 'نقل إلى الشريط',
'settings.appearance.dashOrder': 'ترتيب لوحة التحكم',
'settings.appearance.dashOrder.hint':
'أعد ترتيب تسلسل قائمة الرحلات والأدوات على لوحة تحكم هاتفك. تبقى الرحلة المميّزة دائمًا في الأعلى.',
'settings.appearance.dashOrder.trips': 'الرحلات',
'settings.appearance.dashOrder.hidden': 'مخفي',
'settings.general.languageRegion': 'Language & region',
'settings.general.travelMap': 'Travel & map',
'settings.general.startup': 'البدء',
'settings.startPage': 'صفحة البدء',
'settings.startPageDashboard': 'لوحة التحكم',
'settings.startPageActiveTrip': 'الرحلة النشطة',
'settings.startPageHint':
'يفتح TREK مباشرةً على الرحلة الجارية، وإن لم توجد فعلى الرحلة القادمة التالية. وهي نفس الرحلة التي تبرزها لوحة التحكم.',
'settings.startTripTab': 'علامة تبويب البدء',
'settings.startTripTabHint':
'علامة التبويب التي تفتح بها الرحلة. إذا كانت تابعة لإضافة أوقفت تشغيلها، تُفتح الخطة بدلاً منها.',
// ── Offline (#1135)
'settings.offline.cache.title': 'ذاكرة التخزين المؤقت دون اتصال',
'settings.offline.mode.title': 'وضع عدم الاتصال',
'settings.offline.mode.force': 'فرض وضع عدم الاتصال',
'settings.offline.mode.forceHint':
'اعمل من البيانات المخزّنة مؤقتًا فقط وضع تغييراتك في قائمة الانتظار. أوقفه لإعادة الاتصال والمزامنة.',
'settings.offline.mode.active': 'وضع عدم الاتصال مفعّل — تغييراتك في قائمة الانتظار وستتم مزامنتها عند إيقافه.',
'settings.offline.prepare.title': 'التحضير للعمل دون اتصال',
'settings.offline.prepare.hint':
'نزّل كل ما تحتاجه — بيانات الرحلة والمستندات وبلاطات الخريطة — قبل أن تفقد الاتصال.',
'settings.offline.prepare.button': 'تنزيل للاستخدام دون اتصال',
'settings.offline.prepare.running': 'جارٍ التنزيل…',
'settings.offline.prepare.done': 'جاهز للاستخدام دون اتصال',
'settings.offline.prepare.phase.trips': 'بيانات الرحلة',
'settings.offline.prepare.phase.files': 'المستندات',
'settings.offline.prepare.phase.tiles': 'بلاطات الخريطة',
'settings.offline.resync': 'أعد المزامنة الآن',
'settings.offline.resyncing': 'جارٍ المزامنة…',
'settings.offline.storage.title': 'ما يتم تخزينه دون اتصال',
'settings.offline.storage.tiles': 'تخزين بلاطات الخريطة دون اتصال',
'settings.offline.storage.tilesHint':
'تستهلك بلاطات الخريطة أكبر مساحة تخزين. أوقف هذا للاحتفاظ ببيانات الرحلة والمستندات فقط دون اتصال.',
'settings.offline.storage.tripsTitle': 'الرحلات',
'settings.offline.storage.tripOn': 'مخزّن دون اتصال',
'settings.offline.storage.tripOff': 'غير مخزّن',
'settings.offline.clear': 'مسح ذاكرة التخزين المؤقت',
'settings.offline.clearConfirm':
'هل تريد مسح جميع بيانات الرحلة المخزّنة دون اتصال؟ يمكنك إعادة المزامنة في أي وقت أثناء الاتصال.',
'settings.offline.stats.trips': 'الرحلات المخزّنة مؤقتًا',
'settings.offline.stats.pending': 'تغييرات معلّقة',
'settings.offline.stats.failed': 'تغييرات فاشلة',
'settings.offline.stats.conflicts': 'تعارضات',
'settings.offline.empty': 'لا توجد رحلات مخزّنة بعد. اتصل بالإنترنت للمزامنة.',
'settings.offline.loading': 'جارٍ التحميل…',
'settings.offline.conflicts.title': 'تعارضات المزامنة',
'settings.offline.conflicts.hint':
'تتعارض التغييرات التي أجريتها دون اتصال مع تغييرات أحدث على الخادم. اختر الإصدار الذي تريد الاحتفاظ به.',
'settings.offline.conflicts.keepMine': 'الاحتفاظ بنسختي',
'settings.offline.conflicts.keepServer': 'الاحتفاظ بنسخة الخادم',
'settings.offline.conflicts.mine': 'نسختك',
'settings.offline.conflicts.server': 'نسخة الخادم',
'settings.offline.conflicts.item': 'تغيير على “{name}”',
'settings.offline.conflicts.strategyTitle': 'عند حدوث تعارض',
'settings.offline.conflicts.strategy.ask': 'اسألني في كل مرة',
'settings.offline.conflicts.strategy.mine': 'الاحتفاظ بنسختي دائمًا',
'settings.offline.conflicts.strategy.server': 'الاحتفاظ بنسخة الخادم دائمًا',
'settings.offline.banner.offline': 'دون اتصال',
'settings.offline.banner.forced': 'وضع عدم الاتصال',
'settings.offline.banner.queued': 'دون اتصال · {count} في قائمة الانتظار',
'settings.offline.banner.syncing': 'جارٍ مزامنة {count}…',
'settings.offline.banner.failed': 'فشلت المزامنة: {count}',
'settings.offline.banner.conflicts': 'تعارضات: {count}',
'settings.pluginActivity.title': 'نشاط الإضافات',
'settings.pluginActivity.description': 'كل إجراء نفّذته إضافة نيابةً عنك، الأحدث أولاً.',
'settings.pluginActivity.empty': 'لا يوجد نشاط للإضافات بعد.',
'settings.pluginActivity.refresh': 'تحديث',
'settings.pluginActivity.columns.plugin': 'الإضافة',
'settings.pluginActivity.columns.action': 'الإجراء',
'settings.pluginActivity.columns.resource': 'المورد',
'settings.pluginActivity.columns.when': 'الوقت',
'settings.pluginActivity.columns.status': 'النتيجة',
'settings.alwaysShowRoutes': 'إظهار مسارات الحجوزات دائمًا',
'settings.alwaysShowRoutesHint':
'يعرض تلقائيًا مسار كل رحلة طيران وقطار وحجز آخر على الخريطة، دون الحاجة إلى تفعيله لكل عنصر على حدة.',
// Public API keys (Settings -> Integrations)
'settings.apiKeys.title': 'مفاتيح API',
'settings.apiKeys.description': 'مفاتيح لواجهة API العامة، حتى تتمكن برامج أخرى من قراءة رحلاتك. للقراءة فقط: لا يمكن للمفتاح تغيير أي شيء أو حذفه.',
'settings.apiKeys.create': 'إنشاء مفتاح',
'settings.apiKeys.empty': 'لا توجد مفاتيح بعد. أنشئ مفتاحًا لربط برامج أخرى.',
'settings.apiKeys.createdAt': 'أُنشئ',
'settings.apiKeys.usedAt': 'آخر استخدام',
'settings.apiKeys.deleteTitle': 'حذف المفتاح',
'settings.apiKeys.deleteMessage': 'كل ما يستخدم هذا المفتاح سيتوقف فورًا. لا يمكن التراجع عن ذلك.',
'settings.apiKeys.deleted': 'تم حذف المفتاح',
'settings.apiKeys.deleteFailed': 'تعذّر حذف المفتاح',
'settings.apiKeys.createFailed': 'تعذّر إنشاء المفتاح',
'settings.apiKeys.copy': 'نسخ',
'settings.apiKeys.docsHint': 'أرسل المفتاح بصيغة "Authorization: Bearer ..." أو "X-API-Key: ..." إلى /api/v1.',
'settings.apiKeys.modal.createTitle': 'إنشاء مفتاح API',
'settings.apiKeys.modal.name': 'الاسم',
'settings.apiKeys.modal.namePlaceholder': 'مثال: Dawarich',
'settings.apiKeys.modal.nameHint': 'لك وحدك، لتتعرّف على المفتاح لاحقًا.',
'settings.apiKeys.modal.creating': 'جارٍ الإنشاء...',
'settings.apiKeys.modal.create': 'إنشاء',
'settings.apiKeys.modal.createdTitle': 'تم إنشاء مفتاح API',
'settings.apiKeys.modal.createdWarning': 'انسخ المفتاح الآن. يُعرض مرة واحدة فقط ولا يمكن استرجاعه لاحقًا.',
'settings.apiKeys.modal.done': 'تم',
};
export default settings;