fix(i18n): every language says one file and five files its own way

Finishes the plural work the previous wip commit started. t() picks a
count string's form by the language's own Intl.PluralRules, and every
locale now spells out the forms its language reaches with whole
numbers, about 160 count strings in all: one, few and many in Russian,
Ukrainian and Polish, one and few in Czech and Slovak, five forms in
Arabic, one in the others, none in Japanese, Korean, Chinese, Thai,
Vietnamese and Indonesian. Each language was translated and then
reviewed on its own. English no longer reads "1 files", "1 updates
available" or "photo(s)".

Count labels shown next to a number now take that number too: the
atlas and admin statistics, the trip cards, journey and shared trip
pills, packing templates, receipts, storage usage, the Studio export
note. A heading that shared its key with a counted label keeps a key of
its own (the boarding pass heading, the Bookings tab), so languages that
put a noun after a number in the singular keep a plural heading. The
plugin hosts chip passed its count through .replace() after t() and
never got a form; three toasts sent the count as text. Mail and push
texts for shared photos and suppressed storage failures pick their form
in code through pluralForm.

A whole number sent as text counts too, which is how in-app
notification params arrive, and the plural rule follows the language of
the strings on screen while another one still loads.

The parity check knows which forms each language needs and refuses
missing and impossible ones. It also reads keys that contain a colon
now: it skipped them, which hid 58 missing plugin permission texts in
Catalan and 35 in Vietnamese, both translated. The client parity test
covers every language of the registry instead of a hand-kept list of 19,
and the placeholder spec lets a form spell its number out only where
its category is that one number. Brazilian Portuguese error screens
were in Breton, and an Arabic dashboard label held Hebrew text.
This commit is contained in:
Maurice
2026-10-08 00:01:59 +00:00
parent 55697b75c1
commit bee500880e
851 changed files with 11378 additions and 6077 deletions
+53 -8
View File
@@ -62,11 +62,31 @@ const admin: TranslationStrings = {
'admin.tabs.backup': 'النسخ الاحتياطي',
'admin.tabs.notifications': 'الإشعارات',
'admin.tabs.audit': 'تدقيق',
'admin.stats.users': 'المستخدمون',
'admin.stats.trips': 'الرحلات',
'admin.stats.places': 'الأماكن',
'admin.stats.users': 'مستخدم',
'admin.stats.users.zero': 'مستخدمين',
'admin.stats.users.one': 'مستخدم',
'admin.stats.users.two': 'مستخدمان',
'admin.stats.users.few': 'مستخدمين',
'admin.stats.users.many': 'مستخدمًا',
'admin.stats.trips': 'رحلة',
'admin.stats.trips.zero': 'رحلات',
'admin.stats.trips.one': 'رحلة',
'admin.stats.trips.two': 'رحلتان',
'admin.stats.trips.few': 'رحلات',
'admin.stats.trips.many': 'رحلة',
'admin.stats.places': 'مكان',
'admin.stats.places.zero': 'أماكن',
'admin.stats.places.one': 'مكان',
'admin.stats.places.two': 'مكانان',
'admin.stats.places.few': 'أماكن',
'admin.stats.places.many': 'مكانًا',
'admin.stats.photos': 'الصور',
'admin.stats.files': 'الملفات',
'admin.stats.files': 'ملف',
'admin.stats.files.zero': 'ملفات',
'admin.stats.files.one': 'ملف',
'admin.stats.files.two': 'ملفان',
'admin.stats.files.few': 'ملفات',
'admin.stats.files.many': 'ملفًا',
'admin.table.user': 'المستخدم',
'admin.table.email': 'البريد الإلكتروني',
'admin.table.role': 'الدور',
@@ -248,8 +268,18 @@ const admin: TranslationStrings = {
'admin.packingTemplates.create': 'قالب جديد',
'admin.packingTemplates.namePlaceholder': 'اسم القالب (مثال: عطلة شاطئية)',
'admin.packingTemplates.empty': 'لم يتم إنشاء قوالب بعد',
'admin.packingTemplates.items': 'عناصر',
'admin.packingTemplates.categories': 'فئات',
'admin.packingTemplates.items': 'عنصر',
'admin.packingTemplates.items.zero': 'عناصر',
'admin.packingTemplates.items.one': 'عنصر',
'admin.packingTemplates.items.two': 'عنصران',
'admin.packingTemplates.items.few': 'عناصر',
'admin.packingTemplates.items.many': 'عنصرًا',
'admin.packingTemplates.categories': 'فئة',
'admin.packingTemplates.categories.zero': 'فئات',
'admin.packingTemplates.categories.one': 'فئة',
'admin.packingTemplates.categories.two': 'فئتان',
'admin.packingTemplates.categories.few': 'فئات',
'admin.packingTemplates.categories.many': 'فئة',
'admin.packingTemplates.itemName': 'اسم العنصر',
'admin.packingTemplates.itemCategory': 'الفئة',
'admin.packingTemplates.categoryName': 'اسم الفئة (مثال: ملابس)',
@@ -298,6 +328,11 @@ const admin: TranslationStrings = {
'admin.plugins.allowedHosts.restartNote': 'الحفظ يعيد تشغيل الإضافة لتأخذ القائمة الجديدة.',
'admin.plugins.allowedHosts.add': 'إضافة مضيف مسموح به',
'admin.plugins.allowedHosts.count': '{n} مضيف مسموح به',
'admin.plugins.allowedHosts.count.zero': 'لا يوجد مضيفون مسموح بهم',
'admin.plugins.allowedHosts.count.one': 'مضيف واحد مسموح به',
'admin.plugins.allowedHosts.count.two': 'مضيفان مسموح بهما',
'admin.plugins.allowedHosts.count.few': '{n} مضيفين مسموح بهم',
'admin.plugins.allowedHosts.count.many': '{n} مضيفًا مسموحًا به',
'admin.plugins.operatorEgressPill': '+ مضيفون تضيفهم',
'admin.plugins.operatorEgressHint':
'تتصل هذه الإضافة بخدمة لا يمكن لأحد سواك تسميتها (خادم مستضاف ذاتيًا). بعد التثبيت أضف المضيفين من ⋯ ← المضيفون المسموح بهم. ولن تصل إلى غيرهم.',
@@ -515,7 +550,12 @@ const admin: TranslationStrings = {
'admin.plugins.sortRecent': 'المحدّثة حديثًا',
'admin.plugins.sortUpdates': 'التحديثات أولًا',
'admin.plugins.sortDownloads': 'الأكثر تنزيلًا',
'admin.plugins.updatesAvailable': '{count} تحديثات متاحة لإضافاتك.',
'admin.plugins.updatesAvailable': 'يتوفر {count} تحديث لإضافاتك.',
'admin.plugins.updatesAvailable.zero': 'لا تتوفر تحديثات لإضافاتك.',
'admin.plugins.updatesAvailable.one': 'يتوفر تحديث واحد لإضافاتك.',
'admin.plugins.updatesAvailable.two': 'يتوفر تحديثان لإضافاتك.',
'admin.plugins.updatesAvailable.few': 'يتوفر {count} تحديثات لإضافاتك.',
'admin.plugins.updatesAvailable.many': 'يتوفر {count} تحديثًا لإضافاتك.',
'admin.plugins.newerNeedsTrek': 'الإصدار v{version} متوفر — يتطلب TREK {range}',
'admin.plugins.versionsTitle': 'الإصدارات',
'admin.plugins.versionPickerTitle': 'تغيير الإصدار — {name}',
@@ -783,7 +823,12 @@ const admin: TranslationStrings = {
'admin.passkey.resetHint':
'إزالة جميع مفاتيح المرور لهذا المستخدم (مثلًا عند فقدان جهاز). سيظل بإمكانه تسجيل الدخول بكلمة المرور.',
'admin.passkey.resetConfirm': 'إزالة جميع مفاتيح المرور لـ {name}؟',
'admin.passkey.resetDone': 'تمت إزالة {count} من مفاتيح المرور',
'admin.passkey.resetDone': 'تمت إزالة {count} مفتاح مرور',
'admin.passkey.resetDone.zero': 'لم تتم إزالة أي مفتاح مرور',
'admin.passkey.resetDone.one': 'تمت إزالة مفتاح مرور واحد',
'admin.passkey.resetDone.two': 'تمت إزالة مفتاحَي مرور',
'admin.passkey.resetDone.few': 'تمت إزالة {count} مفاتيح مرور',
'admin.passkey.resetDone.many': 'تمت إزالة {count} مفتاح مرور',
'admin.defaultSettings.mapProvider': 'محرك الخرائط',
'admin.defaultSettings.mapProviderHint':
'الخريطة الافتراضية لجميع المستخدمين على هذا الخادم. لا يزال بإمكان كل مستخدم تجاوزها في إعداداته الخاصة.',
+62 -11
View File
@@ -2,9 +2,24 @@ import type { TranslationStrings } from '../types';
const atlas: TranslationStrings = {
'atlas.subtitle': 'بصمتك السفرية حول العالم',
'atlas.countries': 'الدول',
'atlas.trips': 'الرحلات',
'atlas.places': 'الأماكن',
'atlas.countries': 'دولة',
'atlas.countries.zero': 'دول',
'atlas.countries.one': 'دولة',
'atlas.countries.two': 'دولتان',
'atlas.countries.few': 'دول',
'atlas.countries.many': 'دولة',
'atlas.trips': 'رحلة',
'atlas.trips.zero': 'رحلات',
'atlas.trips.one': 'رحلة',
'atlas.trips.two': 'رحلتان',
'atlas.trips.few': 'رحلات',
'atlas.trips.many': 'رحلة',
'atlas.places': 'مكان',
'atlas.places.zero': 'أماكن',
'atlas.places.one': 'مكان',
'atlas.places.two': 'مكانان',
'atlas.places.few': 'أماكن',
'atlas.places.many': 'مكانًا',
'atlas.placesShow': 'عرض الأماكن في هذا البلد',
'atlas.placesSearch': 'البحث عن أماكن',
'atlas.placesNone': 'لا يوجد مكان مطابق',
@@ -33,20 +48,43 @@ const atlas: TranslationStrings = {
'atlas.bucketNotesPlaceholder': 'ملاحظات (اختياري)',
'atlas.bucketEmpty': 'قائمة أمنياتك فارغة',
'atlas.bucketEmptyHint': 'أضف أماكن تحلم بزيارتها',
'atlas.days': 'الأيام',
'atlas.days': 'يوم',
'atlas.days.zero': 'أيام',
'atlas.days.one': 'يوم',
'atlas.days.two': 'يومان',
'atlas.days.few': 'أيام',
'atlas.days.many': 'يومًا',
'atlas.visitedCountries': 'الدول التي تمت زيارتها',
'atlas.cities': 'المدن',
'atlas.regions': 'المناطق',
'atlas.cities': 'مدينة',
'atlas.cities.zero': 'مدن',
'atlas.cities.one': 'مدينة',
'atlas.cities.two': 'مدينتان',
'atlas.cities.few': 'مدن',
'atlas.cities.many': 'مدينة',
'atlas.regions': 'منطقة',
'atlas.regions.zero': 'مناطق',
'atlas.regions.one': 'منطقة',
'atlas.regions.two': 'منطقتان',
'atlas.regions.few': 'مناطق',
'atlas.regions.many': 'منطقة',
'atlas.noData': 'لا توجد بيانات سفر بعد',
'atlas.noDataHint': 'أنشئ رحلة وأضف أماكن لرؤية خريطتك العالمية',
'atlas.nextTrip': 'الرحلة القادمة',
'atlas.daysLeft': 'يوم متبقٍ',
'atlas.streak': 'سلسلة',
'atlas.years': 'سنوات',
'atlas.yearsInRow': 'سنوات متتالية',
'atlas.yearsInRow': 'سنة متتالية',
'atlas.yearsInRow.zero': 'سنوات متتالية',
'atlas.yearsInRow.one': 'سنة متتالية',
'atlas.tripsIn': 'رحلات في',
'atlas.yearsInRow.two': 'سنتان متتاليتان',
'atlas.yearsInRow.few': 'سنوات متتالية',
'atlas.yearsInRow.many': 'سنة متتالية',
'atlas.tripsIn': 'رحلة في',
'atlas.tripsIn.zero': 'رحلات في',
'atlas.tripsIn.one': 'رحلة في',
'atlas.tripsIn.two': 'رحلتان في',
'atlas.tripsIn.few': 'رحلات في',
'atlas.tripsIn.many': 'رحلة في',
'atlas.since': 'منذ',
'atlas.europe': 'أوروبا',
'atlas.asia': 'آسيا',
@@ -57,14 +95,27 @@ const atlas: TranslationStrings = {
'atlas.other': 'أخرى',
'atlas.firstVisit': 'أول رحلة',
'atlas.lastVisitLabel': 'آخر رحلة',
'atlas.tripPlural': 'رحلات',
'atlas.tripsLabel': 'رحلات',
'atlas.tripsLabel': 'رحلة',
'atlas.tripsLabel.zero': 'رحلات',
'atlas.tripsLabel.one': 'رحلة',
'atlas.placesVisited': 'أماكن تمت زيارتها',
'atlas.tripsLabel.two': 'رحلتان',
'atlas.tripsLabel.few': 'رحلات',
'atlas.tripsLabel.many': 'رحلة',
'atlas.placesVisited': 'مكان تمت زيارته',
'atlas.placesVisited.zero': 'أماكن تمت زيارتها',
'atlas.placesVisited.one': 'مكان تمت زيارته',
'atlas.placesVisited.two': 'مكانان تمت زيارتهما',
'atlas.placesVisited.few': 'أماكن تمت زيارتها',
'atlas.placesVisited.many': 'مكانًا تمت زيارته',
'atlas.planned': 'مُخطط',
'atlas.showPlanned': 'إظهار الدول المخطط زيارتها',
'atlas.plannedFor': 'مخطط لـ',
'atlas.antarctica': 'أنتاركتيكا',
'atlas.regionPlacesLabel': 'مكان',
'atlas.regionPlacesLabel.zero': 'أماكن',
'atlas.regionPlacesLabel.one': 'مكان',
'atlas.regionPlacesLabel.two': 'مكانان',
'atlas.regionPlacesLabel.few': 'أماكن',
'atlas.regionPlacesLabel.many': 'مكانًا',
};
export default atlas;
+52 -7
View File
@@ -28,7 +28,12 @@ const budget: TranslationStrings = {
'budget.byCategory': 'حسب الفئة',
'budget.editTooltip': 'انقر للتعديل',
'budget.linkedToReservation': 'مرتبط بحجز — عدّل الاسم هناك',
'budget.confirm.deleteCategory': 'هل تريد حذف الفئة "{name}" مع {count} إدخالات؟',
'budget.confirm.deleteCategory': 'هل تريد حذف الفئة "{name}" مع {count} إدخال؟',
'budget.confirm.deleteCategory.zero': 'هل تريد حذف الفئة "{name}" الفارغة؟',
'budget.confirm.deleteCategory.one': 'هل تريد حذف الفئة "{name}" مع إدخال واحد؟',
'budget.confirm.deleteCategory.two': 'هل تريد حذف الفئة "{name}" مع إدخالين؟',
'budget.confirm.deleteCategory.few': 'هل تريد حذف الفئة "{name}" مع {count} إدخالات؟',
'budget.confirm.deleteCategory.many': 'هل تريد حذف الفئة "{name}" مع {count} إدخالًا؟',
'budget.deleteCategory': 'حذف الفئة',
'budget.perPerson': 'لكل شخص',
'budget.paid': 'مدفوع',
@@ -58,7 +63,12 @@ const budget: TranslationStrings = {
'costs.outstandingSub': 'مصاريف بلا دافع بعد',
'costs.outstandingItems': 'مصاريف بحاجة إلى دافع',
'costs.expenses': 'المصروفات',
'costs.entries': '{count} إدخالات',
'costs.entries': '{count} إدخال',
'costs.entries.zero': 'لا توجد إدخالات',
'costs.entries.one': 'إدخال واحد',
'costs.entries.two': 'إدخالان',
'costs.entries.few': '{count} إدخالات',
'costs.entries.many': '{count} إدخالًا',
'costs.searchPlaceholder': 'ابحث في المصروفات…',
'costs.filter.all': 'الكل',
'costs.filter.mine': 'دفعتها أنا',
@@ -101,7 +111,12 @@ const budget: TranslationStrings = {
'costs.noCategories': 'لا توجد مصروفات بعد.',
'costs.settleHistory': 'سجل التسويات',
'costs.noSettlements': 'لا توجد مدفوعات مسوّاة بعد.',
'costs.paymentsSettled': 'تمت تسوية {count} مدفوعات',
'costs.paymentsSettled': 'تمت تسوية {count} دفعة',
'costs.paymentsSettled.zero': 'لم تتم تسوية أي دفعة',
'costs.paymentsSettled.one': 'تمت تسوية دفعة واحدة',
'costs.paymentsSettled.two': 'تمت تسوية دفعتين',
'costs.paymentsSettled.few': 'تمت تسوية {count} دفعات',
'costs.paymentsSettled.many': 'تمت تسوية {count} دفعة',
'costs.paid': 'مدفوع',
'costs.undo': 'تراجع',
'costs.whatFor': 'لأجل ماذا كان؟',
@@ -123,7 +138,12 @@ const budget: TranslationStrings = {
'costs.payersUnbalanced': 'يجب أن يكون مجموع مبالغ الدافعين {amount}',
'costs.splitBetween': 'تقسيم بالتساوي بين',
'costs.pickSomeone': 'اختر شخصًا واحدًا على الأقل للتقسيم معه.',
'costs.splitSummary': 'تقسيم على {count} · {amount} لكل واحد',
'costs.splitSummary': 'تقسيم على {count} شخص · {amount} لكل منهم',
'costs.splitSummary.zero': 'تقسيم على {count} أشخاص · {amount} لكل منهم',
'costs.splitSummary.one': 'شخص واحد · {amount}',
'costs.splitSummary.two': 'تقسيم على شخصين · {amount} لكل منهما',
'costs.splitSummary.few': 'تقسيم على {count} أشخاص · {amount} لكل منهم',
'costs.splitSummary.many': 'تقسيم على {count} شخصًا · {amount} لكل منهم',
'costs.cat.accommodation': 'الإقامة',
'costs.cat.food': 'الطعام والشراب',
'costs.cat.groceries': 'البقالة',
@@ -138,8 +158,18 @@ const budget: TranslationStrings = {
'costs.cat.fuel': 'وقود',
'costs.cat.parking': 'موقف سيارات',
'costs.cat.other': 'أخرى',
'costs.daysCount': '{count} أيام',
'costs.travelers': '{count} مسافرين',
'costs.daysCount': '{count} يوم',
'costs.daysCount.zero': 'لا توجد أيام',
'costs.daysCount.one': 'يوم واحد',
'costs.daysCount.two': 'يومان',
'costs.daysCount.few': '{count} أيام',
'costs.daysCount.many': '{count} يومًا',
'costs.travelers': '{count} مسافر',
'costs.travelers.zero': 'لا يوجد مسافرون',
'costs.travelers.one': 'مسافر واحد',
'costs.travelers.two': 'مسافران',
'costs.travelers.few': '{count} مسافرين',
'costs.travelers.many': '{count} مسافرًا',
'costs.liveRate': 'سعر مباشر',
'costs.settleAll': 'تسوية الكل',
'costs.payment': 'دفعة',
@@ -165,6 +195,11 @@ const budget: TranslationStrings = {
'costs.filter.allCategories': 'كل الفئات',
'costs.filter.allDays': 'كل الأيام',
'costs.expensesCount': '{count} مصروف',
'costs.expensesCount.zero': 'لا توجد مصروفات',
'costs.expensesCount.one': 'مصروف واحد',
'costs.expensesCount.two': 'مصروفان',
'costs.expensesCount.few': '{count} مصروفات',
'costs.expensesCount.many': '{count} مصروفًا',
'costs.ticketItemName': 'اسم العنصر',
'costs.ticketSplitting': 'التقسيم:',
'costs.ticketAddItem': 'إضافة عنصر',
@@ -175,6 +210,11 @@ const budget: TranslationStrings = {
'costs.splitSumOver': 'مجموع الحصص: {sum} من {total} (زائد {diff})',
'costs.toggleSign': 'التبديل بين المصروف والاسترداد',
'costs.receipts': 'الإيصالات',
'costs.receipts.zero': 'إيصالات',
'costs.receipts.one': 'إيصال',
'costs.receipts.two': 'إيصالان',
'costs.receipts.few': 'إيصالات',
'costs.receipts.many': 'إيصالات',
'costs.receiptsTitle': 'الإيصالات والفواتير',
'costs.attachReceipt': 'إرفاق إيصال / فاتورة',
'costs.attach': 'إرفاق',
@@ -193,6 +233,11 @@ const budget: TranslationStrings = {
'costs.noReceipts': 'لا توجد إيصالات مرفقة',
'costs.deleteReceipt': 'حذف الإيصال',
'costs.viewReceipt': 'عرض الإيصال',
'costs.receiptLeftBehind': 'فشل الحفظ، وما زال هناك {count} إيصالات مرفوعة. احذفها من تبويب الملفات.',
'costs.receiptLeftBehind': 'فشل الحفظ، وما زال هناك {count} إيصال مرفوع. احذفها من تبويب الملفات.',
'costs.receiptLeftBehind.zero': 'فشل الحفظ، ولم يبقَ أي إيصال مرفوع.',
'costs.receiptLeftBehind.one': 'فشل الحفظ، وما زال هناك إيصال مرفوع واحد. احذفه من تبويب الملفات.',
'costs.receiptLeftBehind.two': 'فشل الحفظ، وما زال هناك إيصالان مرفوعان. احذفهما من تبويب الملفات.',
'costs.receiptLeftBehind.few': 'فشل الحفظ، وما زال هناك {count} إيصالات مرفوعة. احذفها من تبويب الملفات.',
'costs.receiptLeftBehind.many': 'فشل الحفظ، وما زال هناك {count} إيصالًا مرفوعًا. احذفها من تبويب الملفات.',
};
export default budget;
+6 -2
View File
@@ -87,8 +87,12 @@ const collab: TranslationStrings = {
'collab.polls.create': 'إنشاء استطلاع',
'collab.polls.close': 'إغلاق',
'collab.polls.closed': 'مغلق',
'collab.polls.votes': '{n} أصوات',
'collab.polls.votes.one': '{n} صوت',
'collab.polls.votes': '{n} صوت',
'collab.polls.votes.zero': 'لا توجد أصوات',
'collab.polls.votes.one': 'صوت واحد',
'collab.polls.votes.two': 'صوتان',
'collab.polls.votes.few': '{n} أصوات',
'collab.polls.votes.many': '{n} صوتًا',
'collab.polls.multipleChoice': 'اختيار متعدد',
'collab.polls.multiChoice': 'اختيار متعدد',
'collab.polls.deadline': 'الموعد النهائي',
+125 -18
View File
@@ -18,9 +18,24 @@ const collection: TranslationStrings = {
'collections.moveToListTitle': 'نقل {count} إلى قائمة أخرى',
'collections.duplicateToListTitle': 'تكرار {count} إلى قائمة أخرى',
'collections.noOtherLists': 'لا توجد قوائم أخرى بعد',
'collections.movedCount': 'تم نقل {count} أماكن',
'collections.duplicatedCount': 'تم تكرار {count} أماكن',
'collections.placeCount': '{count} أماكن',
'collections.movedCount': 'تم نقل {count} مكان',
'collections.movedCount.zero': 'لم يتم نقل أي مكان',
'collections.movedCount.one': 'تم نقل مكان واحد',
'collections.movedCount.two': 'تم نقل مكانين',
'collections.movedCount.few': 'تم نقل {count} أماكن',
'collections.movedCount.many': 'تم نقل {count} مكانًا',
'collections.duplicatedCount': 'تم تكرار {count} مكان',
'collections.duplicatedCount.zero': 'لم يتم تكرار أي مكان',
'collections.duplicatedCount.one': 'تم تكرار مكان واحد',
'collections.duplicatedCount.two': 'تم تكرار مكانين',
'collections.duplicatedCount.few': 'تم تكرار {count} أماكن',
'collections.duplicatedCount.many': 'تم تكرار {count} مكانًا',
'collections.placeCount': '{count} مكان',
'collections.placeCount.zero': 'لا توجد أماكن',
'collections.placeCount.one': 'مكان واحد',
'collections.placeCount.two': 'مكانان',
'collections.placeCount.few': '{count} أماكن',
'collections.placeCount.many': '{count} مكانًا',
'collections.category': 'الفئة',
'collections.noCategory': 'بدون فئة',
'collections.editListTitle': 'تعديل القائمة',
@@ -41,7 +56,12 @@ const collection: TranslationStrings = {
'collections.importDoneTitle': 'اكتمل الاستيراد',
'collections.importPickTripHint': 'اختر رحلة وانقل أماكنها إلى {name}.',
'collections.importNoTrips': 'لا توجد رحلات بعد',
'collections.importPlacesCount': '{count} أماكن',
'collections.importPlacesCount': '{count} مكان',
'collections.importPlacesCount.zero': 'لا توجد أماكن',
'collections.importPlacesCount.one': 'مكان واحد',
'collections.importPlacesCount.two': 'مكانان',
'collections.importPlacesCount.few': '{count} أماكن',
'collections.importPlacesCount.many': '{count} مكانًا',
'collections.importSearchPlaces': 'البحث عن أماكن…',
'collections.importOnlyNew': 'الجديد فقط',
'collections.importSelectAll': 'تحديد الكل',
@@ -50,11 +70,26 @@ const collection: TranslationStrings = {
'collections.importUnscheduled': 'بدون يوم',
'collections.importOnDay': 'اليوم {count}',
'collections.importSelectedCount': 'تم تحديد {count}',
'collections.importSelectedCount.zero': 'لم يتم تحديد شيء',
'collections.importSelectedCount.one': 'تم تحديد {count}',
'collections.importSelectedCount.two': 'تم تحديد {count}',
'collections.importSelectedCount.few': 'تم تحديد {count}',
'collections.importSelectedCount.many': 'تم تحديد {count}',
'collections.importAction': 'استيراد {count}',
'collections.importEmptyTrip': 'لا تحتوي هذه الرحلة على أماكن بعد',
'collections.importNothingNew': 'كل شيء من هذه الرحلة موجود بالفعل في القائمة',
'collections.importDone': 'تمت إضافة {count} أماكن',
'collections.importDoneSkipped': '{count} كانت موجودة بالفعل وبقيت كما هي',
'collections.importDone': 'تمت إضافة {count} مكان',
'collections.importDone.zero': 'لم تتم إضافة أي مكان',
'collections.importDone.one': 'تمت إضافة مكان واحد',
'collections.importDone.two': 'تمت إضافة مكانين',
'collections.importDone.few': 'تمت إضافة {count} أماكن',
'collections.importDone.many': 'تمت إضافة {count} مكانًا',
'collections.importDoneSkipped': '{count} مكان كانت في القائمة بالفعل وبقيت كما هي',
'collections.importDoneSkipped.zero': 'لم يكن أي مكان في القائمة من قبل',
'collections.importDoneSkipped.one': 'مكان واحد كان في القائمة بالفعل وبقي كما هو',
'collections.importDoneSkipped.two': 'مكانان كانا في القائمة بالفعل وبقيا كما هما',
'collections.importDoneSkipped.few': '{count} أماكن كانت في القائمة بالفعل وبقيت كما هي',
'collections.importDoneSkipped.many': '{count} مكانًا كانت في القائمة بالفعل وبقيت كما هي',
'collections.importDoneClean': 'جميعها الآن في {name}',
'collections.sort.default': 'افتراضي',
'collections.sort.nameAsc': 'الاسم (أ–ي)',
@@ -103,6 +138,11 @@ const collection: TranslationStrings = {
'collections.markVisitedNone': 'لا يوجد أي من هذه الأماكن في أي قائمة',
'collections.markedVisited': 'تم وضع علامة كمَزار',
'collections.markedVisitedTrip': 'تم وضع علامة على {count} مكان كمَزار',
'collections.markedVisitedTrip.zero': 'لم يتم وضع علامة على أي مكان كمَزار',
'collections.markedVisitedTrip.one': 'تم وضع علامة على مكان واحد كمَزار',
'collections.markedVisitedTrip.two': 'تم وضع علامة على مكانين كمَزار',
'collections.markedVisitedTrip.few': 'تم وضع علامة على {count} أماكن كمَزار',
'collections.markedVisitedTrip.many': 'تم وضع علامة على {count} مكانًا كمَزار',
'collections.copyToTrip': 'نسخ إلى رحلة',
'collections.copyToTripTitle': 'نسخ إلى رحلة',
@@ -113,8 +153,18 @@ const collection: TranslationStrings = {
'collections.noTrips': 'لا توجد رحلات بعد',
'collections.alreadyInTrip': 'موجود بالفعل في هذه الرحلة',
'collections.copied': 'تم النسخ إلى الرحلة',
'collections.copiedCount': 'تم نسخ {count} أماكن',
'collections.skippedDuplicates': 'تم تخطي {count} عناصر مكررة',
'collections.copiedCount': 'تم نسخ {count} مكان',
'collections.copiedCount.zero': 'لم يتم نسخ أي مكان',
'collections.copiedCount.one': 'تم نسخ مكان واحد',
'collections.copiedCount.two': 'تم نسخ مكانين',
'collections.copiedCount.few': 'تم نسخ {count} أماكن',
'collections.copiedCount.many': 'تم نسخ {count} مكانًا',
'collections.skippedDuplicates': 'تم تخطي {count} عنصر مكرر',
'collections.skippedDuplicates.zero': 'لم يتم تخطي أي عنصر مكرر',
'collections.skippedDuplicates.one': 'تم تخطي عنصر مكرر واحد',
'collections.skippedDuplicates.two': 'تم تخطي عنصرين مكررين',
'collections.skippedDuplicates.few': 'تم تخطي {count} عناصر مكررة',
'collections.skippedDuplicates.many': 'تم تخطي {count} عنصرًا مكررًا',
'collections.copyNothing': 'لا شيء لنسخه',
'collections.removeFromList': 'إزالة من القائمة',
'collections.removeFromListConfirm': 'إزالة هذا المكان من القائمة؟',
@@ -128,6 +178,11 @@ const collection: TranslationStrings = {
'collections.search': 'البحث عن أماكن',
'collections.selectMode': 'تحديد',
'collections.selectedCount': 'تم تحديد {count}',
'collections.selectedCount.zero': 'لم يتم تحديد شيء',
'collections.selectedCount.one': 'تم تحديد {count}',
'collections.selectedCount.two': 'تم تحديد {count}',
'collections.selectedCount.few': 'تم تحديد {count}',
'collections.selectedCount.many': 'تم تحديد {count}',
'collections.pickList': 'حفظ في قائمة',
'collections.pickListPlaceholder': 'اختر قائمة',
@@ -158,26 +213,63 @@ const collection: TranslationStrings = {
'collections.file.searchLists': 'البحث في القوائم',
'collections.file.intoHint': 'الأماكن الموجودة في القائمة تبقى كما هي، وكذلك اسمها ولونها. وتُضاف التسميات القادمة من الملف.',
'collections.file.confirmInto': 'إضافة إلى القائمة',
'collections.file.doneInto': 'تمت إضافة {count} مكانًا إلى {name}',
'collections.file.doneInto': 'تمت إضافة {count} مكان إلى {name}',
'collections.file.doneInto.zero': 'لم تتم إضافة أي مكان إلى {name}',
'collections.file.doneInto.one': 'تمت إضافة مكان واحد إلى {name}',
'collections.file.doneInto.two': 'تمت إضافة مكانين إلى {name}',
'collections.file.doneInto.few': 'تمت إضافة {count} أماكن إلى {name}',
'collections.file.doneInto.many': 'تمت إضافة {count} مكانًا إلى {name}',
'collections.file.doneIntoDuplicates': 'تمت إضافة {count} إلى {name}، و{duplicates} كانت موجودة بالفعل',
'collections.file.doneIntoNothing': 'كل الأماكن في الملف موجودة بالفعل في {name}',
'collections.file.change': 'تغيير',
'collections.file.labelCount': '{count} تسمية',
'collections.file.labelCount.zero': 'لا توجد تسميات',
'collections.file.labelCount.one': 'تسمية واحدة',
'collections.file.labelCount.two': 'تسميتان',
'collections.file.labelCount.few': '{count} تسميات',
'collections.file.labelCount.many': '{count} تسمية',
'collections.file.hint': 'تصل الأماكن كقائمة جديدة خاصة بك. أما التقييمات والأعضاء والصور المرفوعة فلا تأتي معها.',
'collections.file.done': 'تم استيراد {count} مكانًا',
'collections.file.doneSkipped': 'تم استيراد {count} مكانًا وتخطّي {skipped}',
'collections.file.done': 'تم استيراد {count} مكان',
'collections.file.done.zero': 'لم يتم استيراد أي مكان',
'collections.file.done.one': 'تم استيراد مكان واحد',
'collections.file.done.two': 'تم استيراد مكانين',
'collections.file.done.few': 'تم استيراد {count} أماكن',
'collections.file.done.many': 'تم استيراد {count} مكانًا',
'collections.file.doneSkipped': 'تم استيراد {count} مكان وتخطّي {skipped}',
'collections.file.doneSkipped.zero': 'لم يتم استيراد أي مكان، وتم تخطّي {skipped}',
'collections.file.doneSkipped.one': 'تم استيراد مكان واحد وتخطّي {skipped}',
'collections.file.doneSkipped.two': 'تم استيراد مكانين وتخطّي {skipped}',
'collections.file.doneSkipped.few': 'تم استيراد {count} أماكن وتخطّي {skipped}',
'collections.file.doneSkipped.many': 'تم استيراد {count} مكانًا وتخطّي {skipped}',
'collections.file.errorTooLarge': 'هذا الملف أكبر من أن يكون قائمة.',
'collections.file.errorUnreadable': 'تعذّرت قراءة هذا الملف.',
'collections.file.errorNotACollection': 'هذا ليس ملف قائمة من TREK.',
'collections.file.formatTrek': 'قائمة TREK',
'collections.file.formatTrekHint': 'لنسخة TREK أخرى، مع التسميات والحالة',
'collections.file.formatGpxHint': 'نقاط طريق لتطبيقات OsmAnd وOrganic Maps وGarmin وغيرها من تطبيقات الخرائط',
'collections.file.gpxOmitted': 'لم يُضمَّن {count} من الأماكن في ملف GPX لأنها بلا إحداثيات',
'collections.file.gpxOmitted': 'لم يُضمَّن {count} مكان في ملف GPX لأنها بلا إحداثيات',
'collections.file.gpxOmitted.zero': 'لم يُستبعد أي مكان من ملف GPX',
'collections.file.gpxOmitted.one': 'لم يُضمَّن مكان واحد في ملف GPX لأنه بلا إحداثيات',
'collections.file.gpxOmitted.two': 'لم يُضمَّن مكانان في ملف GPX لأنهما بلا إحداثيات',
'collections.file.gpxOmitted.few': 'لم يُضمَّن {count} أماكن في ملف GPX لأنها بلا إحداثيات',
'collections.file.gpxOmitted.many': 'لم يُضمَّن {count} مكانًا في ملف GPX لأنها بلا إحداثيات',
'collections.file.gpxNothing': 'لا يملك أي من هذه الأماكن إحداثيات، فلا يوجد ما يُوضع في ملف GPX.',
'collections.file.reading': 'جارٍ قراءة الملف…',
'collections.file.gpxSkipped': 'سيُستبعد {count} من نقاط الطريق لعدم وجود إحداثيات صالحة لها.',
'collections.file.gpxTrack':
'يحتوي هذا الملف أيضًا على {count} من نقاط المسار. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxSkipped': 'ستُستبعد {count} نقطة طريق لعدم وجود إحداثيات صالحة لها.',
'collections.file.gpxSkipped.zero': 'لن تُستبعد أي نقطة طريق.',
'collections.file.gpxSkipped.one': 'ستُستبعد نقطة طريق واحدة لعدم وجود إحداثيات صالحة لها.',
'collections.file.gpxSkipped.two': 'ستُستبعد نقطتا طريق لعدم وجود إحداثيات صالحة لهما.',
'collections.file.gpxSkipped.few': 'ستُستبعد {count} نقاط طريق لعدم وجود إحداثيات صالحة لها.',
'collections.file.gpxSkipped.many': 'ستُستبعد {count} نقطة طريق لعدم وجود إحداثيات صالحة لها.',
'collections.file.gpxTrack': 'يحتوي هذا الملف أيضًا على {count} نقطة مسار. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxTrack.zero': 'لا يحتوي هذا الملف على نقاط مسار. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxTrack.one':
'يحتوي هذا الملف أيضًا على نقطة مسار واحدة. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxTrack.two': 'يحتوي هذا الملف أيضًا على نقطتَي مسار. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxTrack.few':
'يحتوي هذا الملف أيضًا على {count} نقاط مسار. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxTrack.many':
'يحتوي هذا الملف أيضًا على {count} نقطة مسار. لا تُستورد المسارات، بل نقاط الطريق فقط.',
'collections.file.gpxEmpty': 'لا يحتوي ملف GPX هذا على نقاط طريق، فلا يوجد ما يُستورد.',
'collections.file.errorNotGpx': 'هذا ليس ملف GPX.',
'collections.file.errorTooManyPlaces':
@@ -216,15 +308,30 @@ const collection: TranslationStrings = {
'collections.widget.title': 'المجموعات',
'collections.widget.empty': 'لا توجد أماكن محفوظة بعد',
'collections.widget.savedCount': '{count} محفوظة',
'collections.widget.savedCount': '{count} مكان محفوظ',
'collections.widget.savedCount.zero': 'لا توجد أماكن محفوظة',
'collections.widget.savedCount.one': 'مكان محفوظ واحد',
'collections.widget.savedCount.two': 'مكانان محفوظان',
'collections.widget.savedCount.few': '{count} أماكن محفوظة',
'collections.widget.savedCount.many': '{count} مكانًا محفوظًا',
'collections.labels.title': 'التسميات',
'collections.labels.manage': 'إدارة التسميات',
'collections.labels.add': 'إضافة تسمية',
'collections.labels.name': 'اسم التسمية',
'collections.labels.namePlaceholder': 'مثال: برلين',
'collections.labels.assign': 'تعيين تسمية',
'collections.labels.assignN': 'إضافة تسميات إلى {count} أماكن',
'collections.labels.assignedCount': 'تمت تسمية {count} أماكن',
'collections.labels.assignN': 'إضافة تسميات إلى {count} مكان',
'collections.labels.assignN.zero': 'إضافة تسميات',
'collections.labels.assignN.one': 'إضافة تسميات إلى مكان واحد',
'collections.labels.assignN.two': 'إضافة تسميات إلى مكانين',
'collections.labels.assignN.few': 'إضافة تسميات إلى {count} أماكن',
'collections.labels.assignN.many': 'إضافة تسميات إلى {count} مكانًا',
'collections.labels.assignedCount': 'تمت إضافة التسميات إلى {count} مكان',
'collections.labels.assignedCount.zero': 'لم تتم إضافة التسميات إلى أي مكان',
'collections.labels.assignedCount.one': 'تمت إضافة التسميات إلى مكان واحد',
'collections.labels.assignedCount.two': 'تمت إضافة التسميات إلى مكانين',
'collections.labels.assignedCount.few': 'تمت إضافة التسميات إلى {count} أماكن',
'collections.labels.assignedCount.many': 'تمت إضافة التسميات إلى {count} مكانًا',
'collections.labels.empty': 'لا توجد تسميات بعد',
'collections.labels.emptyHint': 'أنشئ تسمية أولًا لتجميع الأماكن في هذه القائمة.',
};
+85 -15
View File
@@ -4,10 +4,20 @@ const dashboard: TranslationStrings = {
'dashboard.title': 'رحلاتي',
'dashboard.subtitle.loading': 'جارٍ تحميل الرحلات...',
'dashboard.subtitle.trips': '{count} رحلة ({archived} مؤرشفة)',
'dashboard.subtitle.trips.zero': 'لا توجد رحلات ({archived} مؤرشفة)',
'dashboard.subtitle.trips.one': 'رحلة واحدة ({archived} مؤرشفة)',
'dashboard.subtitle.trips.two': 'رحلتان ({archived} مؤرشفة)',
'dashboard.subtitle.trips.few': '{count} رحلات ({archived} مؤرشفة)',
'dashboard.subtitle.trips.many': '{count} رحلة ({archived} مؤرشفة)',
'dashboard.subtitle.empty': 'ابدأ رحلتك الأولى',
'dashboard.subtitle.activeOne': '{count} رحلة نشطة',
'dashboard.subtitle.activeMany': '{count} رحلات نشطة',
'dashboard.subtitle.archivedSuffix': ' · {count} مؤرشفة',
'dashboard.subtitle.archivedSuffix': ' · {count} رحلة مؤرشفة',
'dashboard.subtitle.archivedSuffix.zero': ' · لا توجد رحلات مؤرشفة',
'dashboard.subtitle.archivedSuffix.one': ' · رحلة مؤرشفة واحدة',
'dashboard.subtitle.archivedSuffix.two': ' · رحلتان مؤرشفتان',
'dashboard.subtitle.archivedSuffix.few': ' · {count} رحلات مؤرشفة',
'dashboard.subtitle.archivedSuffix.many': ' · {count} رحلة مؤرشفة',
'dashboard.newTrip': 'رحلة جديدة',
'dashboard.newTripSub': 'خطّط لرحلة جديدة من الصفر',
'dashboard.subscribeAllTrips': 'الاشتراك في جميع الرحلات',
@@ -32,10 +42,25 @@ const dashboard: TranslationStrings = {
'dashboard.shared': 'مشتركة',
'dashboard.sharedBy': 'شاركها {name}',
'dashboard.days': 'الأيام',
'dashboard.days.zero': 'أيام',
'dashboard.days.one': 'يوم',
'dashboard.days.two': 'يومان',
'dashboard.days.few': 'أيام',
'dashboard.days.many': 'يومًا',
'dashboard.places': 'الأماكن',
'dashboard.members': 'ال חברים',
'dashboard.card.buddies': 'ال חברים',
'dashboard.places.zero': 'أماكن',
'dashboard.places.one': 'مكان',
'dashboard.places.two': 'مكانان',
'dashboard.places.few': 'أماكن',
'dashboard.places.many': 'مكانًا',
'dashboard.pass.places': 'الأماكن',
'dashboard.members': 'الرفاق',
'dashboard.card.buddies': 'رفيق',
'dashboard.card.buddies.zero': 'رفاق',
'dashboard.card.buddies.one': 'رفيق',
'dashboard.card.buddies.two': 'رفيقان',
'dashboard.card.buddies.few': 'رفاق',
'dashboard.card.buddies.many': 'رفيقًا',
'dashboard.archive': 'أرشفة',
'dashboard.copyTrip': 'نسخ',
'dashboard.copySuffix': 'نسخة',
@@ -49,7 +74,12 @@ const dashboard: TranslationStrings = {
'dashboard.status.today': 'اليوم',
'dashboard.status.tomorrow': 'غدًا',
'dashboard.status.past': 'منتهية',
'dashboard.status.daysLeft': 'متبقي {count} يوم',
'dashboard.status.daysLeft': '{count} يوم متبقٍ',
'dashboard.status.daysLeft.zero': 'لا توجد أيام متبقية',
'dashboard.status.daysLeft.one': 'يوم واحد متبقٍ',
'dashboard.status.daysLeft.two': 'يومان متبقيان',
'dashboard.status.daysLeft.few': '{count} أيام متبقية',
'dashboard.status.daysLeft.many': '{count} يومًا متبقيًا',
'dashboard.toast.loadError': 'فشل تحميل الرحلات',
'dashboard.loadErrorBanner': 'تعذّر الوصول إلى الخادم. رحلاتك في أمان — يرجى المحاولة مرة أخرى.',
'dashboard.retry': 'إعادة المحاولة',
@@ -127,14 +157,30 @@ const dashboard: TranslationStrings = {
'dashboard.hero.badgeRecent': 'مؤخرًا',
'dashboard.hero.tripDates': 'تواريخ الرحلة',
'dashboard.hero.noDates': 'لا توجد تواريخ',
'dashboard.hero.travelers': '{count} مسافرين',
'dashboard.hero.travelers.one': '{count} مسافر',
'dashboard.hero.destinations': '{count} وجهات',
'dashboard.hero.destinations.one': '{count} وجهة',
'dashboard.hero.dayUnit': 'أيام',
'dashboard.hero.travelers': '{count} مسافر',
'dashboard.hero.travelers.zero': 'لا يوجد مسافرون',
'dashboard.hero.travelers.one': 'مسافر واحد',
'dashboard.hero.travelers.two': 'مسافران',
'dashboard.hero.travelers.few': '{count} مسافرين',
'dashboard.hero.travelers.many': '{count} مسافرًا',
'dashboard.hero.destinations': '{count} وجهة',
'dashboard.hero.destinations.zero': 'لا توجد وجهات',
'dashboard.hero.destinations.one': 'وجهة واحدة',
'dashboard.hero.destinations.two': 'وجهتان',
'dashboard.hero.destinations.few': '{count} وجهات',
'dashboard.hero.destinations.many': '{count} وجهة',
'dashboard.hero.dayUnit': 'يوم',
'dashboard.hero.dayUnit.zero': 'أيام',
'dashboard.hero.dayUnit.one': 'يوم',
'dashboard.hero.daysLeft': 'الأيام المتبقية',
'dashboard.hero.daysLeft.one': 'بقي يوم',
'dashboard.hero.dayUnit.two': 'يومين',
'dashboard.hero.dayUnit.few': 'أيام',
'dashboard.hero.dayUnit.many': 'يومًا',
'dashboard.hero.daysLeft': 'يوم متبقٍ',
'dashboard.hero.daysLeft.zero': 'أيام متبقية',
'dashboard.hero.daysLeft.one': 'يوم متبقٍ',
'dashboard.hero.daysLeft.two': 'يومان متبقيان',
'dashboard.hero.daysLeft.few': 'أيام متبقية',
'dashboard.hero.daysLeft.many': 'يومًا متبقيًا',
'dashboard.hero.lastDay': 'اليوم الأخير',
'dashboard.hero.untilStart': 'حتى البداية',
'dashboard.hero.startsIn': 'تبدأ الرحلة بعد',
@@ -142,6 +188,11 @@ const dashboard: TranslationStrings = {
'dashboard.atlas.ofTotal': 'من {total}',
'dashboard.atlas.tripsTotal': 'إجمالي الرحلات',
'dashboard.atlas.placesMapped': '{count} مكان على الخريطة',
'dashboard.atlas.placesMapped.zero': 'لا توجد أماكن على الخريطة',
'dashboard.atlas.placesMapped.one': 'مكان واحد على الخريطة',
'dashboard.atlas.placesMapped.two': 'مكانان على الخريطة',
'dashboard.atlas.placesMapped.few': '{count} أماكن على الخريطة',
'dashboard.atlas.placesMapped.many': '{count} مكانًا على الخريطة',
'dashboard.atlas.daysTraveled': 'أيام السفر',
'dashboard.atlas.daysUnit': 'أيام',
'dashboard.atlas.acrossAllTrips': 'عبر جميع الرحلات',
@@ -176,6 +227,11 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.liveNow': 'مباشر الآن',
'dashboard.mobile.tripProgress': 'تقدّم الرحلة',
'dashboard.mobile.daysLeft': 'بقي {count} يوم',
'dashboard.mobile.daysLeft.zero': 'لم يبقَ أي يوم',
'dashboard.mobile.daysLeft.one': 'بقي يوم واحد',
'dashboard.mobile.daysLeft.two': 'بقي يومان',
'dashboard.mobile.daysLeft.few': 'بقي {count} أيام',
'dashboard.mobile.daysLeft.many': 'بقي {count} يومًا',
'dashboard.mobile.places': 'الأماكن',
'dashboard.mobile.buddies': 'الرفاق',
'dashboard.mobile.newTrip': 'رحلة جديدة',
@@ -192,11 +248,25 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.ongoing': 'جارية',
'dashboard.mobile.startsToday': 'تبدأ اليوم',
'dashboard.mobile.tomorrow': 'غدًا',
'dashboard.mobile.inDays': 'خلال {count} يوم',
'dashboard.mobile.inMonths': 'خلال {count} شهر',
'dashboard.mobile.inDays': 'بعد {count} يوم',
'dashboard.mobile.inDays.zero': 'اليوم',
'dashboard.mobile.inDays.one': 'بعد يوم واحد',
'dashboard.mobile.inDays.two': 'بعد يومين',
'dashboard.mobile.inDays.few': 'بعد {count} أيام',
'dashboard.mobile.inDays.many': 'بعد {count} يومًا',
'dashboard.mobile.inMonths': 'بعد {count} شهر',
'dashboard.mobile.inMonths.zero': 'بعد أقل من شهر',
'dashboard.mobile.inMonths.one': 'بعد شهر واحد',
'dashboard.mobile.inMonths.two': 'بعد شهرين',
'dashboard.mobile.inMonths.few': 'بعد {count} أشهر',
'dashboard.mobile.inMonths.many': 'بعد {count} شهرًا',
'dashboard.mobile.spotlightDayOf': 'اليوم {day} من {total}',
'dashboard.mobile.spotlightDays': '{count} أيام',
'dashboard.mobile.spotlightDays.one': '{count} يوم',
'dashboard.mobile.spotlightDays': '{count} يوم',
'dashboard.mobile.spotlightDays.zero': 'لا توجد أيام',
'dashboard.mobile.spotlightDays.one': 'يوم واحد',
'dashboard.mobile.spotlightDays.two': 'يومان',
'dashboard.mobile.spotlightDays.few': '{count} أيام',
'dashboard.mobile.spotlightDays.many': '{count} يومًا',
'dashboard.mobile.completed': 'مكتملة',
'dashboard.mobile.currencyConverter': 'محوّل العملات',
'dashboard.aria.toggleView': 'تبديل العرض',
+53 -5
View File
@@ -15,6 +15,11 @@ const dawarich: TranslationStrings = {
'dawarich.syncEnabledHint': 'عند الإيقاف، لا يقرأ TREK من Dawarich إلا حين تطلب ذلك.',
'dawarich.test.button': 'اختبار الاتصال',
'dawarich.test.success': 'تم الاتصال. تم العثور على {count} إقامة خلال آخر 30 يوماً.',
'dawarich.test.success.zero': 'تم الاتصال. لم يتم العثور على أي إقامة خلال آخر 30 يوماً.',
'dawarich.test.success.one': 'تم الاتصال. تم العثور على إقامة واحدة خلال آخر 30 يوماً.',
'dawarich.test.success.two': 'تم الاتصال. تم العثور على إقامتين خلال آخر 30 يوماً.',
'dawarich.test.success.few': 'تم الاتصال. تم العثور على {count} إقامات خلال آخر 30 يوماً.',
'dawarich.test.success.many': 'تم الاتصال. تم العثور على {count} إقامة خلال آخر 30 يوماً.',
'dawarich.test.failed': 'تعذّر الوصول إلى Dawarich.',
'dawarich.syncNow': 'تحقق الآن',
'dawarich.connected': 'متصل',
@@ -29,6 +34,11 @@ const dawarich: TranslationStrings = {
'dawarich.toast.saveError': 'تعذّر حفظ الاتصال',
'dawarich.toast.disconnected': 'تم قطع الاتصال بـ Dawarich',
'dawarich.toast.synced': 'تم العثور على {count} إقامة جديدة',
'dawarich.toast.synced.zero': 'لم يتم العثور على إقامات جديدة',
'dawarich.toast.synced.one': 'تم العثور على إقامة جديدة واحدة',
'dawarich.toast.synced.two': 'تم العثور على إقامتين جديدتين',
'dawarich.toast.synced.few': 'تم العثور على {count} إقامات جديدة',
'dawarich.toast.synced.many': 'تم العثور على {count} إقامة جديدة',
'dawarich.toast.syncError': 'تعذّرت القراءة من Dawarich',
'dawarich.toast.syncRunning': 'هناك فحص قيد التشغيل بالفعل',
'dawarich.toast.acceptError': 'تعذّرت إضافة هذا',
@@ -79,7 +89,12 @@ const dawarich: TranslationStrings = {
'dawarich.badge.sourceMissing': 'اختفى من Dawarich',
'dawarich.suggestions.title': 'من Dawarich',
'dawarich.suggestions.pending': '{count} في انتظارك',
'dawarich.suggestions.pending': '{count} إقامة في انتظارك',
'dawarich.suggestions.pending.zero': 'لا شيء في انتظارك',
'dawarich.suggestions.pending.one': 'إقامة واحدة في انتظارك',
'dawarich.suggestions.pending.two': 'إقامتان في انتظارك',
'dawarich.suggestions.pending.few': '{count} إقامات في انتظارك',
'dawarich.suggestions.pending.many': '{count} إقامة في انتظارك',
'dawarich.suggestions.loading': 'جارٍ القراءة من Dawarich…',
'dawarich.suggestions.notConnected': 'اربط Dawarich من الإعدادات لترى إقاماتك هنا.',
'dawarich.suggestions.unavailable': 'تعذّرت القراءة من Dawarich.',
@@ -142,7 +157,17 @@ const dawarich: TranslationStrings = {
'dawarich.bucket.alreadyVisited': 'مشطوبة مسبقاً',
'dawarich.bucket.confirm': 'اشطب {count}',
'dawarich.bucket.confirmed': 'تم شطب {count} أمنية',
'dawarich.bucket.skipped': '{count} مُدخلاً بلا إحداثيات وتعذّر فحصها.',
'dawarich.bucket.confirmed.zero': 'لم يتم شطب أي أمنية',
'dawarich.bucket.confirmed.one': 'تم شطب أمنية واحدة',
'dawarich.bucket.confirmed.two': 'تم شطب أمنيتين',
'dawarich.bucket.confirmed.few': 'تم شطب {count} أمنيات',
'dawarich.bucket.confirmed.many': 'تم شطب {count} أمنية',
'dawarich.bucket.skipped': 'تعذّر فحص {count} مُدخل لأنها بلا إحداثيات.',
'dawarich.bucket.skipped.zero': 'لا توجد مُدخلات بلا إحداثيات.',
'dawarich.bucket.skipped.one': 'تعذّر فحص مُدخل واحد لأنه بلا إحداثيات.',
'dawarich.bucket.skipped.two': 'تعذّر فحص مُدخلين لأنهما بلا إحداثيات.',
'dawarich.bucket.skipped.few': 'تعذّر فحص {count} مُدخلات لأنها بلا إحداثيات.',
'dawarich.bucket.skipped.many': 'تعذّر فحص {count} مُدخلاً لأنها بلا إحداثيات.',
'dawarich.bucket.truncated': 'تم فحص المُدخلات الأولى فقط. شغّل الفحص مجدداً للبقية.',
'dawarich.bucket.visitedFrom': 'شُطبت اعتماداً على تسجيلات Dawarich',
'dawarich.bucket.clearVisit': 'تراجع',
@@ -155,9 +180,23 @@ const dawarich: TranslationStrings = {
'dawarich.atlas.loading': 'جارٍ قراءة تسجيلاتك…',
'dawarich.atlas.empty': 'لا تُظهر تسجيلاتك أي دول ليست لدى TREK أصلاً.',
'dawarich.atlas.cities': '{count} مدينة',
'dawarich.atlas.citiesOne': 'مدينة واحدة',
'dawarich.atlas.cities.zero': 'لا توجد مدن',
'dawarich.atlas.cities.one': 'مدينة واحدة',
'dawarich.atlas.cities.two': 'مدينتان',
'dawarich.atlas.cities.few': '{count} مدن',
'dawarich.atlas.cities.many': '{count} مدينة',
'dawarich.atlas.accept': 'إضافة {count} دولة',
'dawarich.atlas.accept.zero': 'إضافة الدول',
'dawarich.atlas.accept.one': 'إضافة دولة واحدة',
'dawarich.atlas.accept.two': 'إضافة دولتين',
'dawarich.atlas.accept.few': 'إضافة {count} دول',
'dawarich.atlas.accept.many': 'إضافة {count} دولة',
'dawarich.atlas.accepted': 'تمت إضافة {count} دولة',
'dawarich.atlas.accepted.zero': 'لم تتم إضافة أي دولة',
'dawarich.atlas.accepted.one': 'تمت إضافة دولة واحدة',
'dawarich.atlas.accepted.two': 'تمت إضافة دولتين',
'dawarich.atlas.accepted.few': 'تمت إضافة {count} دول',
'dawarich.atlas.accepted.many': 'تمت إضافة {count} دولة',
'dawarich.atlas.unresolved': 'تعذّر على TREK مطابقة هذه بدولة: {names}.',
'dawarich.atlas.source': 'من Dawarich',
'dawarich.atlas.range': 'تم الاطلاع على الفترة من {from} إلى {to}',
@@ -168,13 +207,22 @@ const dawarich: TranslationStrings = {
'dawarich.atlas.tab.countries': 'البلدان',
'dawarich.atlas.window': 'تم فحص آخر 12 شهرًا.',
'dawarich.selected': 'تم تحديد {count}',
'dawarich.selected.zero': 'لم يتم تحديد شيء',
'dawarich.selected.one': 'تم تحديد {count}',
'dawarich.selected.two': 'تم تحديد {count}',
'dawarich.selected.few': 'تم تحديد {count}',
'dawarich.selected.many': 'تم تحديد {count}',
'dawarich.again': 'تحقق مرة أخرى',
'dawarich.bucket.metersAway': 'على بُعد {meters} م',
'dawarich.bucket.kilometersAway': 'على بُعد {km} كم',
'dawarich.bucket.rule': 'تُحتسب الأمنية محققة ضمن {meters} م وبعد {minutes} دقيقة في المكان.',
'dawarich.journey.dayStays.other': '{count} إقامة من Dawarich',
'dawarich.journey.dayStays.zero': 'لا توجد إقامات من Dawarich',
'dawarich.journey.dayStays.one': 'إقامة واحدة من Dawarich',
'dawarich.journey.dayStays.other': 'إقامات من Dawarich: {count}',
'dawarich.journey.dayStays.two': 'إقامتان من Dawarich',
'dawarich.journey.dayStays.few': '{count} إقامات من Dawarich',
'dawarich.journey.dayStays.many': '{count} إقامة من Dawarich',
};
export default dawarich;
+1 -1
View File
@@ -68,7 +68,7 @@ const docsync: TranslationStrings = {
'docsync.state.local_deleted': 'محذوف في TREK',
'docsync.state.scope_drift': 'نُقل خارج المجلد',
'docsync.conflict.resolve': "حلّ {count}",
'docsync.conflict.resolve': 'حلّ {count}',
'docsync.conflict.title': 'تغيّرت النسختان',
'docsync.conflict.keepTrek': 'الإبقاء على نسخة TREK',
+27 -3
View File
@@ -1,4 +1,5 @@
import type { NotificationLocale } from '../externalNotifications/types';
import { pluralForm } from '../plural';
const ar: NotificationLocale = {
email: {
@@ -37,8 +38,22 @@ const ar: NotificationLocale = {
body: `${p.actor} يدعوك لمشاركة مجموعة. افتح TREK للقبول أو الرفض.`,
}),
photos_shared: (p) => ({
title: `${p.count} صور مشتركة`,
body: `${p.actor} شارك ${p.count} صورة في "${p.trip}".`,
title: pluralForm(p.count, 'ar', {
zero: 'لم تتم مشاركة أي صورة',
one: 'تمت مشاركة صورة واحدة',
two: 'تمت مشاركة صورتين',
few: `تمت مشاركة ${p.count} صور`,
many: `تمت مشاركة ${p.count} صورة`,
other: `تمت مشاركة ${p.count} صورة`,
}),
body: pluralForm(p.count, 'ar', {
zero: `${p.actor} لم يشارك أي صورة في "${p.trip}".`,
one: `${p.actor} شارك صورة واحدة في "${p.trip}".`,
two: `${p.actor} شارك صورتين في "${p.trip}".`,
few: `${p.actor} شارك ${p.count} صور في "${p.trip}".`,
many: `${p.actor} شارك ${p.count} صورة في "${p.trip}".`,
other: `${p.actor} شارك ${p.count} صورة في "${p.trip}".`,
}),
}),
collab_message: (p) => ({
title: `رسالة جديدة في "${p.trip}"`,
@@ -56,7 +71,16 @@ const ar: NotificationLocale = {
title: 'فشل النسخة المتماثلة للتخزين',
body:
`فشلت الكتابة على النسخة المتماثلة '${p.backend}': ${p.op} لـ ${p.key} — ${p.error}.` +
(p.suppressed !== '0' ? ` تم تجاهل ${p.suppressed} فشل إضافي منذ آخر إشعار.` : ''),
(p.suppressed !== '0'
? pluralForm(p.suppressed, 'ar', {
zero: ' لم يتم تجاهل أي حالة فشل إضافية منذ آخر إشعار.',
one: ' تم تجاهل حالة فشل إضافية واحدة منذ آخر إشعار.',
two: ' تم تجاهل حالتَي فشل إضافيتين منذ آخر إشعار.',
few: ` تم تجاهل ${p.suppressed} حالات فشل إضافية منذ آخر إشعار.`,
many: ` تم تجاهل ${p.suppressed} حالة فشل إضافية منذ آخر إشعار.`,
other: ` تم تجاهل ${p.suppressed} حالة فشل إضافية منذ آخر إشعار.`,
})
: ''),
}),
synology_session_cleared: () => ({
title: 'تمت إعادة تعيين جلسة Synology',
+16 -2
View File
@@ -10,12 +10,26 @@ const files: TranslationStrings = {
'files.title': 'الملفات',
'files.pageTitle': 'الملفات والمستندات',
'files.subtitle': '{count} ملف لـ {trip}',
'files.subtitle.zero': 'لا توجد ملفات لـ {trip}',
'files.subtitle.one': 'ملف واحد لـ {trip}',
'files.subtitle.two': 'ملفان لـ {trip}',
'files.subtitle.few': '{count} ملفات لـ {trip}',
'files.subtitle.many': '{count} ملفًا لـ {trip}',
'files.download': 'تنزيل',
'files.openError': 'تعذر فتح الملف',
'files.downloadPdf': 'تنزيل PDF',
'files.count': '{count} ملفات',
'files.count': '{count} ملف',
'files.count.zero': 'لا توجد ملفات',
'files.count.one': 'ملف واحد',
'files.uploaded': 'تم رفع {count}',
'files.count.two': 'ملفان',
'files.count.few': '{count} ملفات',
'files.count.many': '{count} ملفًا',
'files.uploaded': 'تم رفع {count} ملف',
'files.uploaded.zero': 'لم يتم رفع أي ملف',
'files.uploaded.one': 'تم رفع ملف واحد',
'files.uploaded.two': 'تم رفع ملفين',
'files.uploaded.few': 'تم رفع {count} ملفات',
'files.uploaded.many': 'تم رفع {count} ملفًا',
'files.uploadError': 'فشل الرفع',
'files.uploadErrorType': 'نوع الملف هذا غير مدعوم',
'files.dropzone': 'أسقط الملفات هنا',
+18 -3
View File
@@ -15,9 +15,19 @@ const help: TranslationStrings = {
'help.center.onThisScreen': 'في هذه الشاشة',
'help.center.screens': 'الشاشات',
'help.center.thisScreen': 'هذه الشاشة',
'help.center.subScreens': 'الشاشات الفرعية: {count}',
'help.center.subScreens': '{count} شاشة فرعية',
'help.center.subScreens.zero': 'لا توجد شاشات فرعية',
'help.center.subScreens.one': 'شاشة فرعية واحدة',
'help.center.subScreens.two': 'شاشتان فرعيتان',
'help.center.subScreens.few': '{count} شاشات فرعية',
'help.center.subScreens.many': '{count} شاشة فرعية',
'help.center.subScreensLabel': 'الشاشات الفرعية',
'help.center.guidesCount': '{count} أدلة',
'help.center.guidesCount': '{count} دليل',
'help.center.guidesCount.zero': 'لا توجد أدلة',
'help.center.guidesCount.one': 'دليل واحد',
'help.center.guidesCount.two': 'دليلان',
'help.center.guidesCount.few': '{count} أدلة',
'help.center.guidesCount.many': '{count} دليلًا',
'help.center.goToScreen': 'الانتقال إلى {screen}',
'help.center.overview': 'نظرة عامة',
'help.center.howTo': 'كيف يمكنني…',
@@ -28,7 +38,12 @@ const help: TranslationStrings = {
'help.center.searchError': 'البحث غير متاح حاليًا.',
'help.center.back': 'رجوع',
'help.center.close': 'إغلاق المساعدة',
'help.center.steps': '{count} خطوات',
'help.center.steps': '{count} خطوة',
'help.center.steps.zero': 'لا توجد خطوات',
'help.center.steps.one': 'خطوة واحدة',
'help.center.steps.two': 'خطوتان',
'help.center.steps.few': '{count} خطوات',
'help.center.steps.many': '{count} خطوة',
'help.center.step': 'الخطوة {n}',
'help.center.stepsLabel': 'الخطوات',
'help.center.stepOf': 'الخطوة {n} من {total}',
+6 -1
View File
@@ -6,7 +6,12 @@ const inspector: TranslationStrings = {
'inspector.openingHours': 'ساعات العمل',
'inspector.showHours': 'عرض ساعات العمل',
'inspector.files': 'الملفات',
'inspector.filesCount': '{count} ملفات',
'inspector.filesCount': '{count} ملف',
'inspector.filesCount.zero': 'لا توجد ملفات',
'inspector.filesCount.one': 'ملف واحد',
'inspector.filesCount.two': 'ملفان',
'inspector.filesCount.few': '{count} ملفات',
'inspector.filesCount.many': '{count} ملفًا',
'inspector.remove': 'إزالة',
'inspector.removeFromDay': 'إزالة من اليوم',
'inspector.addToDay': 'إضافة إلى اليوم',
+63 -8
View File
@@ -5,7 +5,12 @@ const journey: TranslationStrings = {
'journey.search.noResults': 'لا توجد رحلات تطابق "{query}"',
'journey.status.archived': 'مؤرشف',
'journey.detail.backToJourney': 'العودة للمجلة',
'journey.detail.photos': 'صور',
'journey.detail.photos': 'صورة',
'journey.detail.photos.zero': 'صور',
'journey.detail.photos.one': 'صورة',
'journey.detail.photos.two': 'صورتان',
'journey.detail.photos.few': 'صور',
'journey.detail.photos.many': 'صورة',
'journey.detail.day': 'اليوم {number}',
'journey.detail.places': 'أماكن',
'journey.skeletons.show': 'إظهار الاقتراحات',
@@ -40,8 +45,18 @@ const journey: TranslationStrings = {
'journey.settings.failedToDelete': 'فشل في الحذف',
'journey.entries.deleteTitle': 'حذف الإدخال',
'journey.photosUploaded': 'تم رفع {count} صورة',
'journey.photosUploaded.zero': 'لم يتم رفع أي صورة',
'journey.photosUploaded.one': 'تم رفع صورة واحدة',
'journey.photosUploaded.two': 'تم رفع صورتين',
'journey.photosUploaded.few': 'تم رفع {count} صور',
'journey.photosUploaded.many': 'تم رفع {count} صورة',
'journey.photosUploadFailed': 'فشل رفع بعض الصور',
'journey.photosAdded': 'تمت إضافة {count} صورة',
'journey.photosAdded.zero': 'لم تتم إضافة أي صورة',
'journey.photosAdded.one': 'تمت إضافة صورة واحدة',
'journey.photosAdded.two': 'تمت إضافة صورتين',
'journey.photosAdded.few': 'تمت إضافة {count} صور',
'journey.photosAdded.many': 'تمت إضافة {count} صورة',
'journey.picker.tripPeriod': 'فترة الرحلة',
'journey.picker.dateRange': 'نطاق التاريخ',
'journey.picker.allPhotos': 'كل الصور',
@@ -109,7 +124,12 @@ const journey: TranslationStrings = {
'journey.frontpage.activeJourney': 'Active Journey', // en-fallback
'journey.frontpage.latestJourney': 'أحدث رحلة',
'journey.frontpage.allJourneys': 'All Journeys', // en-fallback
'journey.frontpage.journeys': 'journeys', // en-fallback
'journey.frontpage.journeys': 'رحلة',
'journey.frontpage.journeys.zero': 'رحلات',
'journey.frontpage.journeys.one': 'رحلة',
'journey.frontpage.journeys.two': 'رحلتان',
'journey.frontpage.journeys.few': 'رحلات',
'journey.frontpage.journeys.many': 'رحلة',
'journey.frontpage.createNew': 'Create a new Journey', // en-fallback
'journey.frontpage.createNewSub': 'Pick trips, write stories, share your adventures', // en-fallback
'journey.frontpage.live': 'Live', // en-fallback
@@ -125,13 +145,23 @@ const journey: TranslationStrings = {
'journey.frontpage.tripsSelected': 'trips selected', // en-fallback
'journey.frontpage.trips': 'trips', // en-fallback
'journey.frontpage.placesImported': 'places will be imported', // en-fallback
'journey.frontpage.places': 'places', // en-fallback
'journey.frontpage.places': 'مكان',
'journey.frontpage.places.zero': 'أماكن',
'journey.frontpage.places.one': 'مكان',
'journey.frontpage.places.two': 'مكانان',
'journey.frontpage.places.few': 'أماكن',
'journey.frontpage.places.many': 'مكانًا',
'journey.detail.syncedWithTrips': 'Synced with Trips', // en-fallback
'journey.detail.addEntry': 'Add Entry', // en-fallback
'journey.detail.jumpToTop': 'العودة إلى الأعلى',
'journey.detail.jumpToLast': 'الانتقال إلى آخر مدخل',
'journey.detail.dayJump': 'الانتقال إلى يوم',
'journey.detail.dayJumpCount': 'الأيام: {count}',
'journey.detail.dayJumpCount': '{count} يوم',
'journey.detail.dayJumpCount.zero': 'لا توجد أيام',
'journey.detail.dayJumpCount.one': 'يوم واحد',
'journey.detail.dayJumpCount.two': 'يومان',
'journey.detail.dayJumpCount.few': '{count} أيام',
'journey.detail.dayJumpCount.many': '{count} يومًا',
'journey.detail.newEntry': 'New Entry', // en-fallback
'journey.detail.editEntry': 'Edit Entry', // en-fallback
'journey.detail.noEntries': 'No entries yet', // en-fallback
@@ -152,7 +182,12 @@ const journey: TranslationStrings = {
'journey.stats.places': 'Places', // en-fallback
'journey.verdict.lovedIt': 'Loved it', // en-fallback
'journey.verdict.couldBeBetter': 'Could be better', // en-fallback
'journey.synced.places': 'places', // en-fallback
'journey.synced.places': 'مكان',
'journey.synced.places.zero': 'أماكن',
'journey.synced.places.one': 'مكان',
'journey.synced.places.two': 'مكانان',
'journey.synced.places.few': 'أماكن',
'journey.synced.places.many': 'مكانًا',
'journey.synced.synced': 'synced', // en-fallback
'journey.editor.allPhotosAdded': 'All photos already added', // en-fallback
'journey.editor.writeStory': 'Write your story...', // en-fallback
@@ -286,11 +321,21 @@ const journey: TranslationStrings = {
'journey.studio.exportFinishing': 'التشطيب',
'journey.studio.exportMarks': 'علامات القص',
'journey.studio.exportMarksHint': 'يضيف {bleed} مم من الفيض عند كل حافة ويحدد موضع القص',
'journey.studio.exportNote': '{sheets} ورقة بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportNote': '{count} ورقة بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportNote.zero': 'لا توجد أوراق بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportNote.one': 'ورقة واحدة بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportNote.two': 'ورقتان بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportNote.few': '{count} أوراق بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportNote.many': '{count} ورقة بقياس {width} × {height} مم. يحوّل المتصفح معاينة الطباعة إلى PDF.',
'journey.studio.exportOpen': 'معاينة الطباعة',
'journey.studio.exportSave': 'حفظ بصيغة PDF',
'journey.studio.exportPreparing': 'جارٍ التحضير',
'journey.studio.exportSheetCount': '{count} ورقة',
'journey.studio.exportSheetCount.zero': 'لا توجد أوراق',
'journey.studio.exportSheetCount.one': 'ورقة واحدة',
'journey.studio.exportSheetCount.two': 'ورقتان',
'journey.studio.exportSheetCount.few': '{count} أوراق',
'journey.studio.exportSheetCount.many': '{count} ورقة',
'journey.studio.undo': 'Undo', // en-fallback
'journey.studio.redo': 'Redo', // en-fallback
'journey.studio.zoomIn': 'Zoom in', // en-fallback
@@ -634,7 +679,12 @@ const journey: TranslationStrings = {
'journey.studio.uploadToGallery': 'ستُضاف الصور الجديدة إلى المعرض',
'journey.studio.uploading': 'جارٍ رفع {done} من {total}',
'journey.studio.dropFilesHere': 'أفلت لإضافة الصور',
'journey.studio.videosSkipped': 'تم تجاهل {count} من مقاطع الفيديو. الكتاب يحتوي على صور فقط.',
'journey.studio.videosSkipped': 'تم تجاهل {count} مقطع فيديو. الكتاب يحتوي على صور فقط.',
'journey.studio.videosSkipped.zero': 'لم يتم تجاهل أي مقطع فيديو. الكتاب يحتوي على صور فقط.',
'journey.studio.videosSkipped.one': 'تم تجاهل مقطع فيديو واحد. الكتاب يحتوي على صور فقط.',
'journey.studio.videosSkipped.two': 'تم تجاهل مقطعَي فيديو. الكتاب يحتوي على صور فقط.',
'journey.studio.videosSkipped.few': 'تم تجاهل {count} مقاطع فيديو. الكتاب يحتوي على صور فقط.',
'journey.studio.videosSkipped.many': 'تم تجاهل {count} مقطع فيديو. الكتاب يحتوي على صور فقط.',
'journey.studio.fillPage': 'ملء الصفحة',
'journey.studio.fillSpread': 'ملء الصفحتين المتقابلتين',
'journey.studio.fillHint': 'يمدّ الصورة على الصفحة كاملة بما في ذلك الفيض، ويضعها خلف كل شيء آخر.',
@@ -657,7 +707,12 @@ const journey: TranslationStrings = {
'journey.suggestions.dismissed': 'تم تجاهل الاقتراح',
'journey.suggestions.restore': 'استعادة الاقتراحات المتجاهَلة',
'journey.suggestions.restoreCount': 'الاقتراحات المتجاهَلة ({count})',
'journey.suggestions.restored': 'عادت {count} اقتراحات',
'journey.suggestions.restored': 'تمت استعادة {count} اقتراح',
'journey.suggestions.restored.zero': 'لم تتم استعادة أي اقتراح',
'journey.suggestions.restored.one': 'تمت استعادة اقتراح واحد',
'journey.suggestions.restored.two': 'تمت استعادة اقتراحين',
'journey.suggestions.restored.few': 'تمت استعادة {count} اقتراحات',
'journey.suggestions.restored.many': 'تمت استعادة {count} اقتراحًا',
'journey.detail.addOnThisDay': 'إضافة مدخل في هذا اليوم',
'journey.detail.jumpToDay': 'الانتقال إلى {date}',
'journey.detail.searchPlaceholder': 'ابحث في هذه الرحلة',
+10
View File
@@ -30,6 +30,16 @@ const map: TranslationStrings = {
'map.overview.total': 'المسافة الإجمالية',
'map.attribution': 'مصادر الخريطة',
'map.overview.unrouted': 'تعذّر حساب {count} مرحلة، لذا المسافات غير مكتملة.',
'map.overview.unrouted.zero': 'لا توجد مراحل تعذّر حسابها.',
'map.overview.unrouted.one': 'تعذّر حساب مرحلة واحدة، لذا المسافات غير مكتملة.',
'map.overview.unrouted.two': 'تعذّر حساب مرحلتين، لذا المسافات غير مكتملة.',
'map.overview.unrouted.few': 'تعذّر حساب {count} مراحل، لذا المسافات غير مكتملة.',
'map.overview.unrouted.many': 'تعذّر حساب {count} مرحلة، لذا المسافات غير مكتملة.',
'map.overview.dayUnrouted': 'تعذّر حساب {count} مرحلة من هذا اليوم',
'map.overview.dayUnrouted.zero': 'لا توجد مراحل تعذّر حسابها في هذا اليوم',
'map.overview.dayUnrouted.one': 'تعذّر حساب مرحلة واحدة من هذا اليوم',
'map.overview.dayUnrouted.two': 'تعذّر حساب مرحلتين من هذا اليوم',
'map.overview.dayUnrouted.few': 'تعذّر حساب {count} مراحل من هذا اليوم',
'map.overview.dayUnrouted.many': 'تعذّر حساب {count} مرحلة من هذا اليوم',
};
export default map;
+5 -1
View File
@@ -7,8 +7,12 @@ const members: TranslationStrings = {
'members.invite': 'دعوة',
'members.allHaveAccess': 'جميع المستخدمين لديهم صلاحية الوصول بالفعل.',
'members.access': 'الصلاحية',
'members.persons': 'أشخاص',
'members.persons': 'شخص',
'members.persons.zero': 'أشخاص',
'members.persons.one': 'شخص',
'members.persons.two': 'شخصان',
'members.persons.few': 'أشخاص',
'members.persons.many': 'شخصًا',
'members.you': 'أنت',
'members.owner': 'المالك',
'members.leaveTrip': 'مغادرة الرحلة',
+12 -2
View File
@@ -15,7 +15,12 @@ const memories: TranslationStrings = {
'memories.sharing': 'مشترك',
'memories.reviewTitle': 'مراجعة صورك',
'memories.reviewHint': 'انقر على الصور لاستبعادها من المشاركة.',
'memories.shareCount': 'مشاركة {count} صور',
'memories.shareCount': 'مشاركة {count} صورة',
'memories.shareCount.zero': 'لا توجد صور للمشاركة',
'memories.shareCount.one': 'مشاركة صورة واحدة',
'memories.shareCount.two': 'مشاركة صورتين',
'memories.shareCount.few': 'مشاركة {count} صور',
'memories.shareCount.many': 'مشاركة {count} صورة',
'memories.providerUrl': 'عنوان URL للخادم',
'memories.providerApiKey': 'مفتاح API',
'memories.providerUsername': 'اسم المستخدم',
@@ -46,7 +51,12 @@ const memories: TranslationStrings = {
'memories.selectPhotosMultiple': 'اختيار الصور',
'memories.selectHint': 'انقر على الصور لتحديدها.',
'memories.selected': 'محدد',
'memories.addSelected': 'إضافة {count} صور',
'memories.addSelected': 'إضافة {count} صورة',
'memories.addSelected.zero': 'لا توجد صور للإضافة',
'memories.addSelected.one': 'إضافة صورة واحدة',
'memories.addSelected.two': 'إضافة صورتين',
'memories.addSelected.few': 'إضافة {count} صور',
'memories.addSelected.many': 'إضافة {count} صورة',
'memories.alreadyAdded': 'تمت الإضافة',
'memories.private': 'خاص',
'memories.stopSharing': 'إيقاف المشاركة',
+24 -4
View File
@@ -3,10 +3,30 @@ import type { TranslationStrings } from '../types';
const mobileJourney: TranslationStrings = {
'mobileJourney.latestJourney': 'أحدث رحلة',
'mobileJourney.otherJourneys': 'رحلات أخرى',
'mobileJourney.entriesCount': '{count} مدخلات',
'mobileJourney.photosCount': '{count} صور',
'mobileJourney.placesCount': '{count} أماكن',
'mobileJourney.daysCount': '{count} أيام',
'mobileJourney.entriesCount': '{count} مدخل',
'mobileJourney.entriesCount.zero': 'لا توجد مدخلات',
'mobileJourney.entriesCount.one': 'مدخل واحد',
'mobileJourney.entriesCount.two': 'مدخلان',
'mobileJourney.entriesCount.few': '{count} مدخلات',
'mobileJourney.entriesCount.many': '{count} مدخلًا',
'mobileJourney.photosCount': '{count} صورة',
'mobileJourney.photosCount.zero': 'لا توجد صور',
'mobileJourney.photosCount.one': 'صورة واحدة',
'mobileJourney.photosCount.two': 'صورتان',
'mobileJourney.photosCount.few': '{count} صور',
'mobileJourney.photosCount.many': '{count} صورة',
'mobileJourney.placesCount': '{count} مكان',
'mobileJourney.placesCount.zero': 'لا توجد أماكن',
'mobileJourney.placesCount.one': 'مكان واحد',
'mobileJourney.placesCount.two': 'مكانان',
'mobileJourney.placesCount.few': '{count} أماكن',
'mobileJourney.placesCount.many': '{count} مكانًا',
'mobileJourney.daysCount': '{count} يوم',
'mobileJourney.daysCount.zero': 'لا توجد أيام',
'mobileJourney.daysCount.one': 'يوم واحد',
'mobileJourney.daysCount.two': 'يومان',
'mobileJourney.daysCount.few': '{count} أيام',
'mobileJourney.daysCount.many': '{count} يومًا',
'mobileJourney.time': 'الوقت',
'mobileJourney.tags': 'الوسوم',
'mobileJourney.addTag': 'إضافة وسم',
+39 -6
View File
@@ -41,11 +41,26 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.renameDay': 'إعادة تسمية اليوم',
'mobileTrip.resBadge': 'حجز',
'mobileTrip.showOnMap': 'إظهار على الخريطة',
'mobileTrip.statDocuments': '{count} ملفات',
'mobileTrip.statPeople': '{count} أشخاص',
'mobileTrip.statDocuments': '{count} ملف',
'mobileTrip.statDocuments.zero': 'لا توجد ملفات',
'mobileTrip.statDocuments.one': 'ملف واحد',
'mobileTrip.statDocuments.two': 'ملفان',
'mobileTrip.statDocuments.few': '{count} ملفات',
'mobileTrip.statDocuments.many': '{count} ملفًا',
'mobileTrip.statPeople': '{count} شخص',
'mobileTrip.statPeople.zero': 'لا يوجد أشخاص',
'mobileTrip.statPeople.one': 'شخص واحد',
'mobileTrip.statPeople.two': 'شخصان',
'mobileTrip.statPeople.few': '{count} أشخاص',
'mobileTrip.statPeople.many': '{count} شخصًا',
'mobileTrip.stay': 'إقامة',
'mobileTrip.tapAgainToDelete': 'اضغط مرة أخرى للحذف',
'mobileTrip.todoOpenCount': '{count} مفتوحة',
'mobileTrip.todoOpenCount.zero': 'لا شيء مفتوح',
'mobileTrip.todoOpenCount.one': 'واحدة مفتوحة',
'mobileTrip.todoOpenCount.two': 'اثنتان مفتوحتان',
'mobileTrip.todoOpenCount.few': '{count} مفتوحة',
'mobileTrip.todoOpenCount.many': '{count} مفتوحة',
'mobileTrip.travel': 'السفر',
'mobileTrip.upNext': 'التالي',
'mobileTrip.viewDetails': 'عرض التفاصيل',
@@ -58,8 +73,18 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.rtBehind': '{time} تأخرًا عن الخطة',
'mobileTrip.rtStart': 'البداية',
'mobileTrip.rtStayScope': 'مدة التوقف تخص المكان نفسه، لذا تُحتسب في كل يوم تكون فيه هذه المحطة ضمن الخطة.',
'mobileTrip.rtStayLess': '{count} دقيقة أقل',
'mobileTrip.rtStayMore': '{count} دقيقة أكثر',
'mobileTrip.rtStayLess': 'أقل بـ{count} دقيقة',
'mobileTrip.rtStayLess.zero': 'أقل بـ{count} دقيقة',
'mobileTrip.rtStayLess.one': 'أقل بدقيقة واحدة',
'mobileTrip.rtStayLess.two': 'أقل بدقيقتين',
'mobileTrip.rtStayLess.few': 'أقل بـ{count} دقائق',
'mobileTrip.rtStayLess.many': 'أقل بـ{count} دقيقة',
'mobileTrip.rtStayMore': 'أكثر بـ{count} دقيقة',
'mobileTrip.rtStayMore.zero': 'أكثر بـ{count} دقيقة',
'mobileTrip.rtStayMore.one': 'أكثر بدقيقة واحدة',
'mobileTrip.rtStayMore.two': 'أكثر بدقيقتين',
'mobileTrip.rtStayMore.few': 'أكثر بـ{count} دقائق',
'mobileTrip.rtStayMore.many': 'أكثر بـ{count} دقيقة',
'mobileTrip.rtNightDesktopOnly': 'إضافة مبيت في هذا المكان تتم في مخطط سطح المكتب. هنا يمكنك إزالته فقط.',
'mobileTrip.rtReach': 'إلى أي مدى',
'mobileTrip.rtReachAhead': '{distance} أمامك',
@@ -67,8 +92,16 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.rtFromStart': 'من بداية المرحلة',
'mobileTrip.rtNoneAhead': 'لا شيء على الطريق أمامك. جرّب المرحلة كاملة.',
'mobileTrip.rtNoneOnStage': 'لا شيء من هذا النوع على طول هذه المرحلة.',
'mobileTrip.rtTruncated.one': 'مقطع واحد فيه أكثر مما يتسع في إجابة واحدة. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtTruncated.other': 'مقاطع فيها أكثر مما يتسع في إجابة واحدة: {count}. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtTruncated.other':
'في {count} مقطع كانت النتائج أكثر مما تتسع له إجابة واحدة. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtTruncated.zero': 'لم تتجاوز النتائج في أي مقطع ما تتسع له إجابة واحدة.',
'mobileTrip.rtTruncated.one':
'في مقطع واحد كانت النتائج أكثر مما تتسع له إجابة واحدة. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtTruncated.two': 'في مقطعين كانت النتائج أكثر مما تتسع له إجابة واحدة. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtTruncated.few':
'في {count} مقاطع كانت النتائج أكثر مما تتسع له إجابة واحدة. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtTruncated.many':
'في {count} مقطعًا كانت النتائج أكثر مما تتسع له إجابة واحدة. اختر أنواعًا أقل لرؤية الباقي.',
'mobileTrip.rtNoDay': 'لم يتم اختيار يوم',
'mobileTrip.rtNoDayHint': 'تعرض الخريطة الرحلة كاملة. اضغط على يوم في الأعلى لعرض مسيره.',
};
+12 -2
View File
@@ -5,8 +5,18 @@ const mobileVacay: TranslationStrings = {
'mobileVacay.nextYear': 'السنة التالية',
'mobileVacay.prevMonth': 'الشهر السابق',
'mobileVacay.nextMonth': 'الشهر التالي',
'mobileVacay.usedCount': '{count} مستخدَمة',
'mobileVacay.leftCount': '{count} متبقية',
'mobileVacay.usedCount': '{count} يوم مستخدَم',
'mobileVacay.usedCount.zero': 'لم يُستخدَم أي يوم',
'mobileVacay.usedCount.one': 'يوم واحد مستخدَم',
'mobileVacay.usedCount.two': 'يومان مستخدَمان',
'mobileVacay.usedCount.few': '{count} أيام مستخدَمة',
'mobileVacay.usedCount.many': '{count} يومًا مستخدَمًا',
'mobileVacay.leftCount': '{count} يوم متبقٍّ',
'mobileVacay.leftCount.zero': 'لم يتبقَّ أي يوم',
'mobileVacay.leftCount.one': 'يوم واحد متبقٍّ',
'mobileVacay.leftCount.two': 'يومان متبقيان',
'mobileVacay.leftCount.few': '{count} أيام متبقية',
'mobileVacay.leftCount.many': '{count} يومًا متبقيًا',
'mobileVacay.left': 'متبقية',
'mobileVacay.modeCompany': 'الشركة',
'mobileVacay.decreaseAllowance': 'تقليل الرصيد',
+5
View File
@@ -21,6 +21,11 @@ const notif: TranslationStrings = {
'notif.collection_invite.text': '{actor} يدعوك لمشاركة مجموعة',
'notif.photos_shared.title': 'تمت مشاركة الصور',
'notif.photos_shared.text': '{actor} شارك {count} صورة في {trip}',
'notif.photos_shared.text.zero': '{actor} لم يشارك أي صورة في {trip}',
'notif.photos_shared.text.one': '{actor} شارك صورة واحدة في {trip}',
'notif.photos_shared.text.two': '{actor} شارك صورتين في {trip}',
'notif.photos_shared.text.few': '{actor} شارك {count} صور في {trip}',
'notif.photos_shared.text.many': '{actor} شارك {count} صورة في {trip}',
'notif.collab_message.title': 'رسالة جديدة',
'notif.collab_message.text': '{actor} أرسل رسالة في {trip}',
'notif.packing_tagged.title': 'مهمة التعبئة',
+6
View File
@@ -31,5 +31,11 @@ const notifications: TranslationStrings = {
'notifications.test.adminText': 'أرسل {actor} إشعاراً تجريبياً لجميع المسؤولين.',
'notifications.test.tripTitle': 'نشر {actor} في رحلتك',
'notifications.test.tripText': 'إشعار تجريبي للرحلة "{trip}".',
'notifications.countLabel': 'إشعار',
'notifications.countLabel.zero': 'إشعارات',
'notifications.countLabel.one': 'إشعار',
'notifications.countLabel.two': 'إشعاران',
'notifications.countLabel.few': 'إشعارات',
'notifications.countLabel.many': 'إشعارًا',
};
export default notifications;
+6 -2
View File
@@ -84,8 +84,12 @@ const oauth: TranslationStrings = {
'oauth.authorize.requestDescription': 'This application is requesting access to your TREK account.', // en-fallback
'oauth.authorize.trustNote': 'Only grant access to applications you trust. Your data stays on your server.', // en-fallback
'oauth.authorize.selectScope': 'Select at least one scope', // en-fallback
'oauth.authorize.approveScopes': 'Approve ({count} scopes)', // en-fallback
'oauth.authorize.approveScopes.one': 'Approve ({count} scope)', // en-fallback
'oauth.authorize.approveScopes': 'موافقة ({count} نطاق)',
'oauth.authorize.approveScopes.zero': 'موافقة (بلا نطاقات)',
'oauth.authorize.approveScopes.one': 'موافقة (نطاق واحد)',
'oauth.authorize.approveScopes.two': 'موافقة (نطاقان)',
'oauth.authorize.approveScopes.few': 'موافقة ({count} نطاقات)',
'oauth.authorize.approveScopes.many': 'موافقة ({count} نطاقًا)',
'oauth.authorize.approveAccess': 'Approve Access', // en-fallback
'oauth.authorize.deny': 'Deny', // en-fallback
'oauth.authorize.choosePermissions': 'Choose which permissions to grant', // en-fallback
+21 -1
View File
@@ -32,6 +32,11 @@ const packing: TranslationStrings = {
'يمكن أيضًا استخدام قائمة Markdown: العنوان يحدد الفئة، و"- [ ]" و"- [x]" تصبح عناصر، و"3x" قبل الاسم تحدد الكمية.',
'packing.importAction': 'استيراد {count}',
'packing.importSuccess': 'تم استيراد {count} عنصر',
'packing.importSuccess.zero': 'لم يتم استيراد أي عنصر',
'packing.importSuccess.one': 'تم استيراد عنصر واحد',
'packing.importSuccess.two': 'تم استيراد عنصرين',
'packing.importSuccess.few': 'تم استيراد {count} عناصر',
'packing.importSuccess.many': 'تم استيراد {count} عنصرًا',
'packing.importError': 'فشل الاستيراد',
'packing.importEmpty': 'لا توجد عناصر للاستيراد',
'packing.progress': '{packed} من {total} جُهّز ({percent}%)',
@@ -59,6 +64,11 @@ const packing: TranslationStrings = {
'packing.applyTemplate': 'تطبيق قالب',
'packing.template': 'قالب',
'packing.templateApplied': 'تمت إضافة {count} عنصر من القالب',
'packing.templateApplied.zero': 'لم تتم إضافة أي عنصر من القالب',
'packing.templateApplied.one': 'تمت إضافة عنصر واحد من القالب',
'packing.templateApplied.two': 'تمت إضافة عنصرين من القالب',
'packing.templateApplied.few': 'تمت إضافة {count} عناصر من القالب',
'packing.templateApplied.many': 'تمت إضافة {count} عنصرًا من القالب',
'packing.templateError': 'فشل تطبيق القالب',
'packing.saveAsTemplate': 'حفظ كقالب',
'packing.templateName': 'اسم القالب',
@@ -74,7 +84,17 @@ const packing: TranslationStrings = {
'packing.addBag': 'إضافة أمتعة',
'packing.changeCategory': 'نقل إلى قائمة',
'packing.confirm.clearChecked': 'هل تريد إزالة {count} عنصر محدد؟',
'packing.confirm.deleteCat': 'هل أنت متأكد أنك تريد حذف القائمة "{name}" التي تحتوي على {count} عنصرًا؟',
'packing.confirm.clearChecked.zero': 'لا توجد عناصر محددة لإزالتها.',
'packing.confirm.clearChecked.one': 'هل تريد إزالة العنصر المحدد؟',
'packing.confirm.clearChecked.two': 'هل تريد إزالة العنصرين المحددين؟',
'packing.confirm.clearChecked.few': 'هل تريد إزالة {count} عناصر محددة؟',
'packing.confirm.clearChecked.many': 'هل تريد إزالة {count} عنصرًا محددًا؟',
'packing.confirm.deleteCat': 'هل أنت متأكد أنك تريد حذف القائمة "{name}" التي تحتوي على {count} عنصر؟',
'packing.confirm.deleteCat.zero': 'هل أنت متأكد أنك تريد حذف القائمة الفارغة "{name}"؟',
'packing.confirm.deleteCat.one': 'هل أنت متأكد أنك تريد حذف القائمة "{name}" التي تحتوي على عنصر واحد؟',
'packing.confirm.deleteCat.two': 'هل أنت متأكد أنك تريد حذف القائمة "{name}" التي تحتوي على عنصرين؟',
'packing.confirm.deleteCat.few': 'هل أنت متأكد أنك تريد حذف القائمة "{name}" التي تحتوي على {count} عناصر؟',
'packing.confirm.deleteCat.many': 'هل أنت متأكد أنك تريد حذف القائمة "{name}" التي تحتوي على {count} عنصرًا؟',
'packing.defaultCategory': 'أخرى',
'packing.toast.saveError': 'فشل الحفظ',
'packing.toast.deleteError': 'فشل الحذف',
+5
View File
@@ -3,6 +3,11 @@ import type { TranslationStrings } from '../types';
const photos: TranslationStrings = {
'photos.title': 'صور',
'photos.subtitle': '{count} صورة لـ {trip}',
'photos.subtitle.zero': 'لا توجد صور لـ {trip}',
'photos.subtitle.one': 'صورة واحدة لـ {trip}',
'photos.subtitle.two': 'صورتان لـ {trip}',
'photos.subtitle.few': '{count} صور لـ {trip}',
'photos.subtitle.many': '{count} صورة لـ {trip}',
'photos.dropHere': 'أسقط الصور هنا...',
'photos.dropHereActive': 'أسقط الصور هنا',
'photos.captionForAll': 'تعليق (للجميع)',
+43 -4
View File
@@ -17,6 +17,11 @@ const places: TranslationStrings = {
'places.importFileError': 'فشل الاستيراد',
'places.importAllSkipped': 'جميع الأماكن موجودة بالفعل في الرحلة.',
'places.gpxImported': 'تم استيراد {count} مكان من GPX',
'places.gpxImported.zero': 'لم يتم استيراد أي مكان من GPX',
'places.gpxImported.one': 'تم استيراد مكان واحد من GPX',
'places.gpxImported.two': 'تم استيراد مكانين من GPX',
'places.gpxImported.few': 'تم استيراد {count} أماكن من GPX',
'places.gpxImported.many': 'تم استيراد {count} مكانًا من GPX',
'places.gpxImportTypes': 'ما الذي تريد استيراده؟',
'places.gpxImportWaypoints': 'نقاط الطريق',
'places.gpxImportRoutes': 'المسارات',
@@ -27,10 +32,25 @@ const places: TranslationStrings = {
'places.kmlImportPaths': 'مسارات (LineStrings)',
'places.kmlImportNoneSelected': 'اختر نوعًا واحدًا على الأقل.',
'places.selectionCount': '{count} محدد',
'places.selectionCount.zero': 'لا شيء محدد',
'places.selectionCount.one': 'واحد محدد',
'places.selectionCount.two': 'اثنان محددان',
'places.selectionCount.few': '{count} محددة',
'places.selectionCount.many': '{count} محددًا',
'places.deleteSelected': 'حذف المحدد',
'places.changeCategory': 'تغيير الفئة',
'places.categoryChanged': 'تم تحديث {count} من الأماكن',
'places.categoryChanged': 'تم تحديث {count} مكان',
'places.categoryChanged.zero': 'لم يتم تحديث أي مكان',
'places.categoryChanged.one': 'تم تحديث مكان واحد',
'places.categoryChanged.two': 'تم تحديث مكانين',
'places.categoryChanged.few': 'تم تحديث {count} أماكن',
'places.categoryChanged.many': 'تم تحديث {count} مكانًا',
'places.kmlKmzImported': 'تم استيراد {count} مكان من KMZ/KML',
'places.kmlKmzImported.zero': 'لم يتم استيراد أي مكان من KMZ/KML',
'places.kmlKmzImported.one': 'تم استيراد مكان واحد من KMZ/KML',
'places.kmlKmzImported.two': 'تم استيراد مكانين من KMZ/KML',
'places.kmlKmzImported.few': 'تم استيراد {count} أماكن من KMZ/KML',
'places.kmlKmzImported.many': 'تم استيراد {count} مكانًا من KMZ/KML',
'places.urlResolved': 'تم استيراد المكان من الرابط',
'places.importList': 'استيراد قائمة',
'places.kmlKmzSummaryValues': 'علامات المواضع: {total} • تم الاستيراد: {created} • تم التجاوز: {skipped}',
@@ -38,10 +58,20 @@ const places: TranslationStrings = {
'places.importNaverList': 'قائمة Naver',
'places.googleListHint': 'الصق رابط قائمة Google Maps المشتركة لاستيراد جميع الأماكن.',
'places.googleDirHint': 'رابط الاتجاهات يعمل أيضاً: تتحوّل محطاته إلى أماكن، بترتيب القيادة.',
'places.googleListImported': 'تم استيراد {count} أماكن من "{list}"',
'places.googleListImported': 'تم استيراد {count} مكان من "{list}"',
'places.googleListImported.zero': 'لم يتم استيراد أي مكان من "{list}"',
'places.googleListImported.one': 'تم استيراد مكان واحد من "{list}"',
'places.googleListImported.two': 'تم استيراد مكانين من "{list}"',
'places.googleListImported.few': 'تم استيراد {count} أماكن من "{list}"',
'places.googleListImported.many': 'تم استيراد {count} مكانًا من "{list}"',
'places.googleListError': 'فشل استيراد قائمة Google Maps',
'places.naverListHint': 'الصق رابط قائمة Naver Maps مشتركة لاستيراد جميع الأماكن.',
'places.naverListImported': 'تم استيراد {count} مكان من "{list}"',
'places.naverListImported.zero': 'لم يتم استيراد أي مكان من "{list}"',
'places.naverListImported.one': 'تم استيراد مكان واحد من "{list}"',
'places.naverListImported.two': 'تم استيراد مكانين من "{list}"',
'places.naverListImported.few': 'تم استيراد {count} أماكن من "{list}"',
'places.naverListImported.many': 'تم استيراد {count} مكانًا من "{list}"',
'places.naverListError': 'فشل استيراد قائمة Naver Maps',
'places.viewDetails': 'عرض التفاصيل',
'places.assignToDay': 'إلى أي يوم تريد الإضافة؟',
@@ -67,10 +97,19 @@ const places: TranslationStrings = {
'places.notRated': 'لم يُقيَّم بعد',
'places.search': 'ابحث عن أماكن...',
'places.allCategories': 'كل الفئات',
'places.categoriesSelected': 'فئات',
'places.categoriesSelected': 'فئة',
'places.categoriesSelected.zero': 'فئات',
'places.categoriesSelected.one': 'فئة',
'places.categoriesSelected.two': 'فئتان',
'places.categoriesSelected.few': 'فئات',
'places.categoriesSelected.many': 'فئة',
'places.clearFilter': 'مسح الفلتر',
'places.count': '{count} أماكن',
'places.count': '{count} مكان',
'places.count.zero': 'لا توجد أماكن',
'places.count.one': 'مكان واحد',
'places.count.two': 'مكانان',
'places.count.few': '{count} أماكن',
'places.count.many': '{count} مكانًا',
'places.allPlanned': 'تم تخطيط جميع الأماكن',
'places.noneFound': 'لم يتم العثور على أماكن',
'places.editPlace': 'تعديل المكان',
+18 -3
View File
@@ -20,11 +20,21 @@ const planner: TranslationStrings = {
'planner.reservationDeleted': 'تم حذف الحجز',
'planner.days': 'الأيام',
'planner.allPlaces': 'كل الأماكن',
'planner.totalPlaces': 'إجمالي {n} أماكن',
'planner.totalPlaces': '{n} مكان في المجموع',
'planner.totalPlaces.zero': 'لا توجد أماكن',
'planner.totalPlaces.one': 'مكان واحد في المجموع',
'planner.totalPlaces.two': 'مكانان في المجموع',
'planner.totalPlaces.few': '{n} أماكن في المجموع',
'planner.totalPlaces.many': '{n} مكانًا في المجموع',
'planner.noDaysPlanned': 'لا توجد أيام مخططة بعد',
'planner.editTrip': 'تعديل الرحلة ←',
'planner.placeOne': 'مكان واحد',
'planner.placeN': '{n} أماكن',
'planner.placeN': '{n} مكان',
'planner.placeN.zero': 'لا توجد أماكن',
'planner.placeN.one': 'مكان واحد',
'planner.placeN.two': 'مكانان',
'planner.placeN.few': '{n} أماكن',
'planner.placeN.many': '{n} مكانًا',
'planner.addNote': 'إضافة ملاحظة',
'planner.noEntries': 'لا توجد عناصر لهذا اليوم',
'planner.addPlace': 'إضافة مكان/نشاط',
@@ -58,7 +68,12 @@ const planner: TranslationStrings = {
'planner.overview': 'نظرة عامة',
'planner.noDays': 'لا توجد أيام بعد',
'planner.editTripToAddDays': 'عدّل الرحلة لإضافة أيام',
'planner.dayCount': '{n} أيام',
'planner.dayCount': '{n} يوم',
'planner.dayCount.zero': 'لا توجد أيام',
'planner.dayCount.one': 'يوم واحد',
'planner.dayCount.two': 'يومان',
'planner.dayCount.few': '{n} أيام',
'planner.dayCount.many': '{n} يومًا',
'planner.clickToUnlock': 'انقر لفتح القفل',
'planner.keepPosition': 'الحفاظ على الموضع أثناء تحسين المسار',
'planner.dayDetails': 'تفاصيل اليوم',
+36 -6
View File
@@ -140,15 +140,30 @@ const reservations: TranslationStrings = {
'المقبول: EML، PDF، PKPass، HTML، TXT (بحد أقصى 10 ميغابايت لكل ملف، حتى 5 ملفات)',
'reservations.import.acceptedPhotos': 'يقرأ نموذج الذكاء الاصطناعي الصور (JPG وPNG وWEBP).',
'reservations.import.parsing': 'جارٍ معالجة الملفات…',
'reservations.import.previewHeading': 'تم العثور على {count} حجز/حجوزات',
'reservations.import.previewHeading': 'تم العثور على {count} حجز',
'reservations.import.previewHeading.zero': 'لم يتم العثور على أي حجز',
'reservations.import.previewHeading.one': 'تم العثور على حجز واحد',
'reservations.import.previewHeading.two': 'تم العثور على حجزين',
'reservations.import.previewHeading.few': 'تم العثور على {count} حجوزات',
'reservations.import.previewHeading.many': 'تم العثور على {count} حجزًا',
'reservations.import.previewEmpty': 'تعذّر استخراج أي حجوزات من الملفات المُحمَّلة.',
'reservations.import.removeItem': 'إزالة',
'reservations.import.needsReview': 'مراجعة',
'reservations.import.tryAi': 'جرّب القراءة بالذكاء الاصطناعي',
'reservations.import.aiParsing': 'جارٍ القراءة بالذكاء الاصطناعي…',
'reservations.import.confirm': 'استيراد {count} حجز/حجوزات',
'reservations.import.confirm': 'استيراد {count} حجز',
'reservations.import.confirm.zero': 'لا توجد حجوزات للاستيراد',
'reservations.import.confirm.one': 'استيراد حجز واحد',
'reservations.import.confirm.two': 'استيراد حجزين',
'reservations.import.confirm.few': 'استيراد {count} حجوزات',
'reservations.import.confirm.many': 'استيراد {count} حجزًا',
'reservations.import.back': 'رجوع',
'reservations.import.success': 'تم استيراد {count} حجز/حجوزات',
'reservations.import.success': 'تم استيراد {count} حجز',
'reservations.import.success.zero': 'لم يتم استيراد أي حجز',
'reservations.import.success.one': 'تم استيراد حجز واحد',
'reservations.import.success.two': 'تم استيراد حجزين',
'reservations.import.success.few': 'تم استيراد {count} حجوزات',
'reservations.import.success.many': 'تم استيراد {count} حجزًا',
'reservations.import.partialFailure': 'تم استيراد {created}، فشل {failed}',
'reservations.import.error': 'فشلت المعالجة. تأكد من أن الملف تأكيد حجز صالح.',
'reservations.import.unavailable': 'استيراد الحجوزات غير متاح على هذا الخادم.',
@@ -163,8 +178,18 @@ const reservations: TranslationStrings = {
'reservations.airtrail.layoverHint':
'تم الاستيراد من AirTrail. الرحلة متعددة المراحل مع توقف لا تقابلها رحلة واحدة في AirTrail للمزامنة معها، لذا تبقى استيرادًا لمرة واحدة.',
'reservations.airtrail.loadError': 'تعذّر تحميل رحلاتك من AirTrail.',
'reservations.airtrail.imported': 'تم استيراد {count} رحلة/رحلات',
'reservations.airtrail.skippedDuplicate': '{count} موجودة بالفعل في هذه الرحلة، تم تخطّيها',
'reservations.airtrail.imported': 'تم استيراد {count} رحلة جوية',
'reservations.airtrail.imported.zero': 'لم يتم استيراد أي رحلة جوية',
'reservations.airtrail.imported.one': 'تم استيراد رحلة جوية واحدة',
'reservations.airtrail.imported.two': 'تم استيراد رحلتين جويتين',
'reservations.airtrail.imported.few': 'تم استيراد {count} رحلات جوية',
'reservations.airtrail.imported.many': 'تم استيراد {count} رحلة جوية',
'reservations.airtrail.skippedDuplicate': 'تم تخطّي {count} رحلة جوية موجودة بالفعل في هذه الرحلة',
'reservations.airtrail.skippedDuplicate.zero': 'لم يتم تخطّي أي رحلة جوية',
'reservations.airtrail.skippedDuplicate.one': 'تم تخطّي رحلة جوية واحدة موجودة بالفعل في هذه الرحلة',
'reservations.airtrail.skippedDuplicate.two': 'تم تخطّي رحلتين جويتين موجودتين بالفعل في هذه الرحلة',
'reservations.airtrail.skippedDuplicate.few': 'تم تخطّي {count} رحلات جوية موجودة بالفعل في هذه الرحلة',
'reservations.airtrail.skippedDuplicate.many': 'تم تخطّي {count} رحلة جوية موجودة بالفعل في هذه الرحلة',
'reservations.airtrail.nothingImported': 'لا شيء لاستيراده.',
'reservations.airtrail.importError': 'فشل الاستيراد. يُرجى المحاولة مرة أخرى.',
'reservations.airtrail.undo': 'استيراد من AirTrail',
@@ -228,7 +253,12 @@ const reservations: TranslationStrings = {
'reservations.sort.lateFirst': 'الأحدث أولًا',
'reservations.sort.aToZ': 'من أ إلى ي',
'reservations.sort.zToA': 'من ي إلى أ',
'reservations.timeline.dayCount': '{count} أيام',
'reservations.timeline.dayCount': '{count} يوم',
'reservations.timeline.dayCount.zero': 'لا توجد أيام',
'reservations.timeline.dayCount.one': 'يوم واحد',
'reservations.timeline.dayCount.two': 'يومان',
'reservations.timeline.dayCount.few': '{count} أيام',
'reservations.timeline.dayCount.many': '{count} يومًا',
'reservations.timeline.zoom': 'التقريب',
'reservations.timeline.trip': 'رحلة',
'reservations.timeline.day': 'يوم',
+53 -6
View File
@@ -67,7 +67,12 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.scope': 'اليوم',
'roadtrip.poi.looking': 'المطلوب',
'roadtrip.poi.searchingHint': 'جارٍ البحث على طول المسار…',
'roadtrip.poi.found': '{count} على الطريق',
'roadtrip.poi.found': '{count} مكان على الطريق',
'roadtrip.poi.found.zero': 'لا شيء على الطريق',
'roadtrip.poi.found.one': 'مكان واحد على الطريق',
'roadtrip.poi.found.two': 'مكانان على الطريق',
'roadtrip.poi.found.few': '{count} أماكن على الطريق',
'roadtrip.poi.found.many': '{count} مكانًا على الطريق',
'roadtrip.poi.fuel': 'وقود',
'roadtrip.poi.charging': 'شحن',
'roadtrip.stop.offRoad': '{distance} من الطريق',
@@ -102,7 +107,12 @@ const roadtrip: TranslationStrings = {
'roadtrip.limit.blockNote': 'كتلة واحدة = {distance}',
'roadtrip.limit.echoOver': '{over} من {days} أيام تتجاوز حدّك.',
'roadtrip.limit.echoNone': 'كل الأيام {days} ضمن حدودك.',
'roadtrip.limit.echoDry': '{count} مقاطع بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoDry': '{count} مقطع بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoDry.zero': 'لا توجد مقاطع بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoDry.one': 'مقطع واحد بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoDry.two': 'مقطعان بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoDry.few': '{count} مقاطع بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoDry.many': '{count} مقطعًا بلا محطة يمكن بلوغها.',
'roadtrip.limit.echoEmpty': 'افتح رحلة برية لترى الأثر.',
'roadtrip.limit.specToggle': 'احسبها من بيانات السيارة',
'roadtrip.limit.hint': 'يحسب وقت القيادة فقط. لا يشمل التوقفات والمبيت.',
@@ -123,7 +133,12 @@ const roadtrip: TranslationStrings = {
'roadtrip.avoid.ferry': 'العبّارات',
'roadtrip.avoid.hint': 'هذا ترجيح وليس منعًا. عندما لا تجد الرحلة طريقًا بديلًا فإنها تستخدمه، ويذكر اليوم ذلك.',
'roadtrip.avoid.unavailable': 'غير متاح: هذه النسخة تستخدم محركها الخاص، وهو لا يستطيع استبعاد فئة طرق.',
'roadtrip.avoid.badge': 'تجنُّب {count}',
'roadtrip.avoid.badge': 'تجنُّب {count} فئة',
'roadtrip.avoid.badge.zero': 'بلا تجنُّب',
'roadtrip.avoid.badge.one': 'تجنُّب فئة واحدة',
'roadtrip.avoid.badge.two': 'تجنُّب فئتين',
'roadtrip.avoid.badge.few': 'تجنُّب {count} فئات',
'roadtrip.avoid.badge.many': 'تجنُّب {count} فئة',
'roadtrip.avoid.missed': 'لا مفر من {classes}',
'roadtrip.avoid.missedHint':
'لا يوجد في هذا اليوم طريق بديل، لذلك تمر الرحلة منه. أما بقية الأيام فتظل تتجنب ما تستطيع.',
@@ -171,11 +186,26 @@ const roadtrip: TranslationStrings = {
'roadtrip.track.action': 'اتبع هذا المسار',
'roadtrip.track.working': 'يجري ملاءمة المسار مع التتبع، الجولة {round}',
'roadtrip.track.done': 'تم وضع {count} نقطة عبور. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.done.zero': 'لم يتم وضع أي نقطة عبور. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.done.one': 'تم وضع نقطة عبور واحدة. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.done.two': 'تم وضع نقطتَي عبور. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.done.few': 'تم وضع {count} نقاط عبور. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.done.many': 'تم وضع {count} نقطة عبور. يبقى المسار ضمن {distance} من التتبع.',
'roadtrip.track.capped': 'تم وضع {count} نقطة عبور. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.capped.zero': 'لم يتم وضع أي نقطة عبور. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.capped.one': 'تم وضع نقطة عبور واحدة. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.capped.two': 'تم وضع نقطتَي عبور. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.capped.few': 'تم وضع {count} نقاط عبور. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.capped.many': 'تم وضع {count} نقطة عبور. في أوسع نقطة يبتعد المسار {distance} عن التتبع.',
'roadtrip.track.already': 'كان المسار يتبع هذا التتبع بالفعل.',
'roadtrip.track.errorRoute': 'لم تستجب خدمة تحديد المسارات.',
'roadtrip.track.errorSave': 'تعذّر حفظ نقاط العبور.',
'roadtrip.track.clear': 'إزالة {count} نقطة عبور',
'roadtrip.track.clear.zero': 'لا توجد نقاط عبور لإزالتها',
'roadtrip.track.clear.one': 'إزالة نقطة عبور واحدة',
'roadtrip.track.clear.two': 'إزالة نقطتَي عبور',
'roadtrip.track.clear.few': 'إزالة {count} نقاط عبور',
'roadtrip.track.clear.many': 'إزالة {count} نقطة عبور',
'roadtrip.track.current': 'يتبع حالياً {name}',
'roadtrip.poi.rest': 'استراحة',
'roadtrip.poi.campsite': 'مخيم',
@@ -186,11 +216,23 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.noMatch': 'لا يوجد على الطريق ما يطابق «{name}».',
'roadtrip.poi.noneMatchFilters': 'لا يوجد شيء على الطريق يطابق عوامل التصفية هذه.',
'roadtrip.poi.foundFiltered': '{count} من {total} على الطريق',
'roadtrip.poi.truncated': 'في {count} من المقاطع كان هناك أكثر مما تتسع له استجابة واحدة — قلّص الممر لرؤية البقية.',
'roadtrip.poi.truncated': 'في {count} مقطع كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.',
'roadtrip.poi.truncated.zero': 'لم تتجاوز النتائج في أي مقطع ما تتسع له استجابة واحدة.',
'roadtrip.poi.truncated.one': 'في مقطع واحد كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.',
'roadtrip.poi.truncated.two': 'في مقطعين كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.',
'roadtrip.poi.truncated.few':
'في {count} مقاطع كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.',
'roadtrip.poi.truncated.many':
'في {count} مقطعًا كانت النتائج أكثر مما تتسع له استجابة واحدة. قلّص الممر لرؤية البقية.',
'roadtrip.poi.search': 'بحث',
'roadtrip.poi.searching': 'جارٍ البحث {done} من {total}',
'roadtrip.poi.capped': 'المسار طويل — تم البحث في الجزء الأول فقط.',
'roadtrip.poi.partial': 'تعذّر البحث في {count} من المقاطع — لم يستجب البحث عن الأماكن.',
'roadtrip.poi.partial': 'تعذّر البحث في {count} مقطع. لم يستجب البحث عن الأماكن.',
'roadtrip.poi.partial.zero': 'لا توجد مقاطع تعذّر البحث فيها.',
'roadtrip.poi.partial.one': 'تعذّر البحث في مقطع واحد. لم يستجب البحث عن الأماكن.',
'roadtrip.poi.partial.two': 'تعذّر البحث في مقطعين. لم يستجب البحث عن الأماكن.',
'roadtrip.poi.partial.few': 'تعذّر البحث في {count} مقاطع. لم يستجب البحث عن الأماكن.',
'roadtrip.poi.partial.many': 'تعذّر البحث في {count} مقطعًا. لم يستجب البحث عن الأماكن.',
'roadtrip.poi.failed': 'البحث عن الأماكن لا يستجيب حاليًا.',
'roadtrip.poi.empty': 'اختر ما تحتاجه ثم ابحث.',
'roadtrip.poi.add': 'إضافة',
@@ -235,7 +277,12 @@ const roadtrip: TranslationStrings = {
'roadtrip.quietDay.empty': 'لا توجد محطات بعد — أفلِت واحدة هنا',
'roadtrip.quietDay.one': 'حتى الآن {name} فقط — أفلِت محطة هنا',
'roadtrip.leg.driveText': '{distance} خلال {time}',
'roadtrip.day.stopCount': '{count} محطات',
'roadtrip.day.stopCount': '{count} محطة',
'roadtrip.day.stopCount.zero': 'لا توجد محطات',
'roadtrip.day.stopCount.one': 'محطة واحدة',
'roadtrip.day.stopCount.two': 'محطتان',
'roadtrip.day.stopCount.few': '{count} محطات',
'roadtrip.day.stopCount.many': '{count} محطة',
'roadtrip.day.fold': 'طيّ',
'roadtrip.day.folded': 'مطوي',
'roadtrip.stop.stayShort': 'مدة',
+11 -1
View File
@@ -382,7 +382,12 @@ const settings: TranslationStrings = {
'settings.airtrail.toast.saved': 'تم حفظ اتصال AirTrail',
'settings.airtrail.toast.saveError': 'تعذّر حفظ الاتصال',
'settings.airtrail.test.button': 'اختبار الاتصال',
'settings.airtrail.test.success': 'متصل — تم العثور على {count} رحلة/رحلات',
'settings.airtrail.test.success': 'متصل. تم العثور على {count} رحلة جوية',
'settings.airtrail.test.success.zero': 'متصل. لم يتم العثور على أي رحلة جوية',
'settings.airtrail.test.success.one': 'متصل. تم العثور على رحلة جوية واحدة',
'settings.airtrail.test.success.two': 'متصل. تم العثور على رحلتين جويتين',
'settings.airtrail.test.success.few': 'متصل. تم العثور على {count} رحلات جوية',
'settings.airtrail.test.success.many': 'متصل. تم العثور على {count} رحلة جوية',
'settings.airtrail.test.failed': 'فشل الاتصال',
'settings.aiParsing.title': 'التحليل بالذكاء الاصطناعي',
'settings.aiParsing.hint':
@@ -523,6 +528,11 @@ const settings: TranslationStrings = {
'settings.offline.storage.tripOff': 'غير مخزّن',
'settings.offline.storage.tripFinished': 'منتهية. لن تُحفظ إلا إذا فعّلتها.',
'settings.offline.notice.stored': 'تم حفظ {count} رحلة على هذا الجهاز',
'settings.offline.notice.stored.zero': 'لم يتم حفظ أي رحلة على هذا الجهاز',
'settings.offline.notice.stored.one': 'تم حفظ رحلة واحدة على هذا الجهاز',
'settings.offline.notice.stored.two': 'تم حفظ رحلتين على هذا الجهاز',
'settings.offline.notice.stored.few': 'تم حفظ {count} رحلات على هذا الجهاز',
'settings.offline.notice.stored.many': 'تم حفظ {count} رحلة على هذا الجهاز',
'settings.offline.notice.nothing': 'لا شيء للحفظ. فعّل الرحلات التي تريد الاحتفاظ بها.',
'settings.offline.notice.busy': 'تتم مزامنة بالفعل. حاول مجددًا بعد قليل.',
'settings.offline.notice.offline': 'لا يوجد اتصال. اتصل بالإنترنت لحفظ الرحلات للاستخدام دون اتصال.',
+6 -1
View File
@@ -13,7 +13,12 @@ const shared: TranslationStrings = {
'shared.tabBudget': 'التكاليف',
'shared.tabChat': 'الدردشة',
'shared.days': 'أيام',
'shared.places': 'أماكن',
'shared.places': 'مكان',
'shared.places.zero': 'أماكن',
'shared.places.one': 'مكان',
'shared.places.two': 'مكانان',
'shared.places.few': 'أماكن',
'shared.places.many': 'مكانًا',
'shared.unplanned': 'لم يُخطَّط بعد',
'shared.other': 'أخرى',
'shared.totalBudget': 'إجمالي التكاليف',
+6 -1
View File
@@ -110,7 +110,12 @@ const storage: TranslationStrings = {
'storage.sync.error': 'فشلت المزامنة: {error}',
'storage.sync.prompt': 'الكائنات الحالية لم تُنسخ بعد — هل تريد المزامنة الآن؟',
'storage.sync.dismiss': 'تجاهل',
'storage.usage.line': '{objects} كائن · {size}',
'storage.usage.line': '{count} كائن · {size}',
'storage.usage.line.zero': 'لا توجد كائنات · {size}',
'storage.usage.line.one': 'كائن واحد · {size}',
'storage.usage.line.two': 'كائنان · {size}',
'storage.usage.line.few': '{count} كائنات · {size}',
'storage.usage.line.many': '{count} كائنًا · {size}',
'storage.usage.computed': 'تم حساب الاستخدام {age}',
'storage.usage.never': 'لم يُحسب الاستخدام بعد',
'storage.usage.refresh': 'تحديث',
+5 -1
View File
@@ -19,8 +19,12 @@ const tours: TranslationStrings = {
'tours.caution.badge': 'يُرجى الاستخدام بحذر',
'tours.caution.tooltip': 'بيانات الارتفاع أو المقاييس غير مكتملة؛ تم الاستيراد مع تنبيه للحذر',
'tours.import.caution': 'تم الاستيراد مع تنبيه للحذر؛ بيانات الارتفاع أو المقاييس غير مكتملة',
'tours.import.success': 'تم استيراد {count} من الجولات من GPX',
'tours.import.success': 'تم استيراد {count} جولة من GPX',
'tours.import.success.zero': 'لم يتم استيراد أي جولة من GPX',
'tours.import.success.one': 'تم استيراد جولة واحدة من GPX',
'tours.import.success.two': 'تم استيراد جولتين من GPX',
'tours.import.success.few': 'تم استيراد {count} جولات من GPX',
'tours.import.success.many': 'تم استيراد {count} جولة من GPX',
'tours.import.noTrack': 'لم يُعثر على أثر مسجّل أو مسار في ملف GPX هذا',
'tours.import.error': 'تعذّر استيراد ملف GPX',
'tours.delete.confirmBody':
+24 -4
View File
@@ -31,8 +31,18 @@ const trip: TranslationStrings = {
'trip.toast.reservationAdded': 'تمت إضافة الحجز',
'trip.toast.deleted': 'تم الحذف',
'trip.confirm.deletePlace': 'هل تريد حذف هذا المكان؟',
'trip.confirm.deletePlaces': 'حذف {count} أماكن؟',
'trip.toast.placesDeleted': 'تم حذف {count} أماكن',
'trip.confirm.deletePlaces': 'حذف {count} مكان؟',
'trip.confirm.deletePlaces.zero': 'لا توجد أماكن لحذفها.',
'trip.confirm.deletePlaces.one': 'حذف مكان واحد؟',
'trip.confirm.deletePlaces.two': 'حذف مكانين؟',
'trip.confirm.deletePlaces.few': 'حذف {count} أماكن؟',
'trip.confirm.deletePlaces.many': 'حذف {count} مكانًا؟',
'trip.toast.placesDeleted': 'تم حذف {count} مكان',
'trip.toast.placesDeleted.zero': 'لم يتم حذف أي مكان',
'trip.toast.placesDeleted.one': 'تم حذف مكان واحد',
'trip.toast.placesDeleted.two': 'تم حذف مكانين',
'trip.toast.placesDeleted.few': 'تم حذف {count} أماكن',
'trip.toast.placesDeleted.many': 'تم حذف {count} مكانًا',
'trip.invite.linkTitle': 'رابط دعوة الرحلة',
'trip.invite.linkHint':
'أي شخص لديه حساب TREK ويفتح هذا الرابط ينضم إلى الرحلة كعضو. أعد الإنشاء لإبطال الرابط القديم.',
@@ -68,9 +78,19 @@ const trip: TranslationStrings = {
'transit.noResultsVia': 'لم يتم العثور على أي رحلات عبر {provider}. جرّب وقتًا أو عوامل تصفية مختلفة.',
'transit.noResults': 'لم يُعثر على أي رحلات. جرّب وقتًا أو عوامل تصفية مختلفة.',
'transit.direct': 'مباشر',
'transit.transfers': '{count} تحويلات',
'transit.transfers': '{count} تحويلة',
'transit.transfers.zero': 'بلا تحويلات',
'transit.transfers.one': 'تحويلة واحدة',
'transit.transfers.two': 'تحويلتان',
'transit.transfers.few': '{count} تحويلات',
'transit.transfers.many': '{count} تحويلة',
'transit.min': '{count} دقيقة',
'transit.stops': '{count} محطات',
'transit.stops': '{count} محطة',
'transit.stops.zero': 'دون توقف',
'transit.stops.one': 'محطة واحدة',
'transit.stops.two': 'محطتان',
'transit.stops.few': '{count} محطات',
'transit.stops.many': '{count} محطة',
'transit.walkTo': 'امشِ إلى {name}',
'transit.platform': 'الرصيف {track}',
'transit.adding': 'جارٍ الإضافة…',
+13 -4
View File
@@ -77,11 +77,15 @@ const admin: TranslationStrings = {
'admin.tabs.backup': 'Ehtiyat nüsxə',
'admin.tabs.notifications': 'Bildirişlər',
'admin.tabs.audit': 'Audit',
'admin.stats.users': 'İstifadəçilər',
'admin.stats.trips': 'Səyahətlər',
'admin.stats.places': 'Məkanlar',
'admin.stats.users': 'İstifadəçi',
'admin.stats.users.one': 'İstifadəçi',
'admin.stats.trips': 'Səyahət',
'admin.stats.trips.one': 'Səyahət',
'admin.stats.places': 'Məkan',
'admin.stats.places.one': 'Məkan',
'admin.stats.photos': 'Fotolar',
'admin.stats.files': 'Fayllar',
'admin.stats.files': 'Fayl',
'admin.stats.files.one': 'Fayl',
'admin.table.user': 'İstifadəçi',
'admin.table.email': 'E-poçt',
'admin.table.role': 'Rol',
@@ -298,7 +302,9 @@ const admin: TranslationStrings = {
'admin.packingTemplates.namePlaceholder': 'Şablonun adı (məsələn, Çimərlik tətili)',
'admin.packingTemplates.empty': 'Hələ heç bir şablon yaradılmayıb',
'admin.packingTemplates.items': 'element',
'admin.packingTemplates.items.one': 'element',
'admin.packingTemplates.categories': 'kateqoriya',
'admin.packingTemplates.categories.one': 'kateqoriya',
'admin.packingTemplates.itemName': 'Elementin adı',
'admin.packingTemplates.itemCategory': 'Kateqoriya',
'admin.packingTemplates.categoryName': 'Kateqoriyanın adı (məsələn, Geyim)',
@@ -350,6 +356,7 @@ const admin: TranslationStrings = {
'Yadda saxlamaq plagini yenidən başladır ki, yeni siyahını tətbiq etsin.',
'admin.plugins.allowedHosts.add': 'İcazə verilən host əlavə et',
'admin.plugins.allowedHosts.count': '{n} icazə verilən host',
'admin.plugins.allowedHosts.count.one': '{n} icazə verilən host',
'admin.plugins.operatorEgressPill': '+ əlavə etdiyiniz hostlar',
'admin.plugins.operatorEgressHint':
'Bu plagin yalnız sizin adını göstərə biləcəyiniz xidmətlə əlaqə saxlayır. Quraşdırdıqdan sonra ⋯ → İcazə verilən hostlar bölməsindən qoşula biləcəyi hostları əlavə edin. Başqa heç bir hosta qoşula bilməz.',
@@ -603,6 +610,7 @@ const admin: TranslationStrings = {
'admin.plugins.sortUpdates': 'Əvvəlcə yeniləmələr',
'admin.plugins.sortDownloads': 'Ən çox endirilənlər',
'admin.plugins.updatesAvailable': 'Plaginləriniz üçün {count} yeniləmə mövcuddur.',
'admin.plugins.updatesAvailable.one': 'Plaginləriniz üçün {count} yeniləmə mövcuddur.',
'admin.plugins.newerNeedsTrek': 'v{version} mövcuddur — TREK {range} tələb edir',
'admin.plugins.updateAll': 'Hamısını yenilə',
'admin.plugins.versionsTitle': 'Versiyalar',
@@ -879,6 +887,7 @@ const admin: TranslationStrings = {
'Bu istifadəçinin bütün keçid açarlarını silin (məsələn, cihaz itirildikdə). O, yenə də parolu ilə daxil ola bilər.',
'admin.passkey.resetConfirm': '{name} üçün bütün keçid açarları silinsin?',
'admin.passkey.resetDone': '{count} keçid açarı silindi',
'admin.passkey.resetDone.one': '{count} keçid açarı silindi',
'admin.group.users': 'İstifadəçilər',
'admin.group.config': 'Konfiqurasiya',
'admin.group.integration': 'İnteqrasiyalar',
+15 -8
View File
@@ -2,9 +2,12 @@ import type { TranslationStrings } from '../types';
const atlas: TranslationStrings = {
'atlas.subtitle': 'Dünya üzrə səyahət iziniz',
'atlas.countries': 'Ölkələr',
'atlas.trips': 'Səyahətlər',
'atlas.places': 'Məkanlar',
'atlas.countries': 'Ölkə',
'atlas.countries.one': 'Ölkə',
'atlas.trips': 'Səyahət',
'atlas.trips.one': 'Səyahət',
'atlas.places': 'Məkan',
'atlas.places.one': 'Məkan',
'atlas.placesShow': 'Bu ölkədəki məkanları göstər',
'atlas.placesSearch': 'Məkanları axtar',
'atlas.placesNone': 'Uyğun məkan yoxdur',
@@ -47,9 +50,12 @@ const atlas: TranslationStrings = {
'Ziyarət etməyi arzuladığınız yerləri əlavə edin',
'atlas.days': 'Gün',
'atlas.days.one': 'Gün',
'atlas.visitedCountries': 'Ziyarət edilmiş ölkələr',
'atlas.cities': 'Şəhərlər',
'atlas.regions': 'Regionlar',
'atlas.cities': 'Şəhər',
'atlas.cities.one': 'Şəhər',
'atlas.regions': 'Region',
'atlas.regions.one': 'Region',
'atlas.noData': 'Hələ səyahət məlumatı yoxdur',
'atlas.noDataHint':
'Dünya xəritənizi görmək üçün səyahət yaradın və məkanlar əlavə edin',
@@ -74,16 +80,17 @@ const atlas: TranslationStrings = {
'atlas.firstVisit': 'İlk səyahət',
'atlas.lastVisitLabel': 'Son səyahət',
'atlas.tripPlural': 'Səyahətlər',
'atlas.tripsLabel': 'Səyahətlər',
'atlas.tripsLabel': 'Səyahət',
'atlas.tripsLabel.one': 'Səyahət',
'atlas.placesVisited': 'Ziyarət edilmiş məkanlar',
'atlas.placesVisited': 'Ziyarət edilmiş məkan',
'atlas.placesVisited.one': 'Ziyarət edilmiş məkan',
'atlas.planned': 'Planlaşdırılıb',
'atlas.showPlanned': 'Planlaşdırılan ölkələri göstər',
'atlas.plannedFor': 'Planlaşdırılan tarix',
'atlas.antarctica': 'Antarktida',
'atlas.regionPlacesLabel': 'məkan',
'atlas.regionPlacesLabel.one': 'məkan',
};
export default atlas;
+11
View File
@@ -33,6 +33,8 @@ const budget: TranslationStrings = {
'budget.linkedToReservation': 'Rezervasiya ilə əlaqələndirilib — adı orada redaktə edin',
'budget.confirm.deleteCategory':
'“{name}” kateqoriyasını daxilindəki {count} qeydlə birlikdə silmək istədiyinizə əminsiniz?',
'budget.confirm.deleteCategory.one':
'“{name}” kateqoriyasını daxilindəki {count} qeydlə birlikdə silmək istədiyinizə əminsiniz?',
'budget.deleteCategory': 'Kateqoriyanı sil',
'budget.perPerson': 'Nəfər başına',
'budget.paid': 'Ödənilib',
@@ -66,6 +68,7 @@ const budget: TranslationStrings = {
'costs.expenses': 'Xərclər',
'costs.entries': '{count} qeyd',
'costs.entries.one': '{count} qeyd',
'costs.searchPlaceholder': 'Xərcləri axtarın…',
'costs.filter.all': 'Hamısı',
'costs.filter.mine': 'Mənim ödədiklərim',
@@ -73,6 +76,7 @@ const budget: TranslationStrings = {
'costs.filter.allCategories': 'Bütün kateqoriyalar',
'costs.filter.allDays': 'Bütün günlər',
'costs.expensesCount': '{count} xərc',
'costs.expensesCount.one': '{count} xərc',
'costs.addExpense': 'Xərc əlavə et',
'costs.view.label': 'Görünüş',
@@ -116,6 +120,7 @@ const budget: TranslationStrings = {
'costs.settleHistory': 'Hesablaşma tarixçəsi',
'costs.noSettlements': 'Hələ hesablaşmış ödəniş yoxdur.',
'costs.paymentsSettled': '{count} ödəniş üzrə hesablaşılıb',
'costs.paymentsSettled.one': '{count} ödəniş üzrə hesablaşılıb',
'costs.paid': 'ödədi',
'costs.undo': 'Geri qaytar',
@@ -155,6 +160,7 @@ const budget: TranslationStrings = {
'costs.splitHint.ticket': 'Qəbzdə olanları sadalayın və hər elementi kimin götürdüyünü işarələyin.',
'costs.pickSomeone': 'Bölüşdürmək üçün ən azı bir nəfər seçin.',
'costs.splitSummary': '{count} nəfər arasında bölünüb · hərəsinə {amount}',
'costs.splitSummary.one': '{count} nəfər · {amount}',
'costs.cat.accommodation': 'Yaşayış yeri',
'costs.cat.food': 'Yemək və içki',
@@ -172,7 +178,9 @@ const budget: TranslationStrings = {
'costs.cat.other': 'Digər',
'costs.daysCount': '{count} gün',
'costs.daysCount.one': '{count} gün',
'costs.travelers': '{count} səyahətçi',
'costs.travelers.one': '{count} səyahətçi',
'costs.liveRate': 'cari məzənnə',
'costs.settleAll': 'Hamısı üzrə hesablaş',
@@ -196,6 +204,7 @@ const budget: TranslationStrings = {
'costs.toggleSign': 'Xərc və geri ödəniş arasında keçid et',
'costs.receipts': 'Qəbzlər',
'costs.receipts.one': 'Qəbz',
'costs.receiptsTitle': 'Qəbzlər və fakturalar',
'costs.attachReceipt': 'Qəbz / faktura əlavə et',
'costs.attach': 'Əlavə et',
@@ -216,6 +225,8 @@ const budget: TranslationStrings = {
'costs.viewReceipt': 'Qəbzə bax',
'costs.receiptLeftBehind':
'Yadda saxlamaq mümkün olmadı və yüklənmiş {count} qəbz hələ də qalır. Onları Fayllar bölməsindən silin.',
'costs.receiptLeftBehind.one':
'Yadda saxlamaq mümkün olmadı və yüklənmiş {count} qəbz hələ də qalır. Onu Fayllar bölməsindən silin.',
};
export default budget;
+22
View File
@@ -19,8 +19,11 @@ const collection: TranslationStrings = {
'collections.duplicateToListTitle': '{count} məkanı başqa siyahıya kopyala',
'collections.noOtherLists': 'Başqa siyahı yoxdur',
'collections.movedCount': '{count} məkan köçürüldü',
'collections.movedCount.one': '{count} məkan köçürüldü',
'collections.duplicatedCount': '{count} məkan kopyalandı',
'collections.duplicatedCount.one': '{count} məkan kopyalandı',
'collections.placeCount': '{count} məkan',
'collections.placeCount.one': '{count} məkan',
'collections.category': 'Kateqoriya',
'collections.noCategory': 'Kateqoriya yoxdur',
'collections.editListTitle': 'Siyahını redaktə et',
@@ -42,6 +45,7 @@ const collection: TranslationStrings = {
'collections.importPickTripHint': 'Səyahət seçin və məkanlarını {name} siyahısına əlavə edin.',
'collections.importNoTrips': 'Hələ səyahət yoxdur',
'collections.importPlacesCount': '{count} məkan',
'collections.importPlacesCount.one': '{count} məkan',
'collections.importSearchPlaces': 'Məkanları axtarın…',
'collections.importOnlyNew': 'Yalnız yenilər',
'collections.importSelectAll': 'Hamısını seç',
@@ -50,11 +54,14 @@ const collection: TranslationStrings = {
'collections.importUnscheduled': 'Planlaşdırılmayıb',
'collections.importOnDay': '{count}-ci gün',
'collections.importSelectedCount': '{count} seçilib',
'collections.importSelectedCount.one': '{count} seçilib',
'collections.importAction': '{count} məkanı idxal et',
'collections.importEmptyTrip': 'Bu səyahətdə hələ məkan yoxdur',
'collections.importNothingNew': 'Bu səyahətdəki bütün məkanlar artıq siyahıdadır',
'collections.importDone': '{count} məkan əlavə edildi',
'collections.importDone.one': '{count} məkan əlavə edildi',
'collections.importDoneSkipped': '{count} məkan artıq siyahıda olduğu üçün dəyişdirilmədi',
'collections.importDoneSkipped.one': '{count} məkan artıq siyahıda olduğu üçün dəyişdirilmədi',
'collections.importDoneClean': 'İndi hamısı {name} siyahısındadır',
'collections.sort.default': 'Standart',
'collections.sort.nameAsc': 'Ad (A–Z)',
@@ -103,6 +110,7 @@ const collection: TranslationStrings = {
'collections.markVisitedNone': 'Bu məkanların heç biri siyahıda saxlanılmayıb',
'collections.markedVisited': 'Ziyarət edilib kimi işarələndi',
'collections.markedVisitedTrip': '{count} məkan ziyarət edilib kimi işarələndi',
'collections.markedVisitedTrip.one': '{count} məkan ziyarət edilib kimi işarələndi',
'collections.copyToTrip': 'Səyahətə kopyala',
'collections.copyToTripTitle': 'Səyahətə kopyala',
@@ -114,7 +122,9 @@ const collection: TranslationStrings = {
'collections.alreadyInTrip': 'Artıq bu səyahətdədir',
'collections.copied': 'Səyahətə kopyalandı',
'collections.copiedCount': '{count} məkan kopyalandı',
'collections.copiedCount.one': '{count} məkan kopyalandı',
'collections.skippedDuplicates': '{count} dublikat buraxıldı',
'collections.skippedDuplicates.one': '{count} dublikat buraxıldı',
'collections.copyNothing': 'Kopyalanacaq heç nə yoxdur',
'collections.removeFromList': 'Siyahıdan sil',
'collections.removeFromListConfirm': 'Bu məkan siyahıdan silinsin?',
@@ -128,6 +138,7 @@ const collection: TranslationStrings = {
'collections.search': 'Məkanları axtar',
'collections.selectMode': 'Seç',
'collections.selectedCount': '{count} seçilib',
'collections.selectedCount.one': '{count} seçilib',
'collections.pickList': 'Siyahıda saxla',
'collections.pickListPlaceholder': 'Siyahı seçin',
@@ -159,14 +170,18 @@ const collection: TranslationStrings = {
'collections.file.intoHint': 'Siyahıda artıq olan məkanlar, siyahının adı və rəngi dəyişdirilmir. Fayldakı yeni etiketlər əlavə edilir.',
'collections.file.confirmInto': 'Siyahıya əlavə et',
'collections.file.doneInto': '{count} məkan {name} siyahısına əlavə edildi',
'collections.file.doneInto.one': '{count} məkan {name} siyahısına əlavə edildi',
'collections.file.doneIntoDuplicates': '{count} məkan {name} siyahısına əlavə edildi, {duplicates} məkan artıq orada idi',
'collections.file.doneIntoNothing': 'Fayldakı bütün məkanlar artıq {name} siyahısındadır',
'collections.file.change': 'Dəyiş',
'collections.file.labelCount': '{count} etiket',
'collections.file.labelCount.one': '{count} etiket',
'collections.file.hint':
'Məkanlar sizə aid yeni siyahı kimi əlavə ediləcək. Reytinqlər, üzvlər və yüklənmiş fotolar idxal edilməyəcək.',
'collections.file.done': '{count} məkan idxal edildi',
'collections.file.done.one': '{count} məkan idxal edildi',
'collections.file.doneSkipped': '{count} məkan idxal edildi, {skipped} məkan buraxıldı',
'collections.file.doneSkipped.one': '{count} məkan idxal edildi, {skipped} məkan buraxıldı',
'collections.file.errorTooLarge': 'Bu fayl siyahı kimi istifadə edilmək üçün çox böyükdür.',
'collections.file.errorUnreadable': 'Bu faylı oxumaq mümkün olmadı.',
'collections.file.errorNotACollection': 'Bu, TREK siyahı faylı deyil.',
@@ -174,10 +189,14 @@ const collection: TranslationStrings = {
'collections.file.formatTrekHint': 'Etiketlər və statuslarla başqa TREK üçün',
'collections.file.formatGpxHint': 'OsmAnd, Organic Maps, Garmin və digər xəritə tətbiqləri üçün yol nöqtələri',
'collections.file.gpxOmitted': '{count} məkanın koordinatları olmadığı üçün GPX faylına daxil edilmədi',
'collections.file.gpxOmitted.one': '{count} məkanın koordinatları olmadığı üçün GPX faylına daxil edilmədi',
'collections.file.gpxNothing': 'Bu məkanların heç birinin koordinatları yoxdur, buna görə GPX faylına əlavə ediləcək heç nə yoxdur.',
'collections.file.reading': 'Fayl oxunur…',
'collections.file.gpxSkipped': 'İstifadəyə yararlı koordinatları olmayan {count} yol nöqtəsi daxil edilmir.',
'collections.file.gpxSkipped.one': 'İstifadəyə yararlı koordinatları olmayan {count} yol nöqtəsi daxil edilmir.',
'collections.file.gpxTrack': 'Bu faylda həmçinin {count} iz nöqtəsi var. İzlər deyil, yalnız yol nöqtələri idxal edilir.',
'collections.file.gpxTrack.one':
'Bu faylda həmçinin {count} iz nöqtəsi var. İzlər deyil, yalnız yol nöqtələri idxal edilir.',
'collections.file.gpxEmpty': 'Bu GPX faylında yol nöqtəsi yoxdur, buna görə idxal ediləcək heç nə yoxdur.',
'collections.file.errorNotGpx': 'Bu, GPX faylı deyil.',
'collections.file.errorTooManyPlaces':
@@ -216,6 +235,7 @@ const collection: TranslationStrings = {
'collections.widget.title': 'Kolleksiyalar',
'collections.widget.empty': 'Hələ saxlanılan məkan yoxdur',
'collections.widget.savedCount': '{count} məkan saxlanılıb',
'collections.widget.savedCount.one': '{count} məkan saxlanılıb',
'collections.labels.title': 'Etiketlər',
'collections.labels.manage': 'Etiketləri idarə et',
@@ -224,7 +244,9 @@ const collection: TranslationStrings = {
'collections.labels.namePlaceholder': 'məs. Berlin',
'collections.labels.assign': 'Etiket təyin et',
'collections.labels.assignN': '{count} məkana etiket əlavə et',
'collections.labels.assignN.one': '{count} məkana etiket əlavə et',
'collections.labels.assignedCount': '{count} məkan etiketləndi',
'collections.labels.assignedCount.one': '{count} məkan etiketləndi',
'collections.labels.empty': 'Hələ etiket yoxdur',
'collections.labels.emptyHint': 'Bu siyahıdakı məkanları qruplaşdırmaq üçün əvvəlcə etiket yaradın.',
};
+14 -4
View File
@@ -4,10 +4,12 @@ const dashboard: TranslationStrings = {
'dashboard.title': 'Səyahətlərim',
'dashboard.subtitle.loading': 'Səyahətlər yüklənir...',
'dashboard.subtitle.trips': '{count} səyahət ({archived} arxivləşdirilib)',
'dashboard.subtitle.trips.one': '{count} səyahət ({archived} arxivləşdirilib)',
'dashboard.subtitle.empty': 'İlk səyahətinizə başlayın',
'dashboard.subtitle.activeOne': '{count} aktiv səyahət',
'dashboard.subtitle.activeMany': '{count} aktiv səyahət',
'dashboard.subtitle.archivedSuffix': ' · {count} arxivləşdirilib',
'dashboard.subtitle.archivedSuffix.one': ' · {count} arxivləşdirilib',
'dashboard.newTrip': 'Yeni səyahət',
'dashboard.newTripSub': 'Sıfırdan yeni səyahət planlaşdırın',
'dashboard.subscribeAllTrips': 'Bütün səyahətlərə abunə ol',
@@ -31,10 +33,13 @@ const dashboard: TranslationStrings = {
'dashboard.nextTrip': 'Növbəti səyahət',
'dashboard.shared': 'Paylaşılıb',
'dashboard.sharedBy': '{name} tərəfindən paylaşılıb',
'dashboard.days': 'Günlər',
'dashboard.places': 'Məkanlar',
'dashboard.days': 'Gün',
'dashboard.days.one': 'Gün',
'dashboard.places': 'Məkan',
'dashboard.places.one': 'Məkan',
'dashboard.pass.places': 'Məkanlar',
'dashboard.members': 'Yoldaşlar',
'dashboard.card.buddies': 'Yoldaşlar',
'dashboard.card.buddies': 'Yoldaş',
'dashboard.card.buddies.one': 'Yoldaş',
'dashboard.archive': 'Arxivləşdir',
'dashboard.copyTrip': 'Nüsxəsini yarat',
@@ -50,6 +55,7 @@ const dashboard: TranslationStrings = {
'dashboard.status.tomorrow': 'Sabah',
'dashboard.status.past': 'Başa çatıb',
'dashboard.status.daysLeft': '{count} gün qalıb',
'dashboard.status.daysLeft.one': '{count} gün qalıb',
'dashboard.toast.loadError': 'Səyahətləri yükləmək mümkün olmadı',
'dashboard.loadErrorBanner': 'Serverə qoşulmaq mümkün olmadı. Səyahətləriniz təhlükəsizdir — yenidən cəhd edin.',
'dashboard.retry': 'Yenidən cəhd et',
@@ -142,6 +148,7 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.liveNow': 'Hazırda davam edir',
'dashboard.mobile.tripProgress': 'Səyahətin gedişatı',
'dashboard.mobile.daysLeft': '{count} gün qalıb',
'dashboard.mobile.daysLeft.one': '{count} gün qalıb',
'dashboard.mobile.places': 'Məkanlar',
'dashboard.mobile.buddies': 'Yoldaşlar',
'dashboard.mobile.newTrip': 'Yeni səyahət',
@@ -159,7 +166,9 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.startsToday': 'Bu gün başlayır',
'dashboard.mobile.tomorrow': 'Sabah',
'dashboard.mobile.inDays': '{count} gün sonra',
'dashboard.mobile.inDays.one': '{count} gün sonra',
'dashboard.mobile.inMonths': '{count} ay sonra',
'dashboard.mobile.inMonths.one': '{count} ay sonra',
'dashboard.mobile.spotlightDayOf': 'Gün {day}/{total}',
'dashboard.mobile.spotlightDays': '{count} gün',
'dashboard.mobile.spotlightDays.one': '{count} gün',
@@ -179,7 +188,7 @@ const dashboard: TranslationStrings = {
'dashboard.hero.destinations.one': '{count} istiqamət',
'dashboard.hero.dayUnit': 'gün',
'dashboard.hero.dayUnit.one': 'gün',
'dashboard.hero.daysLeft': 'Qalan günlər',
'dashboard.hero.daysLeft': 'Qalan gün',
'dashboard.hero.daysLeft.one': 'Qalan gün',
'dashboard.hero.lastDay': 'Son gün',
'dashboard.hero.untilStart': 'Başlanmasına qalan',
@@ -188,6 +197,7 @@ const dashboard: TranslationStrings = {
'dashboard.atlas.ofTotal': '{total} ölkədən',
'dashboard.atlas.tripsTotal': 'Səyahətlərin ümumi sayı',
'dashboard.atlas.placesMapped': 'Xəritəyə əlavə edilmiş {count} məkan',
'dashboard.atlas.placesMapped.one': 'Xəritəyə əlavə edilmiş {count} məkan',
'dashboard.atlas.daysTraveled': 'Səyahətdə keçirilən günlər',
'dashboard.atlas.daysUnit': 'gün',
'dashboard.atlas.acrossAllTrips': 'bütün səyahətlər üzrə',
+9 -1
View File
@@ -15,6 +15,7 @@ const dawarich: TranslationStrings = {
'dawarich.syncEnabledHint': 'Deaktiv olduqda TREK Dawarich-i yalnız siz istədiyiniz zaman oxuyur.',
'dawarich.test.button': 'Bağlantını yoxla',
'dawarich.test.success': 'Qoşuldu. Son 30 gündə {count} dayanma qeydi tapıldı.',
'dawarich.test.success.one': 'Qoşuldu. Son 30 gündə {count} dayanma qeydi tapıldı.',
'dawarich.test.failed': 'Dawarich ilə əlaqə yaratmaq mümkün olmadı.',
'dawarich.syncNow': 'İndi yoxla',
'dawarich.connected': 'Qoşulub',
@@ -29,6 +30,7 @@ const dawarich: TranslationStrings = {
'dawarich.toast.saveError': 'Bağlantını yadda saxlamaq mümkün olmadı',
'dawarich.toast.disconnected': 'Dawarich bağlantısı kəsildi',
'dawarich.toast.synced': '{count} yeni dayanma qeydi tapıldı',
'dawarich.toast.synced.one': '{count} yeni dayanma qeydi tapıldı',
'dawarich.toast.syncError': 'Dawarich-i oxumaq mümkün olmadı',
'dawarich.toast.syncRunning': 'Yoxlama artıq davam edir',
'dawarich.toast.acceptError': 'Bunu əlavə etmək mümkün olmadı',
@@ -80,6 +82,7 @@ const dawarich: TranslationStrings = {
'dawarich.suggestions.title': 'Dawarich-dən',
'dawarich.suggestions.pending': '{count} təklif sizi gözləyir',
'dawarich.suggestions.pending.one': '{count} təklif sizi gözləyir',
'dawarich.suggestions.loading': 'Dawarich oxunur…',
'dawarich.suggestions.notConnected': 'Dayanma qeydlərinizi burada görmək üçün Tənzimləmələr bölməsində Dawarich-i qoşun.',
'dawarich.suggestions.unavailable': 'Dawarich-i oxumaq mümkün olmadı.',
@@ -142,7 +145,9 @@ const dawarich: TranslationStrings = {
'dawarich.bucket.alreadyVisited': 'Artıq tamamlandı kimi işarələnib',
'dawarich.bucket.confirm': '{count} arzunu tamamlandı kimi işarələ',
'dawarich.bucket.confirmed': '{count} arzu tamamlandı kimi işarələndi',
'dawarich.bucket.confirmed.one': '{count} arzu tamamlandı kimi işarələndi',
'dawarich.bucket.skipped': '{count} qeydin koordinatları olmadığından onları yoxlamaq mümkün olmadı.',
'dawarich.bucket.skipped.one': '{count} qeydin koordinatları olmadığından onu yoxlamaq mümkün olmadı.',
'dawarich.bucket.truncated': 'Yalnız ilk qeydlər yoxlanıldı. Qalanlarını yoxlamaq üçün yenidən işə salın.',
'dawarich.bucket.visitedFrom': 'Dawarich qeydlərinizə əsasən tamamlandı kimi işarələnib',
'dawarich.bucket.clearVisit': 'Geri qaytar',
@@ -155,9 +160,11 @@ const dawarich: TranslationStrings = {
'dawarich.atlas.loading': 'Qeydləriniz oxunur…',
'dawarich.atlas.empty': 'Qeydlərinizdə TREK-də artıq olmayan yeni ölkə tapılmadı.',
'dawarich.atlas.cities': '{count} şəhər',
'dawarich.atlas.citiesOne': '1 şəhər',
'dawarich.atlas.cities.one': '{count} şəhər',
'dawarich.atlas.accept': '{count} ölkə əlavə et',
'dawarich.atlas.accept.one': '{count} ölkə əlavə et',
'dawarich.atlas.accepted': '{count} ölkə əlavə edildi',
'dawarich.atlas.accepted.one': '{count} ölkə əlavə edildi',
'dawarich.atlas.unresolved': 'TREK bunları ölkə ilə uyğunlaşdıra bilmədi: {names}.',
'dawarich.atlas.source': 'Dawarich-dən',
'dawarich.atlas.range': '{from}–{to} aralığı yoxlanıldı',
@@ -168,6 +175,7 @@ const dawarich: TranslationStrings = {
'dawarich.atlas.tab.countries': 'Ölkələr',
'dawarich.atlas.window': 'Son 12 ay yoxlanıldı.',
'dawarich.selected': '{count} seçilib',
'dawarich.selected.one': '{count} seçilib',
'dawarich.again': 'Yenidən yoxla',
'dawarich.bucket.metersAway': '{meters} m uzaqda',
'dawarich.bucket.kilometersAway': '{km} km uzaqda',
+12 -4
View File
@@ -1,4 +1,6 @@
import type { NotificationLocale } from '../externalNotifications/types';
import { pluralForm } from '../plural';
const az: NotificationLocale = {
email: {
footer: 'Bu məktubu TREK-də bildirişləriniz aktiv olduğu üçün aldınız.',
@@ -36,8 +38,11 @@ const az: NotificationLocale = {
body: `${p.actor} sizi kolleksiyanı paylaşmağa dəvət etdi. Qəbul və ya rədd etmək üçün TREK-i açın.`,
}),
photos_shared: (p) => ({
title: `${p.count} foto paylaşıldı`,
body: `${p.actor} “${p.trip}” səyahətində ${p.count} foto paylaşdı.`,
title: pluralForm(p.count, 'az', { one: `${p.count} foto paylaşıldı`, other: `${p.count} foto paylaşıldı` }),
body: pluralForm(p.count, 'az', {
one: `${p.actor} “${p.trip}” səyahətində ${p.count} foto paylaşdı.`,
other: `${p.actor} “${p.trip}” səyahətində ${p.count} foto paylaşdı.`,
}),
}),
collab_message: (p) => ({
title: `“${p.trip}” səyahətində yeni mesaj`,
@@ -56,7 +61,10 @@ const az: NotificationLocale = {
body:
`“${p.backend}” replikasına yazmaq mümkün olmadı: ${p.key} üçün ${p.op} — ${p.error}.` +
(p.suppressed !== '0'
? ` Son bildirişdən bəri ${p.suppressed} əlavə xəta gizlədilib.`
? pluralForm(p.suppressed, 'az', {
one: ` Son bildirişdən bəri ${p.suppressed} əlavə xəta gizlədilib.`,
other: ` Son bildirişdən bəri ${p.suppressed} əlavə xəta gizlədilib.`,
})
: ''),
}),
synology_session_cleared: () => ({
@@ -77,4 +85,4 @@ const az: NotificationLocale = {
ignore: 'Bu sorğunu siz göndərməmisinizsə, məktubu nəzərə almaya bilərsiniz — parolunuz dəyişməyəcək.',
},
};
export default az;
export default az;
+2
View File
@@ -13,12 +13,14 @@ const files: TranslationStrings = {
'files.title': 'Fayllar',
'files.pageTitle': 'Fayllar və sənədlər',
'files.subtitle': '{trip} üçün {count} fayl',
'files.subtitle.one': '{trip} üçün {count} fayl',
'files.download': 'Endir',
'files.openError': 'Faylı açmaq mümkün olmadı',
'files.downloadPdf': 'PDF-i endir',
'files.count': '{count} fayl',
'files.count.one': '{count} fayl',
'files.uploaded': '{count} fayl yükləndi',
'files.uploaded.one': '{count} fayl yükləndi',
'files.uploadError': 'Yükləmə uğursuz oldu',
'files.uploadErrorType': 'Bu fayl növü dəstəklənmir',
+3
View File
@@ -15,8 +15,10 @@ const help: TranslationStrings = {
'help.center.screens': 'Ekranlar',
'help.center.thisScreen': 'Bu ekran',
'help.center.subScreens': '{count} alt ekran',
'help.center.subScreens.one': '{count} alt ekran',
'help.center.subScreensLabel': 'Alt ekranlar',
'help.center.guidesCount': '{count} bələdçi',
'help.center.guidesCount.one': '{count} bələdçi',
'help.center.goToScreen': '{screen} bölməsinə keç',
'help.center.overview': 'İcmal',
'help.center.howTo': 'Necə etməli…',
@@ -28,6 +30,7 @@ const help: TranslationStrings = {
'help.center.back': 'Geri',
'help.center.close': 'Köməyi bağla',
'help.center.steps': '{count} addım',
'help.center.steps.one': '{count} addım',
'help.center.step': 'Addım {n}',
'help.center.stepsLabel': 'Addımlar',
'help.center.stepOf': 'Addım {n} / {total}',
+1
View File
@@ -7,6 +7,7 @@ const inspector: TranslationStrings = {
'inspector.showHours': 'İş saatlarını göstər',
'inspector.files': 'Fayllar',
'inspector.filesCount': '{count} fayl',
'inspector.filesCount.one': '{count} fayl',
'inspector.remove': 'Sil',
'inspector.removeFromDay': 'Gündən çıxar',
'inspector.addToDay': 'Günə əlavə et',
+13 -1
View File
@@ -74,6 +74,7 @@ const journey: TranslationStrings = {
'journey.frontpage.latestJourney': 'Son səyahət gündəliyi',
'journey.frontpage.allJourneys': 'Bütün səyahət gündəlikləri',
'journey.frontpage.journeys': 'səyahət gündəliyi',
'journey.frontpage.journeys.one': 'səyahət gündəliyi',
'journey.frontpage.createNew': 'Yeni səyahət gündəliyi yarat',
'journey.frontpage.createNewSub':
'Səyahətləri seçin, hekayələr yazın və macəralarınızı paylaşın',
@@ -92,6 +93,7 @@ const journey: TranslationStrings = {
'journey.frontpage.trips': 'səyahət',
'journey.frontpage.placesImported': 'məkan idxal ediləcək',
'journey.frontpage.places': 'məkan',
'journey.frontpage.places.one': 'məkan',
'journey.detail.backToJourney': 'Səyahət gündəliyinə qayıt',
'journey.detail.syncedWithTrips': 'Səyahətlərlə sinxronlaşdırılıb',
@@ -100,6 +102,7 @@ const journey: TranslationStrings = {
'journey.detail.jumpToLast': 'Sonuncu qeydə keç',
'journey.detail.dayJump': 'Günə keç',
'journey.detail.dayJumpCount': '{count} gün',
'journey.detail.dayJumpCount.one': '{count} gün',
'journey.detail.newEntry': 'Yeni qeyd',
'journey.detail.editEntry': 'Qeydi redaktə et',
'journey.detail.noEntries': 'Hələ qeyd yoxdur',
@@ -116,6 +119,7 @@ const journey: TranslationStrings = {
'journey.detail.readMore': 'Davamını oxu',
'journey.detail.prosCons': 'Müsbət və mənfi cəhətlər',
'journey.detail.photos': 'foto',
'journey.detail.photos.one': 'foto',
'journey.detail.day': '{number}-ci gün',
'journey.detail.places': 'məkan',
@@ -130,6 +134,7 @@ const journey: TranslationStrings = {
'journey.verdict.lovedIt': 'Çox bəyəndim',
'journey.verdict.couldBeBetter': 'Daha yaxşı ola bilərdi',
'journey.synced.places': 'məkan',
'journey.synced.places.one': 'məkan',
'journey.synced.synced': 'sinxronlaşdırılıb',
'journey.editor.discardChangesConfirm':
@@ -274,8 +279,10 @@ const journey: TranslationStrings = {
'journey.entries.deleteTitle': 'Qeydi sil',
'journey.photosUploaded': '{count} foto yükləndi',
'journey.photosUploaded.one': '{count} foto yükləndi',
'journey.photosUploadFailed': 'Bəzi fotoları yükləmək mümkün olmadı',
'journey.photosAdded': '{count} foto əlavə edildi',
'journey.photosAdded.one': '{count} foto əlavə edildi',
'journey.public.notFound': 'Tapılmadı',
'journey.public.notFoundMessage':
@@ -340,11 +347,14 @@ const journey: TranslationStrings = {
'journey.studio.exportMarksHint':
'Hər kənara {bleed} mm daşma payı əlavə edir və kəsiləcək yerləri işarələyir',
'journey.studio.exportNote':
'{width} × {height} mm ölçüdə {sheets} vərəq. Brauzeriniz çap görünüşünü PDF-ə çevirəcək.',
'{width} × {height} mm ölçüdə {count} vərəq. Brauzeriniz çap görünüşünü PDF-ə çevirəcək.',
'journey.studio.exportNote.one':
'{width} × {height} mm ölçüdə {count} vərəq. Brauzeriniz çap görünüşünü PDF-ə çevirəcək.',
'journey.studio.exportOpen': 'Çap görünüşü',
'journey.studio.exportSave': 'PDF kimi yadda saxla',
'journey.studio.exportPreparing': 'Hazırlanır',
'journey.studio.exportSheetCount': '{count} vərəq',
'journey.studio.exportSheetCount.one': '{count} vərəq',
'journey.studio.undo': 'Geri qaytar',
'journey.studio.redo': 'Təkrar et',
@@ -759,6 +769,7 @@ const journey: TranslationStrings = {
'journey.studio.dropFilesHere': 'Şəkilləri əlavə etmək üçün buraya buraxın',
'journey.studio.videosSkipped':
'{count} video daxil edilmədi. Kitabda yalnız şəkillər istifadə olunur.',
'journey.studio.videosSkipped.one': '{count} video daxil edilmədi. Kitabda yalnız şəkillər istifadə olunur.',
'journey.studio.fillPage': 'Səhifəni doldur',
'journey.studio.fillSpread': 'Açılımı doldur',
@@ -790,6 +801,7 @@ const journey: TranslationStrings = {
'journey.suggestions.restore': 'Bağlanmış təklifləri geri qaytar',
'journey.suggestions.restoreCount': 'Bağlanmış təkliflər ({count})',
'journey.suggestions.restored': '{count} təklif geri qaytarıldı',
'journey.suggestions.restored.one': '{count} təklif geri qaytarıldı',
'journey.detail.addOnThisDay': 'Bu günə qeyd əlavə et',
'journey.detail.jumpToDay': '{date} tarixinə keç',
+5 -5
View File
@@ -15,7 +15,7 @@ const login: TranslationStrings = {
'login.createAccount': 'Hesab yarat',
'login.createAccountHint': 'Yeni hesab yaradın.',
'login.creating': 'Yaradılır…',
'login.noAccount': "Hesabınız yoxdur?",
'login.noAccount': 'Hesabınız yoxdur?',
'login.hasAccount': 'Artıq hesabınız var?',
'login.register': 'Qeydiyyatdan keç',
'login.emailPlaceholder': 'nümunə@email.com',
@@ -46,17 +46,17 @@ const login: TranslationStrings = {
'login.rememberMe': 'Məni yadda saxla',
'login.forgotPasswordTitle': 'Parolunuzu sıfırlayın',
'login.forgotPasswordBody':
"Qeydiyyatdan keçdiyiniz e-poçt ünvanını daxil edin. Hesab mövcuddursa, sıfırlama keçidi göndəriləcək.",
'Qeydiyyatdan keçdiyiniz e-poçt ünvanını daxil edin. Hesab mövcuddursa, sıfırlama keçidi göndəriləcək.',
'login.forgotPasswordSubmit': 'Sıfırlama keçidini göndər',
'login.forgotPasswordSentTitle': 'E-poçtunuzu yoxlayın',
'login.forgotPasswordSentBody':
'Bu e-poçt ünvanı ilə hesab mövcuddursa, sıfırlama keçidi göndərilir. Keçidin etibarlılıq müddəti 60 dəqiqədir.',
'login.forgotPasswordSmtpHintOff':
"Diqqət: administratorunuz SMTP-ni konfiqurasiya etməyib. Buna görə sıfırlama keçidi e-poçtla göndərilmək əvəzinə server konsoluna yazılacaq.",
'Diqqət: administratorunuz SMTP-ni konfiqurasiya etməyib. Buna görə sıfırlama keçidi e-poçtla göndərilmək əvəzinə server konsoluna yazılacaq.',
'login.backToLogin': 'Girişə qayıt',
'login.newPassword': 'Yeni parol',
'login.confirmPassword': 'Yeni parolu təsdiqlə',
'login.passwordsDontMatch': "Parollar uyğun gəlmir",
'login.passwordsDontMatch': 'Parollar uyğun gəlmir',
'login.mfaCode': '2FA kodu',
'login.resetPasswordTitle': 'Yeni parol təyin et',
'login.resetPasswordBody': 'Əvvəllər burada istifadə etmədiyiniz güclü parol seçin. Parol ən azı 8 simvoldan ibarət olmalıdır.',
@@ -70,7 +70,7 @@ const login: TranslationStrings = {
'login.resetPasswordFailed': 'Sıfırlama uğursuz oldu. Keçidin vaxtı bitmiş ola bilər.',
'login.passkey.signIn': 'Passkey ilə daxil ol',
'login.passkey.failed': 'Passkey ilə giriş uğursuz oldu. Yenidən cəhd edin.',
'login.insecureCookie.title': "HTTP üzərindən giriş sessiyası saxlanmır",
'login.insecureCookie.title': 'HTTP üzərindən giriş sessiyası saxlanmır',
'login.insecureCookie.body':
'Adi HTTP üzərindən qoşulduğunuz üçün brauzer TREK-in təhlükəsiz sessiya kukisini saxlamır — növbəti sorğu "Access token required" xətası ilə uğursuz olur. Həll: HTTPS istifadə edin və ya ev laboratoriyası üçün COOKIE_SECURE=false təyin edin.',
'login.insecureCookie.link': 'Problemlərin həlli təlimatını aç',
+2
View File
@@ -41,8 +41,10 @@ const map: TranslationStrings = {
'map.attribution': 'Xəritə mənbələri',
'map.overview.unrouted':
'{count} marşrut hissəsini hesablamaq mümkün olmadığından məsafələr tam deyil.',
'map.overview.unrouted.one': '{count} marşrut hissəsini hesablamaq mümkün olmadığından məsafələr tam deyil.',
'map.overview.dayUnrouted':
'Bu günün {count} marşrut hissəsini hesablamaq mümkün olmadı',
'map.overview.dayUnrouted.one': 'Bu günün {count} marşrut hissəsini hesablamaq mümkün olmadı',
};
export default map;
+2
View File
@@ -22,6 +22,7 @@ const memories: TranslationStrings = {
'memories.reviewHint':
'Paylaşılmasını istəmədiyiniz fotolara klikləyin.',
'memories.shareCount': '{count} foto paylaş',
'memories.shareCount.one': '{count} foto paylaş',
'memories.providerUrl': 'Server URL-i',
'memories.providerApiKey': 'API açarı',
@@ -64,6 +65,7 @@ const memories: TranslationStrings = {
'memories.selectHint': 'Seçmək üçün fotolara toxunun.',
'memories.selected': 'seçilib',
'memories.addSelected': '{count} foto əlavə et',
'memories.addSelected.one': '{count} foto əlavə et',
'memories.alreadyAdded': 'Əlavə edilib',
'memories.private': 'Şəxsi',
+4
View File
@@ -4,9 +4,13 @@ const mobileJourney: TranslationStrings = {
'mobileJourney.latestJourney': 'Son səyahət gündəliyi',
'mobileJourney.otherJourneys': 'Digər səyahət gündəlikləri',
'mobileJourney.entriesCount': '{count} qeyd',
'mobileJourney.entriesCount.one': '{count} qeyd',
'mobileJourney.photosCount': '{count} foto',
'mobileJourney.photosCount.one': '{count} foto',
'mobileJourney.placesCount': '{count} məkan',
'mobileJourney.placesCount.one': '{count} məkan',
'mobileJourney.daysCount': '{count} gün',
'mobileJourney.daysCount.one': '{count} gün',
'mobileJourney.time': 'Vaxt',
'mobileJourney.tags': 'Teqlər',
'mobileJourney.addTag': 'Teq əlavə et',
+5
View File
@@ -42,10 +42,13 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.resBadge': 'Rezervasiya',
'mobileTrip.showOnMap': 'Xəritədə göstər',
'mobileTrip.statDocuments': '{count} fayl',
'mobileTrip.statDocuments.one': '{count} fayl',
'mobileTrip.statPeople': '{count} nəfər',
'mobileTrip.statPeople.one': '{count} nəfər',
'mobileTrip.stay': 'Qalma',
'mobileTrip.tapAgainToDelete': 'Silmək üçün yenidən toxunun',
'mobileTrip.todoOpenCount': '{count} açıq',
'mobileTrip.todoOpenCount.one': '{count} açıq',
'mobileTrip.travel': 'Yol',
'mobileTrip.upNext': 'Növbədə',
'mobileTrip.viewDetails': 'Təfərrüatlara bax',
@@ -59,7 +62,9 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.rtStart': 'Başlanğıc',
'mobileTrip.rtStayScope': 'Qalma müddəti məkana aiddir, buna görə bu dayanacağın planlaşdırıldığı hər gün üçün hesablanır.',
'mobileTrip.rtStayLess': '{count} dəqiqə az',
'mobileTrip.rtStayLess.one': '{count} dəqiqə az',
'mobileTrip.rtStayMore': '{count} dəqiqə çox',
'mobileTrip.rtStayMore.one': '{count} dəqiqə çox',
'mobileTrip.rtNightDesktopOnly':
'Bu məkanda gecələmə rezervasiyası kompüter planlayıcısında edilir. Burada onu yalnız silə bilərsiniz.',
'mobileTrip.rtReach': 'Nə qədər uzaqda',
+2
View File
@@ -6,7 +6,9 @@ const mobileVacay: TranslationStrings = {
'mobileVacay.prevMonth': 'Əvvəlki ay',
'mobileVacay.nextMonth': 'Növbəti ay',
'mobileVacay.usedCount': '{count} istifadə edilib',
'mobileVacay.usedCount.one': '{count} istifadə edilib',
'mobileVacay.leftCount': '{count} qalıb',
'mobileVacay.leftCount.one': '{count} qalıb',
'mobileVacay.left': 'qalıb',
'mobileVacay.modeCompany': 'Şirkət',
'mobileVacay.decreaseAllowance': 'Məzuniyyət limitini azalt',
+1
View File
@@ -21,6 +21,7 @@ const notif: TranslationStrings = {
'notif.collection_invite.text': '{actor} sizi kolleksiyanı paylaşmağa dəvət etdi',
'notif.photos_shared.title': 'Fotolar paylaşıldı',
'notif.photos_shared.text': '{actor} {trip} səyahətində {count} foto paylaşdı',
'notif.photos_shared.text.one': '{actor} {trip} səyahətində {count} foto paylaşdı',
'notif.collab_message.title': 'Yeni mesaj',
'notif.collab_message.text': '{actor} {trip} səyahətində mesaj göndərdi',
'notif.packing_tagged.title': 'Çamadan tapşırığı',
+2
View File
@@ -47,6 +47,8 @@ const notifications: TranslationStrings = {
'{actor} səyahətinizdə paylaşım etdi',
'notifications.test.tripText':
'“{trip}” səyahəti üçün test bildirişi.',
'notifications.countLabel': 'bildiriş',
'notifications.countLabel.one': 'bildiriş',
};
export default notifications;
+5
View File
@@ -34,6 +34,7 @@ const packing: TranslationStrings = {
'Markdown siyahısı da işləyir: başlıq kateqoriyanı adlandırır, "- [ ]" və "- [x]" elementə çevrilir, adın önündəki "3x" isə miqdarı təyin edir.',
'packing.importAction': '{count} elementi idxal et',
'packing.importSuccess': '{count} element idxal edildi',
'packing.importSuccess.one': '{count} element idxal edildi',
'packing.importError': 'İdxal uğursuz oldu',
'packing.importEmpty': 'İdxal ediləcək element yoxdur',
@@ -72,6 +73,7 @@ const packing: TranslationStrings = {
'packing.template': 'Şablon',
'packing.templateApplied':
'Şablondan {count} element əlavə edildi',
'packing.templateApplied.one': 'Şablondan {count} element əlavə edildi',
'packing.templateError': 'Şablonu tətbiq etmək mümkün olmadı',
'packing.saveAsTemplate': 'Şablon kimi yadda saxla',
'packing.templateName': 'Şablonun adı',
@@ -112,8 +114,11 @@ const packing: TranslationStrings = {
'packing.confirm.clearChecked':
'İşarələnmiş {count} elementi silmək istədiyinizə əminsiniz?',
'packing.confirm.clearChecked.one': 'İşarələnmiş {count} elementi silmək istədiyinizə əminsiniz?',
'packing.confirm.deleteCat':
'“{name}” siyahısını daxilindəki {count} elementlə birlikdə silmək istədiyinizə əminsiniz?',
'packing.confirm.deleteCat.one':
'“{name}” siyahısını daxilindəki {count} elementlə birlikdə silmək istədiyinizə əminsiniz?',
'packing.defaultCategory': 'Digər',
'packing.toast.saveError': 'Yadda saxlamaq mümkün olmadı',
+1
View File
@@ -3,6 +3,7 @@ import type { TranslationStrings } from '../types';
const photos: TranslationStrings = {
'photos.title': 'Fotolar',
'photos.subtitle': '{trip} üçün {count} foto',
'photos.subtitle.one': '{trip} üçün {count} foto',
'photos.dropHere': 'Fotoları buraya sürükləyib buraxın...',
'photos.dropHereActive': 'Fotoları buraya buraxın',
'photos.captionForAll': 'Başlıq (hamısı üçün)',
+7
View File
@@ -18,6 +18,7 @@ const places: TranslationStrings = {
'places.importAllSkipped': 'Bütün məkanlar artıq bu səyahətdə mövcuddur.',
'places.gpxImported': 'GPX-dən {count} məkan idxal edildi',
'places.gpxImported.one': 'GPX-dən {count} məkan idxal edildi',
'places.gpxImportTypes': 'Nələri idxal etmək istəyirsiniz?',
'places.gpxImportWaypoints': 'Yol nöqtələri',
'places.gpxImportRoutes': 'Marşrutlar',
@@ -30,10 +31,13 @@ const places: TranslationStrings = {
'places.kmlImportNoneSelected': 'İdxal etmək üçün ən azı bir növ seçin.',
'places.selectionCount': '{count} seçilib',
'places.selectionCount.one': '{count} seçilib',
'places.deleteSelected': 'Seçilənləri sil',
'places.changeCategory': 'Kateqoriyanı dəyiş',
'places.categoryChanged': '{count} məkan yeniləndi',
'places.categoryChanged.one': '{count} məkan yeniləndi',
'places.kmlKmzImported': 'KMZ/KML-dən {count} məkan idxal edildi',
'places.kmlKmzImported.one': 'KMZ/KML-dən {count} məkan idxal edildi',
'places.urlResolved': 'Məkan URL-dən idxal edildi',
'places.importList': 'Siyahı idxalı',
'places.kmlKmzSummaryValues': 'Məkan nişanları: {total} • İdxal edildi: {created} • Buraxıldı: {skipped}',
@@ -44,9 +48,11 @@ const places: TranslationStrings = {
'places.googleDirHint':
'İstiqamət linki də istifadə edilə bilər: dayanacaqlar avtomobillə hərəkət sırasına uyğun məkanlara çevriləcək.',
'places.googleListImported': '“{list}” siyahısından {count} məkan idxal edildi',
'places.googleListImported.one': '“{list}” siyahısından {count} məkan idxal edildi',
'places.googleListError': 'Google Maps siyahısını idxal etmək mümkün olmadı',
'places.naverListHint': 'Bütün məkanları idxal etmək üçün paylaşılan Naver Maps siyahısının linkini daxil edin.',
'places.naverListImported': '“{list}” siyahısından {count} məkan idxal edildi',
'places.naverListImported.one': '“{list}” siyahısından {count} məkan idxal edildi',
'places.naverListError': 'Naver Maps siyahısını idxal etmək mümkün olmadı',
'places.viewDetails': 'Təfərrüatlara bax',
@@ -77,6 +83,7 @@ const places: TranslationStrings = {
'places.search': 'Məkanları axtarın...',
'places.allCategories': 'Bütün kateqoriyalar',
'places.categoriesSelected': 'kateqoriya',
'places.categoriesSelected.one': 'kateqoriya',
'places.clearFilter': 'Filtri təmizlə',
'places.count': '{count} məkan',
'places.count.one': '{count} məkan',
+3
View File
@@ -26,10 +26,12 @@ const planner: TranslationStrings = {
'planner.days': 'Günlər',
'planner.allPlaces': 'Bütün məkanlar',
'planner.totalPlaces': 'Ümumilikdə {n} məkan',
'planner.totalPlaces.one': 'Ümumilikdə {n} məkan',
'planner.noDaysPlanned': 'Hələ heç bir gün planlaşdırılmayıb',
'planner.editTrip': 'Səyahəti redaktə et →',
'planner.placeOne': '1 məkan',
'planner.placeN': '{n} məkan',
'planner.placeN.one': '{n} məkan',
'planner.addNote': 'Qeyd əlavə et',
'planner.noEntries': 'Bu gün üçün heç bir qeyd yoxdur',
@@ -76,6 +78,7 @@ const planner: TranslationStrings = {
'planner.editTripToAddDays':
'Günlər əlavə etmək üçün səyahəti redaktə edin',
'planner.dayCount': '{n} gün',
'planner.dayCount.one': '{n} gün',
'planner.clickToUnlock': 'Kilidi açmaq üçün klikləyin',
'planner.keepPosition':
+6
View File
@@ -172,14 +172,17 @@ const reservations: TranslationStrings = {
'reservations.import.acceptedPhotos': 'Fotoları (JPG, PNG, WEBP) süni intellekt modeli oxuyur.',
'reservations.import.parsing': 'Fayllar təhlil edilir…',
'reservations.import.previewHeading': '{count} rezervasiya tapıldı',
'reservations.import.previewHeading.one': '{count} rezervasiya tapıldı',
'reservations.import.previewEmpty': 'Yüklənən fayllardan heç bir rezervasiya çıxarmaq mümkün olmadı.',
'reservations.import.removeItem': 'Sil',
'reservations.import.needsReview': 'Yoxlayın',
'reservations.import.tryAi': 'AI ilə təhlil et',
'reservations.import.aiParsing': 'AI ilə təhlil edilir…',
'reservations.import.confirm': '{count} rezervasiyanı idxal et',
'reservations.import.confirm.one': '{count} rezervasiyanı idxal et',
'reservations.import.back': 'Geri',
'reservations.import.success': '{count} rezervasiya idxal edildi',
'reservations.import.success.one': '{count} rezervasiya idxal edildi',
'reservations.import.partialFailure': '{created} idxal edildi, {failed} uğursuz oldu',
'reservations.import.error': 'Təhlil uğursuz oldu. Faylın etibarlı rezervasiya təsdiqi olduğuna əmin olun.',
'reservations.import.unavailable': 'Rezervasiyaların idxalı bu serverdə əlçatan deyil.',
@@ -198,7 +201,9 @@ const reservations: TranslationStrings = {
'AirTrail-dən idxal edilib. Tranzit gözləməsi olan çoxseqmentli uçuşun AirTrail-də sinxronlaşdırıla biləcək vahid uçuş qeydi olmadığından, bu birdəfəlik idxal kimi qalır.',
'reservations.airtrail.loadError': 'AirTrail uçuşlarınızı yükləmək mümkün olmadı.',
'reservations.airtrail.imported': '{count} uçuş idxal edildi',
'reservations.airtrail.imported.one': '{count} uçuş idxal edildi',
'reservations.airtrail.skippedDuplicate': '{count} uçuş artıq bu səyahətdədir və buraxıldı',
'reservations.airtrail.skippedDuplicate.one': '{count} uçuş artıq bu səyahətdədir və buraxıldı',
'reservations.airtrail.nothingImported': 'İdxal ediləcək heç nə yoxdur.',
'reservations.airtrail.importError': 'İdxal uğursuz oldu. Yenidən cəhd edin.',
'reservations.airtrail.undo': 'AirTrail-dən idxal et',
@@ -263,6 +268,7 @@ const reservations: TranslationStrings = {
'reservations.sort.aToZ': 'A-dan Z-yə',
'reservations.sort.zToA': 'Z-dən A-ya',
'reservations.timeline.dayCount': '{count} gün',
'reservations.timeline.dayCount.one': '{count} gün',
'reservations.timeline.zoom': 'Miqyas',
'reservations.timeline.trip': 'Səyahət',
'reservations.timeline.day': 'Gün',
+13 -2
View File
@@ -68,6 +68,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.looking': 'Axtarılanlar',
'roadtrip.poi.searchingHint': 'Marşrutda axtarılır…',
'roadtrip.poi.found': 'Yolboyu {count} nəticə',
'roadtrip.poi.found.one': 'Yolboyu {count} nəticə',
'roadtrip.poi.fuel': 'Yanacaq',
'roadtrip.poi.charging': 'Şarj',
'roadtrip.stop.offRoad': 'Yoldan {distance} uzaqda',
@@ -103,6 +104,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.limit.echoOver': '{days} gündən {over} günü limitinizi keçir.',
'roadtrip.limit.echoNone': 'Bütün {days} gün limitləriniz daxilindədir.',
'roadtrip.limit.echoDry': 'Çatmaq mümkün olan dayanacağı olmayan {count} marşrut hissəsi.',
'roadtrip.limit.echoDry.one': 'Çatmaq mümkün olan dayanacağı olmayan {count} marşrut hissəsi.',
'roadtrip.limit.echoEmpty': 'Bu tənzimləmələrin təsirini görmək üçün avtomobil səyahəti açın.',
'roadtrip.limit.specToggle': 'Avtomobil göstəricilərindən hesabla',
'roadtrip.limit.hint': 'Yalnız sürmə vaxtıdır, qalma və gecələmə hissələri daxil deyil.',
@@ -124,6 +126,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.avoid.hint': 'Mümkün olduqda yayınır; istisnalar işarələnir.',
'roadtrip.avoid.unavailable': 'Marşrut provayderiniz yayınma seçimlərini dəstəkləmir.',
'roadtrip.avoid.badge': '{count} yayınma',
'roadtrip.avoid.badge.one': '{count} yayınma',
'roadtrip.avoid.missed': '{classes} qaçılmazdır',
'roadtrip.avoid.missedHint':
'Bu gün üçün həmin yol növündən yayınan marşrut yoxdur, buna görə yol ondan istifadə edir. Digər günlər mümkün olan yollardan yayınmağa davam edir.',
@@ -171,11 +174,14 @@ const roadtrip: TranslationStrings = {
'roadtrip.track.action': 'Bu izi izlə',
'roadtrip.track.working': 'Yol izə uyğunlaşdırılır, {round}-ci mərhələ',
'roadtrip.track.done': '{count} ara nöqtə yerləşdirildi. Yol izdən maksimum {distance} uzaqlaşır.',
'roadtrip.track.done.one': '{count} ara nöqtə yerləşdirildi. Yol izdən maksimum {distance} uzaqlaşır.',
'roadtrip.track.capped': '{count} ara nöqtə yerləşdirildi. Ən böyük yayınma {distance} olaraq qalır.',
'roadtrip.track.capped.one': '{count} ara nöqtə yerləşdirildi. Ən böyük yayınma {distance} olaraq qalır.',
'roadtrip.track.already': 'Yol artıq bu izi izləyir.',
'roadtrip.track.errorRoute': 'Marşrut xidməti cavab vermədi.',
'roadtrip.track.errorSave': 'Ara nöqtələri yadda saxlamaq mümkün olmadı.',
'roadtrip.track.clear': '{count} ara nöqtəni sil',
'roadtrip.track.clear.one': '{count} ara nöqtəni sil',
'roadtrip.track.current': 'Hazırda {name} izi izlənilir',
'roadtrip.poi.rest': 'İstirahət zonası',
'roadtrip.poi.campsite': 'Düşərgə',
@@ -186,11 +192,15 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.noMatch': 'Yolboyu “{name}” ilə uyğun heç nə yoxdur.',
'roadtrip.poi.noneMatchFilters': 'Yolboyu bu filtrlərə uyğun heç nə yoxdur.',
'roadtrip.poi.foundFiltered': 'Yolboyu {total} nəticədən {count}',
'roadtrip.poi.truncated': '{count} marşrut hissəsində bir cavaba sığmayacaq qədər nəticə var — qalanlarını görmək üçün axtarış dəhlizini daraldın.',
'roadtrip.poi.truncated':
'{count} marşrut hissəsində bir cavaba sığmayacaq qədər nəticə var. Qalanlarını görmək üçün axtarış dəhlizini daraldın.',
'roadtrip.poi.truncated.one':
'{count} marşrut hissəsində bir cavaba sığmayacaq qədər nəticə var. Qalanlarını görmək üçün axtarış dəhlizini daraldın.',
'roadtrip.poi.search': 'Axtar',
'roadtrip.poi.searching': '{total} hissədən {done} axtarılır',
'roadtrip.poi.capped': 'Marşrut uzundur — yalnız ilk hissə axtarıldı.',
'roadtrip.poi.partial': '{count} marşrut hissəsində axtarış aparmaq mümkün olmadı — məkan axtarışı cavab vermədi.',
'roadtrip.poi.partial': '{count} marşrut hissəsində axtarış aparmaq mümkün olmadı. Məkan axtarışı cavab vermədi.',
'roadtrip.poi.partial.one': '{count} marşrut hissəsində axtarış aparmaq mümkün olmadı. Məkan axtarışı cavab vermədi.',
'roadtrip.poi.failed': 'Məkan axtarışı hazırda cavab vermir.',
'roadtrip.poi.empty': 'Ehtiyacınız olan növləri seçib axtarın.',
'roadtrip.poi.add': 'Əlavə et',
@@ -236,6 +246,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.quietDay.one': 'Hələlik yalnız {name} var — buraya dayanacaq əlavə edin',
'roadtrip.leg.driveText': '{time} ərzində {distance}',
'roadtrip.day.stopCount': '{count} dayanacaq',
'roadtrip.day.stopCount.one': '{count} dayanacaq',
'roadtrip.day.fold': 'Yığ',
'roadtrip.day.folded': 'Yığılıb',
'roadtrip.stop.stayShort': 'Qalma',
+3 -2
View File
@@ -493,8 +493,8 @@ const settings: TranslationStrings = {
'settings.airtrail.toast.saveError':
'Bağlantını yadda saxlamaq mümkün olmadı',
'settings.airtrail.test.button': 'Bağlantını yoxla',
'settings.airtrail.test.success':
'Qoşuldu — {count} uçuş tapıldı',
'settings.airtrail.test.success': 'Qoşuldu. {count} uçuş tapıldı',
'settings.airtrail.test.success.one': 'Qoşuldu. {count} uçuş tapıldı',
'settings.airtrail.test.failed': 'Bağlantı uğursuz oldu',
'settings.aiParsing.title': 'AI ilə təhlil',
@@ -659,6 +659,7 @@ const settings: TranslationStrings = {
'settings.offline.notice.stored':
'Bu cihazda {count} səyahət saxlanıldı',
'settings.offline.notice.stored.one': 'Bu cihazda {count} səyahət saxlanıldı',
'settings.offline.notice.nothing':
'Saxlanılacaq heç nə yoxdur. Saxlamaq istədiyiniz səyahətləri aktivləşdirin.',
'settings.offline.notice.busy':
+1
View File
@@ -14,6 +14,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Çat',
'shared.days': 'gün',
'shared.places': 'məkan',
'shared.places.one': 'məkan',
'shared.unplanned': 'Hələ planlaşdırılmayıb',
'shared.other': 'Digər',
'shared.totalBudget': 'Ümumi xərclər',
+2 -1
View File
@@ -127,7 +127,8 @@ const storage: TranslationStrings = {
'storage.sync.error': 'Sinxronlaşdırma uğursuz oldu: {error}',
'storage.sync.prompt': 'Mövcud obyektlərin replikası hələ yaradılmayıb — indi sinxronlaşdırılsın?',
'storage.sync.dismiss': 'Bağla',
'storage.usage.line': '{objects} obyekt · {size}',
'storage.usage.line': '{count} obyekt · {size}',
'storage.usage.line.one': '{count} obyekt · {size}',
'storage.usage.computed': 'İstifadə {age} hesablanıb',
'storage.usage.never': 'İstifadə hələ hesablanmayıb',
'storage.usage.refresh': 'Yenilə',
+4
View File
@@ -36,7 +36,9 @@ const trip: TranslationStrings = {
'trip.confirm.deletePlace': 'Bu məkanı silmək istədiyinizə əminsiniz?',
'trip.confirm.deletePlaces': '{count} məkan silinsin?',
'trip.confirm.deletePlaces.one': '{count} məkan silinsin?',
'trip.toast.placesDeleted': '{count} məkan silindi',
'trip.toast.placesDeleted.one': '{count} məkan silindi',
'trip.invite.linkTitle': 'Səyahət dəvət linki',
'trip.invite.linkHint':
@@ -77,8 +79,10 @@ const trip: TranslationStrings = {
'Uyğun bağlantı tapılmadı. Başqa vaxt və ya filtrlər seçin.',
'transit.direct': 'Birbaşa',
'transit.transfers': '{count} dəyişmə',
'transit.transfers.one': '{count} dəyişmə',
'transit.min': '{count} dəq.',
'transit.stops': '{count} dayanacaq',
'transit.stops.one': '{count} dayanacaq',
'transit.walkTo': '{name} istiqamətinə piyada gedin',
'transit.platform': 'Platforma {track}',
'transit.adding': 'Əlavə edilir…',
+11 -2
View File
@@ -23,10 +23,14 @@ const admin: TranslationStrings = {
'admin.tabs.categories': 'Categorias',
'admin.tabs.backup': 'Backup',
'admin.stats.users': 'Usuários',
'admin.stats.users.one': 'Usuário',
'admin.stats.trips': 'Viagens',
'admin.stats.trips.one': 'Viagem',
'admin.stats.places': 'Lugares',
'admin.stats.places.one': 'Lugar',
'admin.stats.photos': 'Fotos',
'admin.stats.files': 'Arquivos',
'admin.stats.files.one': 'Arquivo',
'admin.table.user': 'Usuário',
'admin.table.email': 'E-mail',
'admin.table.role': 'Função',
@@ -221,7 +225,9 @@ const admin: TranslationStrings = {
'admin.packingTemplates.namePlaceholder': 'Nome do modelo (ex.: Praia)',
'admin.packingTemplates.empty': 'Nenhum modelo criado ainda',
'admin.packingTemplates.items': 'itens',
'admin.packingTemplates.items.one': 'item',
'admin.packingTemplates.categories': 'categorias',
'admin.packingTemplates.categories.one': 'categoria',
'admin.packingTemplates.itemName': 'Nome do item',
'admin.packingTemplates.itemCategory': 'Categoria',
'admin.packingTemplates.categoryName': 'Nome da categoria (ex.: Roupas)',
@@ -270,7 +276,8 @@ const admin: TranslationStrings = {
'Este plugin não usa hosts fornecidos pelo operador. Seus hosts permitidos são fixos no manifesto.',
'admin.plugins.allowedHosts.restartNote': 'Salvar reinicia o plugin para que ele use a nova lista.',
'admin.plugins.allowedHosts.add': 'Adicionar host permitido',
'admin.plugins.allowedHosts.count': '{n} host(s) permitido(s)',
'admin.plugins.allowedHosts.count': '{n} hosts permitidos',
'admin.plugins.allowedHosts.count.one': '{n} host permitido',
'admin.plugins.operatorEgressPill': '+ hosts que você adicionar',
'admin.plugins.operatorEgressHint':
'Este plugin fala com um serviço que só você pode nomear (um servidor auto-hospedado). Após instalar, adicione os hosts que ele pode alcançar em ⋯ → Hosts permitidos. Nenhum outro.',
@@ -499,6 +506,7 @@ const admin: TranslationStrings = {
'admin.plugins.sortUpdates': 'Atualizações primeiro',
'admin.plugins.sortDownloads': 'Mais baixados',
'admin.plugins.updatesAvailable': '{count} atualizações disponíveis para seus plugins.',
'admin.plugins.updatesAvailable.one': '{count} atualização disponível para seus plugins.',
'admin.plugins.newerNeedsTrek': 'v{version} disponível — requer TREK {range}',
'admin.plugins.versionsTitle': 'Versões',
'admin.plugins.versionPickerTitle': 'Alterar versão — {name}',
@@ -802,7 +810,8 @@ const admin: TranslationStrings = {
'admin.passkey.resetHint':
'Remove todas as passkeys deste usuário (ex.: em caso de perda do dispositivo). Ele ainda poderá entrar com a senha.',
'admin.passkey.resetConfirm': 'Remover todas as passkeys de {name}?',
'admin.passkey.resetDone': 'Removida(s) {count} passkey(s)',
'admin.passkey.resetDone': '{count} passkeys removidas',
'admin.passkey.resetDone.one': '{count} passkey removida',
'admin.defaultSettings.mapProvider': 'Motor de mapas',
'admin.defaultSettings.mapProviderHint':
'O mapa padrão para todos nesta instância. Cada usuário ainda pode substituí-lo nas próprias configurações.',
+8 -1
View File
@@ -3,8 +3,11 @@ import type { TranslationStrings } from '../types';
const atlas: TranslationStrings = {
'atlas.subtitle': 'Sua pegada de viagens pelo mundo',
'atlas.countries': 'Países',
'atlas.countries.one': 'País',
'atlas.trips': 'Viagens',
'atlas.trips.one': 'Viagem',
'atlas.places': 'Lugares',
'atlas.places.one': 'Lugar',
'atlas.placesShow': 'Mostrar os lugares deste país',
'atlas.placesSearch': 'Buscar lugares',
'atlas.placesNone': 'Nenhum lugar corresponde',
@@ -34,9 +37,12 @@ const atlas: TranslationStrings = {
'atlas.bucketEmpty': 'Sua lista de desejos está vazia',
'atlas.bucketEmptyHint': 'Adicione lugares que sonha em visitar',
'atlas.days': 'Dias',
'atlas.days.one': 'Dia',
'atlas.visitedCountries': 'Países visitados',
'atlas.cities': 'Cidades',
'atlas.cities.one': 'Cidade',
'atlas.regions': 'Regiões',
'atlas.regions.one': 'Região',
'atlas.noData': 'Ainda sem dados de viagem',
'atlas.noDataHint': 'Crie uma viagem e adicione lugares para ver o mapa mundial',
'atlas.nextTrip': 'Próxima viagem',
@@ -57,7 +63,6 @@ const atlas: TranslationStrings = {
'atlas.other': 'Outro',
'atlas.firstVisit': 'Primeira viagem',
'atlas.lastVisitLabel': 'Última viagem',
'atlas.tripPlural': 'Viagens',
'atlas.tripsLabel': 'Viagens',
'atlas.tripsLabel.one': 'Viagem',
'atlas.placesVisited': 'Lugares visitados',
@@ -66,5 +71,7 @@ const atlas: TranslationStrings = {
'atlas.showPlanned': 'Mostrar países planejados',
'atlas.plannedFor': 'Planejado para',
'atlas.antarctica': 'Antártida',
'atlas.regionPlacesLabel': 'lugares',
'atlas.regionPlacesLabel.one': 'lugar',
};
export default atlas;
+14 -3
View File
@@ -28,7 +28,8 @@ const budget: TranslationStrings = {
'budget.byCategory': 'Por categoria',
'budget.editTooltip': 'Clique para editar',
'budget.linkedToReservation': 'Vinculado a uma reserva — edite o nome por lá',
'budget.confirm.deleteCategory': 'Excluir a categoria "{name}" com {count} lançamento(s)?',
'budget.confirm.deleteCategory': 'Excluir a categoria "{name}" com {count} lançamentos?',
'budget.confirm.deleteCategory.one': 'Excluir a categoria "{name}" com {count} lançamento?',
'budget.deleteCategory': 'Excluir categoria',
'budget.perPerson': 'Por pessoa',
'budget.paid': 'Pago',
@@ -59,6 +60,7 @@ const budget: TranslationStrings = {
'costs.outstandingItems': 'despesas sem pagador',
'costs.expenses': 'Despesas',
'costs.entries': '{count} lançamentos',
'costs.entries.one': '{count} lançamento',
'costs.searchPlaceholder': 'Buscar despesas…',
'costs.filter.all': 'Todas',
'costs.filter.mine': 'Pagas por mim',
@@ -102,6 +104,7 @@ const budget: TranslationStrings = {
'costs.settleHistory': 'Histórico de acertos',
'costs.noSettlements': 'Nenhum pagamento acertado ainda.',
'costs.paymentsSettled': '{count} pagamentos acertados',
'costs.paymentsSettled.one': '{count} pagamento acertado',
'costs.paid': 'pago',
'costs.undo': 'Desfazer',
'costs.whatFor': 'Para que foi?',
@@ -123,7 +126,8 @@ const budget: TranslationStrings = {
'costs.payersUnbalanced': 'Os valores dos pagadores devem somar {amount}',
'costs.splitBetween': 'Dividir igualmente entre',
'costs.pickSomeone': 'Escolha pelo menos uma pessoa para dividir.',
'costs.splitSummary': 'Dividido entre {count} · {amount} cada',
'costs.splitSummary': 'Dividido em {count} partes · {amount} cada',
'costs.splitSummary.one': '{count} pessoa · {amount}',
'costs.cat.accommodation': 'Hospedagem',
'costs.cat.food': 'Comida e bebida',
'costs.cat.groceries': 'Mercado',
@@ -139,7 +143,9 @@ const budget: TranslationStrings = {
'costs.cat.parking': 'Estacionamento',
'costs.cat.other': 'Outros',
'costs.daysCount': '{count} dias',
'costs.daysCount.one': '{count} dia',
'costs.travelers': '{count} viajantes',
'costs.travelers.one': '{count} viajante',
'costs.liveRate': 'taxa ao vivo',
'costs.settleAll': 'Acertar tudo',
'costs.payment': 'Pagamento',
@@ -165,6 +171,7 @@ const budget: TranslationStrings = {
'costs.filter.allCategories': 'Todas as categorias',
'costs.filter.allDays': 'Todos os dias',
'costs.expensesCount': '{count} despesas',
'costs.expensesCount.one': '{count} despesa',
'costs.ticketItemName': 'Nome do item',
'costs.ticketSplitting': 'Dividindo entre:',
'costs.ticketAddItem': 'Adicionar item',
@@ -175,6 +182,7 @@ const budget: TranslationStrings = {
'costs.splitSumOver': 'Soma das partes: {sum} de {total} (sobram {diff})',
'costs.toggleSign': 'Alternar entre despesa e reembolso',
'costs.receipts': 'Comprovantes',
'costs.receipts.one': 'Comprovante',
'costs.receiptsTitle': 'Comprovantes e notas',
'costs.attachReceipt': 'Anexar comprovante / nota',
'costs.attach': 'Anexar',
@@ -193,6 +201,9 @@ const budget: TranslationStrings = {
'costs.noReceipts': 'Nenhum comprovante anexado',
'costs.deleteReceipt': 'Remover comprovante',
'costs.viewReceipt': 'Ver comprovante',
'costs.receiptLeftBehind': 'Falha ao salvar, e {count} recibos enviados ainda estão lá. Remova-os na aba Arquivos.',
'costs.receiptLeftBehind':
'Falha ao salvar, e {count} comprovantes enviados ainda estão lá. Remova-os na aba Arquivos.',
'costs.receiptLeftBehind.one':
'Falha ao salvar, e {count} comprovante enviado ainda está lá. Remova-o na aba Arquivos.',
};
export default budget;
+23 -1
View File
@@ -19,8 +19,11 @@ const collection: TranslationStrings = {
'collections.duplicateToListTitle': 'Duplicar {count} em outra lista',
'collections.noOtherLists': 'Nenhuma outra lista ainda',
'collections.movedCount': '{count} lugares movidos',
'collections.movedCount.one': '{count} lugar movido',
'collections.duplicatedCount': '{count} lugares duplicados',
'collections.duplicatedCount.one': '{count} lugar duplicado',
'collections.placeCount': '{count} lugares',
'collections.placeCount.one': '{count} lugar',
'collections.category': 'Categoria',
'collections.noCategory': 'Sem categoria',
'collections.editListTitle': 'Editar lista',
@@ -42,6 +45,7 @@ const collection: TranslationStrings = {
'collections.importPickTripHint': 'Escolha uma viagem e leve os lugares dela para {name}.',
'collections.importNoTrips': 'Nenhuma viagem ainda',
'collections.importPlacesCount': '{count} lugares',
'collections.importPlacesCount.one': '{count} lugar',
'collections.importSearchPlaces': 'Buscar lugares…',
'collections.importOnlyNew': 'Apenas novos',
'collections.importSelectAll': 'Selecionar tudo',
@@ -50,11 +54,14 @@ const collection: TranslationStrings = {
'collections.importUnscheduled': 'Sem dia',
'collections.importOnDay': 'Dia {count}',
'collections.importSelectedCount': '{count} selecionados',
'collections.importSelectedCount.one': '{count} selecionado',
'collections.importAction': 'Importar {count}',
'collections.importEmptyTrip': 'Esta viagem ainda não tem lugares',
'collections.importNothingNew': 'Tudo desta viagem já está nesta lista',
'collections.importDone': '{count} lugares adicionados',
'collections.importDone.one': '{count} lugar adicionado',
'collections.importDoneSkipped': '{count} já estavam na lista e ficaram como estavam',
'collections.importDoneSkipped.one': '{count} já estava na lista e ficou como estava',
'collections.importDoneClean': 'Agora estão todos em {name}',
'collections.sort.default': 'Padrão',
'collections.sort.nameAsc': 'Nome (A–Z)',
@@ -103,6 +110,7 @@ const collection: TranslationStrings = {
'collections.markVisitedNone': 'Nenhum desses lugares está salvo em uma lista',
'collections.markedVisited': 'Marcado como visitado',
'collections.markedVisitedTrip': '{count} lugares marcados como visitados',
'collections.markedVisitedTrip.one': '{count} lugar marcado como visitado',
'collections.copyToTrip': 'Copiar para viagem',
'collections.copyToTripTitle': 'Copiar para viagem',
@@ -114,7 +122,9 @@ const collection: TranslationStrings = {
'collections.alreadyInTrip': 'Já está nesta viagem',
'collections.copied': 'Copiado para a viagem',
'collections.copiedCount': '{count} lugares copiados',
'collections.copiedCount.one': '{count} lugar copiado',
'collections.skippedDuplicates': '{count} duplicados ignorados',
'collections.skippedDuplicates.one': '{count} duplicado ignorado',
'collections.copyNothing': 'Nada para copiar',
'collections.removeFromList': 'Remover da lista',
'collections.removeFromListConfirm': 'Remover este lugar da lista?',
@@ -128,6 +138,7 @@ const collection: TranslationStrings = {
'collections.search': 'Buscar lugares',
'collections.selectMode': 'Selecionar',
'collections.selectedCount': '{count} selecionados',
'collections.selectedCount.one': '{count} selecionado',
'collections.pickList': 'Salvar na lista',
'collections.pickListPlaceholder': 'Escolha uma lista',
@@ -159,14 +170,18 @@ const collection: TranslationStrings = {
'collections.file.intoHint': 'Os lugares que a lista já tem continuam como estão, assim como o nome e a cor. As etiquetas do arquivo são adicionadas.',
'collections.file.confirmInto': 'Adicionar à lista',
'collections.file.doneInto': '{count} lugares adicionados a {name}',
'collections.file.doneInto.one': '{count} lugar adicionado a {name}',
'collections.file.doneIntoDuplicates': '{count} adicionados a {name}, {duplicates} já estavam lá',
'collections.file.doneIntoNothing': 'Todos os lugares do arquivo já estão em {name}',
'collections.file.change': 'Trocar',
'collections.file.labelCount': '{count} etiquetas',
'collections.file.labelCount.one': '{count} etiqueta',
'collections.file.hint':
'Os lugares chegam como uma nova lista sua. Avaliações, membros e fotos enviadas ficam para trás.',
'collections.file.done': '{count} lugares importados',
'collections.file.doneSkipped': '{count} lugares importados, {skipped} ignorados',
'collections.file.done.one': '{count} lugar importado',
'collections.file.doneSkipped': '{count} lugares importados, ignorados: {skipped}',
'collections.file.doneSkipped.one': '{count} lugar importado, ignorados: {skipped}',
'collections.file.errorTooLarge': 'Esse arquivo é grande demais para ser uma lista.',
'collections.file.errorUnreadable': 'Não foi possível ler esse arquivo.',
'collections.file.errorNotACollection': 'Esse não é um arquivo de lista do TREK.',
@@ -174,12 +189,16 @@ const collection: TranslationStrings = {
'collections.file.formatTrekHint': 'Para outro TREK, com etiquetas e status',
'collections.file.formatGpxHint': 'Pontos de referência para OsmAnd, Organic Maps, Garmin e outros apps de mapa',
'collections.file.gpxOmitted': '{count} lugares não têm coordenadas e ficaram fora do arquivo GPX',
'collections.file.gpxOmitted.one': '{count} lugar não tem coordenadas e ficou fora do arquivo GPX',
'collections.file.gpxNothing':
'Nenhum desses lugares tem coordenadas, então não há nada para colocar em um arquivo GPX.',
'collections.file.reading': 'Lendo o arquivo…',
'collections.file.gpxSkipped': '{count} pontos de referência sem coordenadas utilizáveis ficam de fora.',
'collections.file.gpxSkipped.one': '{count} ponto de referência sem coordenadas utilizáveis fica de fora.',
'collections.file.gpxTrack':
'Este arquivo também tem {count} pontos de trilha. Trilhas não são importadas, apenas pontos de referência.',
'collections.file.gpxTrack.one':
'Este arquivo também tem {count} ponto de trilha. Trilhas não são importadas, apenas pontos de referência.',
'collections.file.gpxEmpty': 'Este arquivo GPX não tem pontos de referência, então não há nada para importar.',
'collections.file.errorNotGpx': 'Esse não é um arquivo GPX.',
'collections.file.errorTooManyPlaces':
@@ -219,6 +238,7 @@ const collection: TranslationStrings = {
'collections.widget.title': 'Coleções',
'collections.widget.empty': 'Nenhum lugar salvo ainda',
'collections.widget.savedCount': '{count} salvos',
'collections.widget.savedCount.one': '{count} salvo',
'collections.labels.title': 'Rótulos',
'collections.labels.manage': 'Gerenciar rótulos',
'collections.labels.add': 'Adicionar rótulo',
@@ -226,7 +246,9 @@ const collection: TranslationStrings = {
'collections.labels.namePlaceholder': 'ex.: Berlin',
'collections.labels.assign': 'Atribuir rótulo',
'collections.labels.assignN': 'Adicionar rótulos a {count} lugares',
'collections.labels.assignN.one': 'Adicionar rótulos a {count} lugar',
'collections.labels.assignedCount': '{count} lugares rotulados',
'collections.labels.assignedCount.one': '{count} lugar rotulado',
'collections.labels.empty': 'Nenhum rótulo ainda',
'collections.labels.emptyHint': 'Crie um rótulo primeiro para agrupar lugares nesta lista.',
};
+10 -9
View File
@@ -67,14 +67,15 @@ const common: TranslationStrings = {
'common.datepicker.typeDate': 'Type a date', // en-fallback
'common.datepicker.dialog': 'Date picker', // en-fallback
'common.datepicker.clearDate': 'Clear date', // en-fallback
'common.errorTitle': 'Un dra bennak a zo aet a-dreuz',
'common.errorBody': 'Al lodenn-mañ eus an arload n\'a ket en-dro ken. Hoc\'h roadennoù a zo diarvar.',
'common.errorPanelTitle': 'N\'eus ket bet gallet diskwel al lodenn-mañ',
'common.errorPanelBody': 'Peurrest ar bajenn a ya en-dro atav.',
'common.errorRetry': 'Klask en-dro',
'common.errorReload': 'Adkargañ ar bajenn',
'common.errorUpdateTitle': 'Un handelv nevez a zo hegerz',
'common.errorUpdateBody': 'TREK a zo bet hizivaet e-pad ma oa digor an ivinell-mañ. Adkargit evit kaout an handelv nevez.',
'common.errorPluginTitle': 'N\'eus ket bet gallet diskwel an enlugellad-mañ',
'common.errorTitle': 'Algo deu errado',
'common.errorBody': 'Esta parte do aplicativo parou de funcionar. Seus dados estão seguros.',
'common.errorPanelTitle': 'Não foi possível exibir esta seção',
'common.errorPanelBody': 'O restante da página continua funcionando.',
'common.errorRetry': 'Tentar novamente',
'common.errorReload': 'Recarregar página',
'common.errorUpdateTitle': 'Uma nova versão está disponível',
'common.errorUpdateBody':
'O TREK foi atualizado enquanto esta aba estava aberta. Recarregue para obter a nova versão.',
'common.errorPluginTitle': 'Não foi possível exibir este plugin',
};
export default common;
+12 -2
View File
@@ -3,11 +3,13 @@ import type { TranslationStrings } from '../types';
const dashboard: TranslationStrings = {
'dashboard.title': 'Minhas viagens',
'dashboard.subtitle.loading': 'Carregando viagens...',
'dashboard.subtitle.trips': '{count} viagens ({archived} arquivadas)',
'dashboard.subtitle.trips': '{count} viagens (arquivadas: {archived})',
'dashboard.subtitle.trips.one': '{count} viagem (arquivadas: {archived})',
'dashboard.subtitle.empty': 'Comece sua primeira viagem',
'dashboard.subtitle.activeOne': '{count} viagem ativa',
'dashboard.subtitle.activeMany': '{count} viagens ativas',
'dashboard.subtitle.archivedSuffix': ' · {count} arquivadas',
'dashboard.subtitle.archivedSuffix.one': ' · {count} arquivada',
'dashboard.newTrip': 'Nova viagem',
'dashboard.newTripSub': 'Planeje uma nova viagem do zero',
'dashboard.subscribeAllTrips': 'Assinar todas as viagens',
@@ -32,10 +34,13 @@ const dashboard: TranslationStrings = {
'dashboard.shared': 'Compartilhada',
'dashboard.sharedBy': 'Compartilhada por {name}',
'dashboard.days': 'Dias',
'dashboard.days.one': 'Dia',
'dashboard.places': 'Lugares',
'dashboard.places.one': 'Lugar',
'dashboard.pass.places': 'Lugares',
'dashboard.members': 'Parceiros de viagem',
'dashboard.card.buddies': 'Parceiros de viagem',
'dashboard.card.buddies.one': 'Parceiro',
'dashboard.card.buddies.one': 'Parceiro de viagem',
'dashboard.archive': 'Arquivar',
'dashboard.copyTrip': 'Copiar',
'dashboard.copySuffix': 'cópia',
@@ -50,6 +55,7 @@ const dashboard: TranslationStrings = {
'dashboard.status.tomorrow': 'Amanhã',
'dashboard.status.past': 'Passada',
'dashboard.status.daysLeft': 'Faltam {count} dias',
'dashboard.status.daysLeft.one': 'Falta {count} dia',
'dashboard.toast.loadError': 'Não foi possível carregar as viagens',
'dashboard.loadErrorBanner': 'Não foi possível conectar ao servidor. Suas viagens estão seguras — tente novamente.',
'dashboard.retry': 'Tentar novamente',
@@ -126,6 +132,7 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.liveNow': 'Ao vivo agora',
'dashboard.mobile.tripProgress': 'Progresso da viagem',
'dashboard.mobile.daysLeft': '{count} dias restantes',
'dashboard.mobile.daysLeft.one': '{count} dia restante',
'dashboard.mobile.places': 'Lugares',
'dashboard.mobile.buddies': 'Companheiros',
'dashboard.mobile.newTrip': 'Nova viagem',
@@ -143,7 +150,9 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.startsToday': 'Começa hoje',
'dashboard.mobile.tomorrow': 'Amanhã',
'dashboard.mobile.inDays': 'Em {count} dias',
'dashboard.mobile.inDays.one': 'Em {count} dia',
'dashboard.mobile.inMonths': 'Em {count} meses',
'dashboard.mobile.inMonths.one': 'Em {count} mês',
'dashboard.mobile.spotlightDayOf': 'Dia {day} de {total}',
'dashboard.mobile.spotlightDays': '{count} dias',
'dashboard.mobile.spotlightDays.one': '{count} dia',
@@ -172,6 +181,7 @@ const dashboard: TranslationStrings = {
'dashboard.atlas.ofTotal': 'de {total}',
'dashboard.atlas.tripsTotal': 'Total de viagens',
'dashboard.atlas.placesMapped': '{count} lugares mapeados',
'dashboard.atlas.placesMapped.one': '{count} lugar mapeado',
'dashboard.atlas.daysTraveled': 'Dias de viagem',
'dashboard.atlas.daysUnit': 'dias',
'dashboard.atlas.acrossAllTrips': 'em todas as viagens',
+11 -3
View File
@@ -17,6 +17,7 @@ const dawarich: TranslationStrings = {
'dawarich.syncEnabledHint': 'Desligado significa que o TREK só lê o Dawarich quando você pedir.',
'dawarich.test.button': 'Testar conexão',
'dawarich.test.success': 'Conectado. {count} estadias encontradas nos últimos 30 dias.',
'dawarich.test.success.one': 'Conectado. {count} estadia encontrada nos últimos 30 dias.',
'dawarich.test.failed': 'Não foi possível acessar o Dawarich.',
'dawarich.syncNow': 'Procurar agora',
'dawarich.connected': 'Conectado',
@@ -31,6 +32,7 @@ const dawarich: TranslationStrings = {
'dawarich.toast.saveError': 'Não foi possível salvar a conexão',
'dawarich.toast.disconnected': 'Dawarich desconectado',
'dawarich.toast.synced': '{count} novas estadias encontradas',
'dawarich.toast.synced.one': '{count} nova estadia encontrada',
'dawarich.toast.syncError': 'Não foi possível ler o Dawarich',
'dawarich.toast.syncRunning': 'Já há uma verificação em andamento',
'dawarich.toast.acceptError': 'Não foi possível adicionar isso',
@@ -82,6 +84,7 @@ const dawarich: TranslationStrings = {
'dawarich.suggestions.title': 'Do Dawarich',
'dawarich.suggestions.pending': '{count} esperando por você',
'dawarich.suggestions.pending.one': '{count} esperando por você',
'dawarich.suggestions.loading': 'Lendo o Dawarich…',
'dawarich.suggestions.notConnected': 'Conecte o Dawarich nas Configurações para ver suas estadias aqui.',
'dawarich.suggestions.unavailable': 'Não foi possível ler o Dawarich.',
@@ -144,7 +147,9 @@ const dawarich: TranslationStrings = {
'dawarich.bucket.alreadyVisited': 'Já riscado',
'dawarich.bucket.confirm': 'Riscar {count}',
'dawarich.bucket.confirmed': '{count} desejos riscados',
'dawarich.bucket.confirmed.one': '{count} desejo riscado',
'dawarich.bucket.skipped': '{count} entradas não têm coordenadas e não puderam ser conferidas.',
'dawarich.bucket.skipped.one': '{count} entrada não tem coordenadas e não pôde ser conferida.',
'dawarich.bucket.truncated': 'Só as primeiras entradas foram conferidas. Rode de novo para as demais.',
'dawarich.bucket.visitedFrom': 'Riscado a partir das suas gravações do Dawarich',
'dawarich.bucket.clearVisit': 'Desfazer',
@@ -157,9 +162,11 @@ const dawarich: TranslationStrings = {
'dawarich.atlas.loading': 'Lendo suas gravações…',
'dawarich.atlas.empty': 'Suas gravações não mostram países que o TREK ainda não tenha.',
'dawarich.atlas.cities': '{count} cidades',
'dawarich.atlas.citiesOne': '1 cidade',
'dawarich.atlas.cities.one': '{count} cidade',
'dawarich.atlas.accept': 'Adicionar {count} países',
'dawarich.atlas.accept.one': 'Adicionar {count} país',
'dawarich.atlas.accepted': '{count} países adicionados',
'dawarich.atlas.accepted.one': '{count} país adicionado',
'dawarich.atlas.unresolved': 'O TREK não conseguiu associar estes a um país: {names}.',
'dawarich.atlas.source': 'Do Dawarich',
'dawarich.atlas.range': 'Analisado de {from} a {to}',
@@ -170,13 +177,14 @@ const dawarich: TranslationStrings = {
'dawarich.atlas.tab.countries': 'Países',
'dawarich.atlas.window': 'Foram analisados os últimos 12 meses.',
'dawarich.selected': '{count} selecionados',
'dawarich.selected.one': '{count} selecionado',
'dawarich.again': 'Verificar de novo',
'dawarich.bucket.metersAway': 'a {meters} m',
'dawarich.bucket.kilometersAway': 'a {km} km',
'dawarich.bucket.rule': 'Um desejo conta como alcançado a até {meters} m e após {minutes} minutos no local.',
'dawarich.journey.dayStays.one': '1 parada do Dawarich',
'dawarich.journey.dayStays.other': '{count} paradas do Dawarich',
'dawarich.journey.dayStays.one': '{count} estadia do Dawarich',
'dawarich.journey.dayStays.other': '{count} estadias do Dawarich',
};
export default dawarich;
+1 -1
View File
@@ -70,7 +70,7 @@ const docsync: TranslationStrings = {
'docsync.state.local_deleted': 'Excluído no TREK',
'docsync.state.scope_drift': 'Saiu da pasta',
'docsync.conflict.resolve': "Resolver {count}",
'docsync.conflict.resolve': 'Resolver {count}',
'docsync.conflict.title': 'As duas cópias mudaram',
'docsync.conflict.keepTrek': 'Manter a versão do TREK',
+15 -3
View File
@@ -1,4 +1,5 @@
import type { NotificationLocale } from '../externalNotifications/types';
import { pluralForm } from '../plural';
const br: NotificationLocale = {
email: {
@@ -37,8 +38,14 @@ const br: NotificationLocale = {
body: `${p.actor} convidou você para compartilhar uma coleção. Abra o TREK para aceitar ou recusar.`,
}),
photos_shared: (p) => ({
title: `${p.count} fotos compartilhadas`,
body: `${p.actor} compartilhou ${p.count} foto(s) em "${p.trip}".`,
title: pluralForm(p.count, 'pt-BR', {
one: `${p.count} foto compartilhada`,
other: `${p.count} fotos compartilhadas`,
}),
body: pluralForm(p.count, 'pt-BR', {
one: `${p.actor} compartilhou ${p.count} foto em "${p.trip}".`,
other: `${p.actor} compartilhou ${p.count} fotos em "${p.trip}".`,
}),
}),
collab_message: (p) => ({
title: `Nova mensagem em "${p.trip}"`,
@@ -56,7 +63,12 @@ const br: NotificationLocale = {
title: 'Falha na réplica de armazenamento',
body:
`Falha ao gravar na réplica '${p.backend}': ${p.op} de ${p.key} — ${p.error}.` +
(p.suppressed !== '0' ? ` Mais ${p.suppressed} falha(s) foram suprimidas desde a última notificação.` : ''),
(p.suppressed !== '0'
? pluralForm(p.suppressed, 'pt-BR', {
one: ` Mais ${p.suppressed} falha foi suprimida desde a última notificação.`,
other: ` Mais ${p.suppressed} falhas foram suprimidas desde a última notificação.`,
})
: ''),
}),
synology_session_cleared: () => ({
title: 'Sessão Synology encerrada',
+3 -1
View File
@@ -10,12 +10,14 @@ const files: TranslationStrings = {
'files.title': 'Arquivos',
'files.pageTitle': 'Arquivos e documentos',
'files.subtitle': '{count} arquivos para {trip}',
'files.subtitle.one': '{count} arquivo para {trip}',
'files.download': 'Baixar',
'files.openError': 'Não foi possível abrir o arquivo',
'files.downloadPdf': 'Baixar PDF',
'files.count': '{count} arquivos',
'files.count.one': '{count} arquivo',
'files.uploaded': '{count} enviado(s)',
'files.uploaded': '{count} arquivos enviados',
'files.uploaded.one': '{count} arquivo enviado',
'files.uploadError': 'Falha no envio',
'files.uploadErrorType': 'Esse tipo de arquivo não é suportado',
'files.dropzone': 'Solte os arquivos aqui',
+4 -1
View File
@@ -15,9 +15,11 @@ const help: TranslationStrings = {
'help.center.onThisScreen': 'Nesta tela',
'help.center.screens': 'Telas',
'help.center.thisScreen': 'Esta tela',
'help.center.subScreens': 'Subtelas: {count}',
'help.center.subScreens': '{count} subtelas',
'help.center.subScreens.one': '{count} subtela',
'help.center.subScreensLabel': 'Subtelas',
'help.center.guidesCount': '{count} guias',
'help.center.guidesCount.one': '{count} guia',
'help.center.goToScreen': 'Ir para {screen}',
'help.center.overview': 'Visão geral',
'help.center.howTo': 'Como faço para…',
@@ -29,6 +31,7 @@ const help: TranslationStrings = {
'help.center.back': 'Voltar',
'help.center.close': 'Fechar ajuda',
'help.center.steps': '{count} passos',
'help.center.steps.one': '{count} passo',
'help.center.step': 'Passo {n}',
'help.center.stepsLabel': 'Passos',
'help.center.stepOf': 'Passo {n} de {total}',
+1
View File
@@ -7,6 +7,7 @@ const inspector: TranslationStrings = {
'inspector.showHours': 'Mostrar horário de funcionamento',
'inspector.files': 'Arquivos',
'inspector.filesCount': '{count} arquivos',
'inspector.filesCount.one': '{count} arquivo',
'inspector.removeFromDay': 'Remover do dia',
'inspector.remove': 'Remover',
'inspector.addToDay': 'Adicionar ao dia',
+15 -2
View File
@@ -60,6 +60,7 @@ const journey: TranslationStrings = {
'journey.frontpage.latestJourney': 'Última jornada',
'journey.frontpage.allJourneys': 'Todas as jornadas',
'journey.frontpage.journeys': 'jornadas',
'journey.frontpage.journeys.one': 'jornada',
'journey.frontpage.createNew': 'Criar uma nova jornada',
'journey.frontpage.createNewSub': 'Escolha viagens, escreva histórias, compartilhe suas aventuras',
'journey.frontpage.live': 'Ao vivo',
@@ -76,6 +77,7 @@ const journey: TranslationStrings = {
'journey.frontpage.trips': 'viagens',
'journey.frontpage.placesImported': 'lugares serão importados',
'journey.frontpage.places': 'lugares',
'journey.frontpage.places.one': 'lugar',
'journey.detail.backToJourney': 'Voltar à jornada',
'journey.detail.syncedWithTrips': 'Sincronizado com viagens',
'journey.detail.addEntry': 'Adicionar entrada',
@@ -83,6 +85,7 @@ const journey: TranslationStrings = {
'journey.detail.jumpToLast': 'Ir para a última entrada',
'journey.detail.dayJump': 'Ir para um dia',
'journey.detail.dayJumpCount': '{count} dias',
'journey.detail.dayJumpCount.one': '{count} dia',
'journey.detail.newEntry': 'Nova entrada',
'journey.detail.editEntry': 'Editar entrada',
'journey.detail.noEntries': 'Nenhuma entrada ainda',
@@ -96,6 +99,7 @@ const journey: TranslationStrings = {
'journey.detail.readMore': 'Ler mais',
'journey.detail.prosCons': 'Prós e contras',
'journey.detail.photos': 'fotos',
'journey.detail.photos.one': 'foto',
'journey.detail.day': 'Dia {number}',
'journey.detail.places': 'lugares',
'journey.stats.days': 'Dias',
@@ -108,6 +112,7 @@ const journey: TranslationStrings = {
'journey.verdict.lovedIt': 'Adorei',
'journey.verdict.couldBeBetter': 'Poderia ser melhor',
'journey.synced.places': 'lugares',
'journey.synced.places.one': 'lugar',
'journey.synced.synced': 'sincronizado',
'journey.editor.discardChangesConfirm': 'Você tem alterações não salvas. Descartá-las?',
'journey.editor.uploadFailed': 'Falha ao enviar fotos',
@@ -220,8 +225,10 @@ const journey: TranslationStrings = {
'journey.settings.failedToDelete': 'Falha ao excluir',
'journey.entries.deleteTitle': 'Excluir entrada',
'journey.photosUploaded': '{count} fotos enviadas',
'journey.photosUploaded.one': '{count} foto enviada',
'journey.photosUploadFailed': 'Algumas fotos não foram enviadas',
'journey.photosAdded': '{count} fotos adicionadas',
'journey.photosAdded.one': '{count} foto adicionada',
'journey.public.notFound': 'Não encontrado',
'journey.public.notFoundMessage': 'Esta jornada não existe ou o link expirou.',
'journey.public.readOnly': 'Somente leitura · Jornada pública',
@@ -287,11 +294,15 @@ const journey: TranslationStrings = {
'journey.studio.exportFinishing': 'Acabamento',
'journey.studio.exportMarks': 'Marcas de corte',
'journey.studio.exportMarksHint': 'Acrescenta {bleed} mm de sangria em cada borda e marca onde cortar',
'journey.studio.exportNote': '{sheets} folhas de {width} × {height} mm. O navegador transforma a visualização em PDF.',
'journey.studio.exportNote':
'{count} folhas de {width} × {height} mm. O navegador transforma a visualização de impressão em PDF.',
'journey.studio.exportNote.one':
'{count} folha de {width} × {height} mm. O navegador transforma a visualização de impressão em PDF.',
'journey.studio.exportOpen': 'Visualizar impressão',
'journey.studio.exportSave': 'Salvar como PDF',
'journey.studio.exportPreparing': 'Preparando',
'journey.studio.exportSheetCount': '{count} folhas',
'journey.studio.exportSheetCount.one': '{count} folha',
'journey.studio.undo': 'Undo', // en-fallback
'journey.studio.redo': 'Redo', // en-fallback
'journey.studio.zoomIn': 'Zoom in', // en-fallback
@@ -636,7 +647,8 @@ const journey: TranslationStrings = {
'journey.studio.uploadToGallery': 'As novas imagens vão para a galeria',
'journey.studio.uploading': 'Enviando {done} de {total}',
'journey.studio.dropFilesHere': 'Solte para adicionar as imagens',
'journey.studio.videosSkipped': '{count} vídeos ficaram de fora. Um livro contém imagens.',
'journey.studio.videosSkipped': '{count} vídeos ficaram de fora. Um livro só comporta imagens.',
'journey.studio.videosSkipped.one': '{count} vídeo ficou de fora. Um livro só comporta imagens.',
'journey.studio.fillPage': 'Preencher página',
'journey.studio.fillSpread': 'Preencher página dupla',
'journey.studio.fillHint':
@@ -663,6 +675,7 @@ const journey: TranslationStrings = {
'journey.suggestions.restore': 'Trazer de volta as sugestões descartadas',
'journey.suggestions.restoreCount': 'Sugestões descartadas ({count})',
'journey.suggestions.restored': '{count} sugestões voltaram',
'journey.suggestions.restored.one': '{count} sugestão voltou',
'journey.detail.addOnThisDay': 'Adicionar um registro neste dia',
'journey.detail.jumpToDay': 'Ir para {date}',
'journey.detail.searchPlaceholder': 'Buscar nesta viagem',
+6 -2
View File
@@ -29,7 +29,11 @@ const map: TranslationStrings = {
'map.overview.hide': 'Ocultar a viagem inteira',
'map.overview.total': 'Distância total',
'map.attribution': 'Créditos do mapa',
'map.overview.unrouted': 'Não foi possível calcular {count} troço(s), por isso as distâncias estão incompletas.',
'map.overview.dayUnrouted': 'Não foi possível calcular {count} troço(s) deste dia',
'map.overview.unrouted':
'Não foi possível calcular a rota de {count} trechos, por isso as distâncias estão incompletas.',
'map.overview.unrouted.one':
'Não foi possível calcular a rota de {count} trecho, por isso as distâncias estão incompletas.',
'map.overview.dayUnrouted': 'Não foi possível calcular a rota de {count} trechos deste dia',
'map.overview.dayUnrouted.one': 'Não foi possível calcular a rota de {count} trecho deste dia',
};
export default map;
+2
View File
@@ -17,6 +17,7 @@ const memories: TranslationStrings = {
'memories.reviewTitle': 'Revise suas fotos',
'memories.reviewHint': 'Clique nas fotos para excluí-las do compartilhamento.',
'memories.shareCount': 'Compartilhar {count} fotos',
'memories.shareCount.one': 'Compartilhar {count} foto',
'memories.providerUrl': 'URL do servidor',
'memories.providerApiKey': 'Chave de API',
'memories.providerUsername': 'Nome de usuário',
@@ -49,6 +50,7 @@ const memories: TranslationStrings = {
'memories.selectHint': 'Toque nas fotos para selecioná-las.',
'memories.selected': 'selecionadas',
'memories.addSelected': 'Adicionar {count} fotos',
'memories.addSelected.one': 'Adicionar {count} foto',
'memories.alreadyAdded': 'Já adicionada',
'memories.private': 'Privado',
'memories.stopSharing': 'Parar de compartilhar',
+4
View File
@@ -4,9 +4,13 @@ const mobileJourney: TranslationStrings = {
'mobileJourney.latestJourney': 'Última viagem',
'mobileJourney.otherJourneys': 'Outras viagens',
'mobileJourney.entriesCount': '{count} entradas',
'mobileJourney.entriesCount.one': '{count} entrada',
'mobileJourney.photosCount': '{count} fotos',
'mobileJourney.photosCount.one': '{count} foto',
'mobileJourney.placesCount': '{count} lugares',
'mobileJourney.placesCount.one': '{count} lugar',
'mobileJourney.daysCount': '{count} dias',
'mobileJourney.daysCount.one': '{count} dia',
'mobileJourney.time': 'Hora',
'mobileJourney.tags': 'Tags',
'mobileJourney.addTag': 'Adicionar tag',
+6 -1
View File
@@ -42,10 +42,13 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.resBadge': 'Reserva',
'mobileTrip.showOnMap': 'Mostrar no mapa',
'mobileTrip.statDocuments': '{count} arquivos',
'mobileTrip.statDocuments.one': '{count} arquivo',
'mobileTrip.statPeople': '{count} pessoas',
'mobileTrip.statPeople.one': '{count} pessoa',
'mobileTrip.stay': 'Estadia',
'mobileTrip.tapAgainToDelete': 'Toque novamente para excluir',
'mobileTrip.todoOpenCount': '{count} em aberto',
'mobileTrip.todoOpenCount.one': '{count} em aberto',
'mobileTrip.travel': 'Viagem',
'mobileTrip.upNext': 'A seguir',
'mobileTrip.viewDetails': 'Ver detalhes',
@@ -61,7 +64,9 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.rtStayScope':
'A estadia pertence ao local, então ela vale em todos os dias em que esta parada está planejada.',
'mobileTrip.rtStayLess': '{count} minutos a menos',
'mobileTrip.rtStayLess.one': '{count} minuto a menos',
'mobileTrip.rtStayMore': '{count} minutos a mais',
'mobileTrip.rtStayMore.one': '{count} minuto a mais',
'mobileTrip.rtNightDesktopOnly':
'Reservar um pernoite neste local funciona no planejador do computador. Aqui você só pode descartá-lo.',
'mobileTrip.rtReach': 'Até onde',
@@ -71,7 +76,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.rtNoneAhead': 'Nada na estrada à frente. Tente a etapa inteira.',
'mobileTrip.rtNoneOnStage': 'Nada desse tipo ao longo desta etapa.',
'mobileTrip.rtTruncated.one':
'1 trecho tinha mais do que cabe em uma resposta. Escolha menos tipos para ver o resto.',
'{count} trecho tinha mais do que cabe em uma resposta. Escolha menos tipos para ver o resto.',
'mobileTrip.rtTruncated.other':
'{count} trechos tinham mais do que cabe em uma resposta. Escolha menos tipos para ver o resto.',
'mobileTrip.rtNoDay': 'Nenhum dia escolhido',
+2
View File
@@ -6,7 +6,9 @@ const mobileVacay: TranslationStrings = {
'mobileVacay.prevMonth': 'Mês anterior',
'mobileVacay.nextMonth': 'Próximo mês',
'mobileVacay.usedCount': '{count} usados',
'mobileVacay.usedCount.one': '{count} usado',
'mobileVacay.leftCount': '{count} restantes',
'mobileVacay.leftCount.one': '{count} restante',
'mobileVacay.left': 'restantes',
'mobileVacay.modeCompany': 'Empresa',
'mobileVacay.decreaseAllowance': 'Diminuir cota',
+2 -1
View File
@@ -20,7 +20,8 @@ const notif: TranslationStrings = {
'notif.collection_invite.title': 'Convite para coleção',
'notif.collection_invite.text': '{actor} convidou você para uma coleção',
'notif.photos_shared.title': 'Fotos compartilhadas',
'notif.photos_shared.text': '{actor} compartilhou {count} foto(s) em {trip}',
'notif.photos_shared.text': '{actor} compartilhou {count} fotos em {trip}',
'notif.photos_shared.text.one': '{actor} compartilhou {count} foto em {trip}',
'notif.collab_message.title': 'Nova mensagem',
'notif.collab_message.text': '{actor} enviou uma mensagem em {trip}',
'notif.packing_tagged.title': 'Atribuição de bagagem',
+2
View File
@@ -29,6 +29,8 @@ const notifications: TranslationStrings = {
'notifications.test.adminText': '{actor} enviou uma notificação de teste para todos os admins.',
'notifications.test.tripTitle': '{actor} postou na sua viagem',
'notifications.test.tripText': 'Notificação de teste para a viagem "{trip}".',
'notifications.countLabel': 'notificações',
'notifications.countLabel.one': 'notificação',
'notifications.versionAvailable.title': 'Atualização disponível',
'notifications.versionAvailable.text': 'TREK {version} já está disponível.',
'notifications.versionAvailable.button': 'Ver detalhes',
+2 -2
View File
@@ -86,8 +86,8 @@ const oauth: TranslationStrings = {
'oauth.authorize.requestDescription': 'This application is requesting access to your TREK account.', // en-fallback
'oauth.authorize.trustNote': 'Only grant access to applications you trust. Your data stays on your server.', // en-fallback
'oauth.authorize.selectScope': 'Select at least one scope', // en-fallback
'oauth.authorize.approveScopes': 'Approve ({count} scopes)', // en-fallback
'oauth.authorize.approveScopes.one': 'Approve ({count} scope)', // en-fallback
'oauth.authorize.approveScopes': 'Aprovar ({count} escopos)',
'oauth.authorize.approveScopes.one': 'Aprovar ({count} escopo)',
'oauth.authorize.approveAccess': 'Approve Access', // en-fallback
'oauth.authorize.deny': 'Deny', // en-fallback
'oauth.authorize.choosePermissions': 'Choose which permissions to grant', // en-fallback
+5 -1
View File
@@ -31,6 +31,7 @@ const packing: TranslationStrings = {
'Uma lista em Markdown também funciona: um título define a categoria, "- [ ]" e "- [x]" viram itens e "3x" antes do nome define a quantidade.',
'packing.importAction': 'Importar {count}',
'packing.importSuccess': '{count} itens importados',
'packing.importSuccess.one': '{count} item importado',
'packing.importError': 'Falha na importação',
'packing.importEmpty': 'Nenhum item para importar',
'packing.progress': '{packed} de {total} na mala ({percent}%)',
@@ -61,6 +62,7 @@ const packing: TranslationStrings = {
'packing.applyTemplate': 'Aplicar modelo',
'packing.template': 'Modelo',
'packing.templateApplied': '{count} itens adicionados do modelo',
'packing.templateApplied.one': '{count} item adicionado do modelo',
'packing.templateError': 'Falha ao aplicar modelo',
'packing.bags': 'Malas',
'packing.noBag': 'Sem mala',
@@ -72,8 +74,10 @@ const packing: TranslationStrings = {
'packing.bagName': 'Nome da mala...',
'packing.addBag': 'Adicionar mala',
'packing.changeCategory': 'Mover para lista',
'packing.confirm.clearChecked': 'Remover {count} item(ns) marcado(s)?',
'packing.confirm.clearChecked': 'Remover {count} itens marcados?',
'packing.confirm.clearChecked.one': 'Remover {count} item marcado?',
'packing.confirm.deleteCat': 'Tem certeza de que deseja excluir a lista "{name}" com {count} itens?',
'packing.confirm.deleteCat.one': 'Tem certeza de que deseja excluir a lista "{name}" com {count} item?',
'packing.defaultCategory': 'Outros',
'packing.toast.saveError': 'Falha ao salvar',
'packing.toast.deleteError': 'Falha ao excluir',
+1
View File
@@ -3,6 +3,7 @@ import type { TranslationStrings } from '../types';
const photos: TranslationStrings = {
'photos.title': 'Fotos',
'photos.subtitle': '{count} fotos para {trip}',
'photos.subtitle.one': '{count} foto para {trip}',
'photos.dropHere': 'Arraste fotos aqui...',
'photos.dropHereActive': 'Arraste fotos aqui',
'photos.captionForAll': 'Legenda (para todos)',
+8 -1
View File
@@ -17,6 +17,7 @@ const places: TranslationStrings = {
'places.importFileError': 'Importação falhou',
'places.importAllSkipped': 'Todos os lugares já estavam na viagem.',
'places.gpxImported': '{count} lugares importados do GPX',
'places.gpxImported.one': '{count} lugar importado do GPX',
'places.gpxImportTypes': 'O que deseja importar?',
'places.gpxImportWaypoints': 'Pontos de caminho',
'places.gpxImportRoutes': 'Rotas',
@@ -26,11 +27,14 @@ const places: TranslationStrings = {
'places.kmlImportPoints': 'Pontos (Placemarks)',
'places.kmlImportPaths': 'Caminhos (LineStrings)',
'places.kmlImportNoneSelected': 'Selecione pelo menos um tipo.',
'places.selectionCount': '{count} selecionado(s)',
'places.selectionCount': '{count} selecionados',
'places.selectionCount.one': '{count} selecionado',
'places.deleteSelected': 'Excluir seleção',
'places.changeCategory': 'Alterar categoria',
'places.categoryChanged': '{count} lugares atualizados',
'places.categoryChanged.one': '{count} lugar atualizado',
'places.kmlKmzImported': '{count} lugares importados de KMZ/KML',
'places.kmlKmzImported.one': '{count} lugar importado de KMZ/KML',
'places.urlResolved': 'Lugar importado da URL',
'places.importList': 'Importar lista',
'places.kmlKmzSummaryValues': 'Placemarks: {total} • Importados: {created} • Ignorados: {skipped}',
@@ -39,9 +43,11 @@ const places: TranslationStrings = {
'places.googleListHint': 'Cole um link compartilhado de uma lista do Google Maps para importar todos os lugares.',
'places.googleDirHint': 'Um link de rotas também serve: suas paradas viram locais, na ordem do percurso.',
'places.googleListImported': '{count} lugares importados de "{list}"',
'places.googleListImported.one': '{count} lugar importado de "{list}"',
'places.googleListError': 'Falha ao importar lista do Google Maps',
'places.naverListHint': 'Cole um link compartilhado de uma lista do Naver Maps para importar todos os lugares.',
'places.naverListImported': '{count} lugares importados de "{list}"',
'places.naverListImported.one': '{count} lugar importado de "{list}"',
'places.naverListError': 'Falha ao importar lista do Naver Maps',
'places.viewDetails': 'Ver detalhes',
'places.assignToDay': 'Adicionar a qual dia?',
@@ -68,6 +74,7 @@ const places: TranslationStrings = {
'places.search': 'Buscar lugares...',
'places.allCategories': 'Todas as categorias',
'places.categoriesSelected': 'categorias',
'places.categoriesSelected.one': 'categoria',
'places.clearFilter': 'Limpar filtro',
'places.count': '{count} lugares',
'places.count.one': '{count} lugar',
+3
View File
@@ -21,10 +21,12 @@ const planner: TranslationStrings = {
'planner.days': 'Dias',
'planner.allPlaces': 'Todos os lugares',
'planner.totalPlaces': '{n} lugares no total',
'planner.totalPlaces.one': '{n} lugar no total',
'planner.noDaysPlanned': 'Nenhum dia planejado ainda',
'planner.editTrip': 'Editar viagem →',
'planner.placeOne': '1 lugar',
'planner.placeN': '{n} lugares',
'planner.placeN.one': '{n} lugar',
'planner.addNote': 'Adicionar nota',
'planner.noEntries': 'Nenhuma entrada neste dia',
'planner.addPlace': 'Adicionar lugar/atividade',
@@ -59,6 +61,7 @@ const planner: TranslationStrings = {
'planner.noDays': 'Nenhum dia ainda',
'planner.editTripToAddDays': 'Edite a viagem para adicionar dias',
'planner.dayCount': '{n} dias',
'planner.dayCount.one': '{n} dia',
'planner.clickToUnlock': 'Clique para desbloquear',
'planner.keepPosition': 'Manter posição durante a otimização da rota',
'planner.dayDetails': 'Detalhes do dia',
+11 -5
View File
@@ -139,15 +139,18 @@ const reservations: TranslationStrings = {
'reservations.import.acceptedFormats': 'Aceitos: EML, PDF, PKPass, HTML, TXT (máx. 10 MB cada, até 5 arquivos)',
'reservations.import.acceptedPhotos': 'As fotos (JPG, PNG, WEBP) são lidas pelo modelo de IA.',
'reservations.import.parsing': 'Analisando arquivos…',
'reservations.import.previewHeading': '{count} reserva(s) encontrada(s)',
'reservations.import.previewHeading': '{count} reservas encontradas',
'reservations.import.previewHeading.one': '{count} reserva encontrada',
'reservations.import.previewEmpty': 'Nenhuma reserva pôde ser extraída dos arquivos enviados.',
'reservations.import.removeItem': 'Remover',
'reservations.import.needsReview': 'Revisar',
'reservations.import.tryAi': 'Tentar leitura com IA',
'reservations.import.aiParsing': 'Lendo com IA…',
'reservations.import.confirm': 'Importar {count} reserva(s)',
'reservations.import.confirm': 'Importar {count} reservas',
'reservations.import.confirm.one': 'Importar {count} reserva',
'reservations.import.back': 'Voltar',
'reservations.import.success': '{count} reserva(s) importada(s)',
'reservations.import.success': '{count} reservas importadas',
'reservations.import.success.one': '{count} reserva importada',
'reservations.import.partialFailure': '{created} importada(s), {failed} falhou/falharam',
'reservations.import.error': 'Falha na análise. Verifique se o arquivo é uma confirmação de reserva válida.',
'reservations.import.unavailable': 'A importação de reservas não está disponível neste servidor.',
@@ -163,8 +166,10 @@ const reservations: TranslationStrings = {
'reservations.airtrail.layoverHint':
'Importado do AirTrail. Um voo de vários trechos com conexão não tem um único voo do AirTrail para sincronizar, então permanece como uma importação única.',
'reservations.airtrail.loadError': 'Não foi possível carregar seus voos do AirTrail.',
'reservations.airtrail.imported': '{count} voo(s) importado(s)',
'reservations.airtrail.skippedDuplicate': '{count} já nesta viagem, ignorado(s)',
'reservations.airtrail.imported': '{count} voos importados',
'reservations.airtrail.imported.one': '{count} voo importado',
'reservations.airtrail.skippedDuplicate': '{count} já estavam nesta viagem e foram ignorados',
'reservations.airtrail.skippedDuplicate.one': '{count} já estava nesta viagem e foi ignorado',
'reservations.airtrail.nothingImported': 'Nada para importar.',
'reservations.airtrail.importError': 'Falha na importação. Tente novamente.',
'reservations.airtrail.undo': 'Importar do AirTrail',
@@ -229,6 +234,7 @@ const reservations: TranslationStrings = {
'reservations.sort.aToZ': 'A a Z',
'reservations.sort.zToA': 'Z a A',
'reservations.timeline.dayCount': '{count} dias',
'reservations.timeline.dayCount.one': '{count} dia',
'reservations.timeline.zoom': 'Zoom',
'reservations.timeline.trip': 'Viagem',
'reservations.timeline.day': 'Dia',
+14 -3
View File
@@ -69,6 +69,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.looking': 'Procurando por',
'roadtrip.poi.searchingHint': 'Pesquisando a rota…',
'roadtrip.poi.found': '{count} no caminho',
'roadtrip.poi.found.one': '{count} no caminho',
'roadtrip.poi.fuel': 'Combustível',
'roadtrip.poi.charging': 'Carregamento',
'roadtrip.stop.offRoad': '{distance} da estrada',
@@ -104,6 +105,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.limit.echoOver': '{over} de {days} dias acima do seu limite.',
'roadtrip.limit.echoNone': 'Todos os {days} dias dentro dos limites.',
'roadtrip.limit.echoDry': '{count} trechos sem parada alcançável.',
'roadtrip.limit.echoDry.one': '{count} trecho sem parada alcançável.',
'roadtrip.limit.echoEmpty': 'Abra uma viagem para ver o efeito.',
'roadtrip.limit.specToggle': 'Calcular pelos dados do carro',
'roadtrip.limit.hint': 'Conta apenas o tempo de condução. Paradas e pernoites não estão incluídos.',
@@ -127,6 +129,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.avoid.unavailable':
'Indisponível: esta instância usa o próprio motor, que não consegue deixar de fora uma classe de via.',
'roadtrip.avoid.badge': '{count} evitados',
'roadtrip.avoid.badge.one': '{count} evitado',
'roadtrip.avoid.missed': '{classes} inevitável',
'roadtrip.avoid.missedHint':
'Este dia não tem rota que desvie, então o trajeto usa. Os outros dias continuam evitando o que dá.',
@@ -174,12 +177,16 @@ const roadtrip: TranslationStrings = {
'roadtrip.track.action': 'Seguir esta trilha',
'roadtrip.track.working': 'Ajustando o percurso à trilha, rodada {round}',
'roadtrip.track.done': '{count} pontos de passagem colocados. O percurso fica a menos de {distance} da trilha.',
'roadtrip.track.done.one': '{count} ponto de passagem colocado. O percurso fica a menos de {distance} da trilha.',
'roadtrip.track.capped':
'{count} pontos de passagem colocados. No ponto mais largo, o percurso fica a {distance} da trilha.',
'{count} pontos de passagem colocados. No ponto mais afastado, o percurso fica a {distance} da trilha.',
'roadtrip.track.capped.one':
'{count} ponto de passagem colocado. No ponto mais afastado, o percurso fica a {distance} da trilha.',
'roadtrip.track.already': 'O percurso já seguia esta trilha.',
'roadtrip.track.errorRoute': 'O serviço de rotas não respondeu.',
'roadtrip.track.errorSave': 'Não foi possível salvar os pontos de passagem.',
'roadtrip.track.clear': 'Remover {count} pontos de passagem',
'roadtrip.track.clear.one': 'Remover {count} ponto de passagem',
'roadtrip.track.current': 'Atualmente segue {name}',
'roadtrip.poi.rest': 'Área de descanso',
'roadtrip.poi.campsite': 'Camping',
@@ -191,11 +198,14 @@ const roadtrip: TranslationStrings = {
'roadtrip.poi.noneMatchFilters': 'Nada no caminho corresponde a esses filtros.',
'roadtrip.poi.foundFiltered': '{count} de {total} no trajeto',
'roadtrip.poi.truncated':
'Em {count} trechos havia mais do que cabe em uma resposta — estreite o corredor para ver o restante.',
'{count} trechos tinham mais do que cabe em uma resposta. Estreite o corredor para ver o restante.',
'roadtrip.poi.truncated.one':
'{count} trecho tinha mais do que cabe em uma resposta. Estreite o corredor para ver o restante.',
'roadtrip.poi.search': 'Buscar',
'roadtrip.poi.searching': 'Buscando {done} de {total}',
'roadtrip.poi.capped': 'A rota é longa — apenas o primeiro trecho foi pesquisado.',
'roadtrip.poi.partial': 'Não foi possível pesquisar {count} trechos — a busca de locais não respondeu.',
'roadtrip.poi.partial': 'Não foi possível pesquisar {count} trechos. A busca de locais não respondeu.',
'roadtrip.poi.partial.one': 'Não foi possível pesquisar {count} trecho. A busca de locais não respondeu.',
'roadtrip.poi.failed': 'A busca de locais não está respondendo agora.',
'roadtrip.poi.empty': 'Escolha o que precisa e pesquise.',
'roadtrip.poi.add': 'Adicionar',
@@ -241,6 +251,7 @@ const roadtrip: TranslationStrings = {
'roadtrip.quietDay.one': 'Até agora só {name} — solte uma parada aqui',
'roadtrip.leg.driveText': '{distance} em {time}',
'roadtrip.day.stopCount': '{count} paradas',
'roadtrip.day.stopCount.one': '{count} parada',
'roadtrip.day.fold': 'Recolher',
'roadtrip.day.folded': 'Recolhido',
'roadtrip.stop.stayShort': 'Parada',
+4 -2
View File
@@ -397,7 +397,8 @@ const settings: TranslationStrings = {
'settings.airtrail.toast.saved': 'Conexão com o AirTrail salva',
'settings.airtrail.toast.saveError': 'Não foi possível salvar a conexão',
'settings.airtrail.test.button': 'Testar conexão',
'settings.airtrail.test.success': 'Conectado — {count} voo(s) encontrado(s)',
'settings.airtrail.test.success': 'Conectado. {count} voos encontrados',
'settings.airtrail.test.success.one': 'Conectado. {count} voo encontrado',
'settings.airtrail.test.failed': 'Falha na conexão',
'settings.aiParsing.title': 'Análise por IA',
'settings.aiParsing.hint':
@@ -542,7 +543,8 @@ const settings: TranslationStrings = {
'settings.offline.storage.tripOn': 'Armazenada offline',
'settings.offline.storage.tripOff': 'Não armazenada',
'settings.offline.storage.tripFinished': 'Concluída. Só fica salva se você ativar.',
'settings.offline.notice.stored': '{count} viagem(ns) salva(s) neste dispositivo',
'settings.offline.notice.stored': '{count} viagens salvas neste dispositivo',
'settings.offline.notice.stored.one': '{count} viagem salva neste dispositivo',
'settings.offline.notice.nothing': 'Nada para salvar. Ative as viagens que você quer manter.',
'settings.offline.notice.busy': 'Já há uma sincronização em andamento. Tente de novo em instantes.',
'settings.offline.notice.offline': 'Sem conexão. Conecte-se para salvar viagens off-line.',
+1
View File
@@ -15,6 +15,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Chat',
'shared.days': 'dias',
'shared.places': 'lugares',
'shared.places.one': 'lugar',
'shared.unplanned': 'Ainda não planejado',
'shared.other': 'Outros',
'shared.totalBudget': 'Custos totais',
+2 -1
View File
@@ -111,7 +111,8 @@ const storage: TranslationStrings = {
'storage.sync.error': 'Falha na sincronização: {error}',
'storage.sync.prompt': 'Os objetos existentes ainda não foram replicados — sincronizar agora?',
'storage.sync.dismiss': 'Dispensar',
'storage.usage.line': '{objects} objetos · {size}',
'storage.usage.line': '{count} objetos · {size}',
'storage.usage.line.one': '{count} objeto · {size}',
'storage.usage.computed': 'Uso calculado {age}',
'storage.usage.never': 'Uso ainda não calculado',
'storage.usage.refresh': 'Atualizar',
+4
View File
@@ -28,7 +28,9 @@ const trip: TranslationStrings = {
'trip.toast.deleted': 'Excluído',
'trip.confirm.deletePlace': 'Tem certeza de que deseja excluir este lugar?',
'trip.confirm.deletePlaces': 'Excluir {count} lugares?',
'trip.confirm.deletePlaces.one': 'Excluir {count} lugar?',
'trip.toast.placesDeleted': '{count} lugares excluídos',
'trip.toast.placesDeleted.one': '{count} lugar excluído',
'trip.loadingPhotos': 'Carregando fotos dos lugares...',
'trip.loadingSteps.pack': 'Fazendo as malas...',
'trip.loadingSteps.road': 'Pé na estrada...',
@@ -69,8 +71,10 @@ const trip: TranslationStrings = {
'transit.noResults': 'Nenhuma conexão encontrada. Tente outro horário ou filtros.',
'transit.direct': 'Direto',
'transit.transfers': '{count} baldeações',
'transit.transfers.one': '{count} baldeação',
'transit.min': '{count} min',
'transit.stops': '{count} paradas',
'transit.stops.one': '{count} parada',
'transit.walkTo': 'Caminhar até {name}',
'transit.platform': 'Plataforma {track}',
'transit.adding': 'Adicionando…',
+120 -15
View File
@@ -24,10 +24,14 @@ const admin: TranslationStrings = {
'admin.tabs.backup': 'Còpia de seguretat',
'admin.tabs.audit': 'Auditoria',
'admin.stats.users': 'Usuaris',
'admin.stats.users.one': 'Usuari',
'admin.stats.trips': 'Viatges',
'admin.stats.trips.one': 'Viatge',
'admin.stats.places': 'Llocs',
'admin.stats.places.one': 'Lloc',
'admin.stats.photos': 'Fotos',
'admin.stats.files': 'Fitxers',
'admin.stats.files.one': 'Fitxer',
'admin.table.user': 'Usuari',
'admin.table.email': 'Correu',
'admin.table.role': 'Rol',
@@ -99,7 +103,7 @@ const admin: TranslationStrings = {
'admin.googleCaveat.body':
"TREK és programari lliure i aquí no som neutrals. En aquesta escala, les valoracions i les fotos de negocis corrents només existeixen a Google, i això és un monopoli. El camp hi és per manca d'alternativa, no perquè el recomanem. Llavors cada consulta va a Google.",
'admin.trekApi.tagline':
'L\'índex de llocs propi de TREK. Cercar sense clau de Google, sense quota i sense que ningú compti les teves cerques.',
"L'índex de llocs propi de TREK. Cercar sense clau de Google, sense quota i sense que ningú compti les teves cerques.",
'admin.trekApi.factPlaces':
'73,6 milions de llocs al món',
'admin.trekApi.factNoKey':
@@ -115,17 +119,16 @@ const admin: TranslationStrings = {
'admin.trekApi.fieldStableId':
'Identificador estable',
'admin.trekApi.includedNote':
'Les descripcions vénen del web del lloc mateix; els horaris, d\'OpenStreetMap allà on hi són.',
"Les descripcions vénen del web del lloc mateix; els horaris, d'OpenStreetMap allà on hi són.",
'admin.trekApi.notRatings':
'Valoracions',
'admin.trekApi.notPhotos':
'Fotos de negocis corrents',
'admin.trekApi.notIncludedNote':
'Cap font oberta no té ni les unes ni les altres, a cap preu. Per a aquestes dues una clau de Google continua sent l\'únic camí.',
"Cap font oberta no té ni les unes ni les altres, a cap preu. Per a aquestes dues una clau de Google continua sent l'únic camí.",
'admin.trekApi.sourcesLabel':
'Fonts',
'admin.trekApi.sourcesNote':
'Cada camp d\'una resposta diu de quina d\'elles ve.',
'admin.trekApi.sourcesNote': "Cada camp d'una resposta diu de quina d'elles ve.",
'admin.trekApi.included':
'Inclòs',
'admin.trekApi.notIncluded':
@@ -152,7 +155,7 @@ const admin: TranslationStrings = {
'admin.fileTypesFormat':
'Extensions separades per comes (p. ex. jpg,png,pdf,doc). Utilitza * per permetre tots els tipus.',
'admin.fileTypesSaved': 'Ajustos de tipus de fitxer desats',
'admin.googleOptions': 'Per a què s\'utilitza la clau',
'admin.googleOptions': "Per a què s'utilitza la clau",
'admin.googleOptionsSummary': '{on} de {total} actius',
'admin.placesPhotos.title': 'Fotos de Llocs',
'admin.placesPhotos.subtitle':
@@ -167,8 +170,10 @@ const admin: TranslationStrings = {
'admin.placesEnrich.subtitle':
"Mostra imatges i una descripció en afegir un lloc. Wikipedia i OpenStreetMap s'usen sempre; Google s'hi afegeix si Fotos de llocs o Detalls de llocs estan actius.",
'admin.placesGoogleOnly.title': 'Cercar només amb Google',
'admin.placesGoogleOnly.subtitle': 'Cada cerca i cada suggeriment van a Google Places. Desactivat, responen primer l\'índex de TREK i OpenStreetMap, i Google només es consulta si no troben res.',
'admin.placesGoogleOnly.missingKey': 'Cal una clau d\'API de Google Maps. Sense clau, la cerca fa servir l\'índex de TREK i OpenStreetMap, sigui com sigui aquest interruptor.',
'admin.placesGoogleOnly.subtitle':
"Cada cerca i cada suggeriment van a Google Places. Desactivat, responen primer l'índex de TREK i OpenStreetMap, i Google només es consulta si no troben res.",
'admin.placesGoogleOnly.missingKey':
"Cal una clau d'API de Google Maps. Sense clau, la cerca fa servir l'índex de TREK i OpenStreetMap, sigui com sigui aquest interruptor.",
'admin.placesGoogleOnly.otherProvider': 'Necessita Google com a proveïdor de llocs. Amb Amap o OpenStreetMap seleccionats, cap cerca va a Google, digui el que digui aquest interruptor.',
'admin.googleQuota.title': 'Límit diari de crides a Google',
'admin.googleQuota.subtitle': "Quan s'arriba al límit, TREK deixa de cridar Google fins l'endemà (UTC) i cerca amb OpenStreetMap. Buit vol dir sense límit.",
@@ -182,12 +187,14 @@ const admin: TranslationStrings = {
'admin.transitProvider.transitous': 'Transitous (gratuït)',
'admin.transitProvider.google': 'Google',
'admin.transitProvider.transitousHint': 'Fluxos GTFS de la comunitat. Gratuït i sense clau, amb la millor cobertura a Europa.',
'admin.transitProvider.googleHint': 'Utilitza la clau de Google anterior, per a regions sense dades a Transitous. Es factura per cerca: mentre no hi hagi clau s\'utilitza Transitous.',
'admin.transitProvider.noKeyWarning': 'Google està seleccionat, però no hi ha cap clau de Google configurada: la cerca de transport encara utilitza Transitous. Afegeix una clau a Claus d\'API a dalt.',
'admin.transitProvider.googleHint':
"Utilitza la clau de Google anterior, per a regions sense dades a Transitous. Es factura per cerca: mentre no hi hagi clau s'utilitza Transitous.",
'admin.transitProvider.noKeyWarning':
"Google està seleccionat, però no hi ha cap clau de Google configurada: la cerca de transport encara utilitza Transitous. Afegeix una clau a Claus d'API a dalt.",
'admin.transitProvider.personalKeyWarning': 'Només hi ha la teva pròpia clau de Google, de manera que la cerca dels altres membres continua recorrent a Transitous. Desa la clau a dalt com a administrador per aplicar-la a tota la instància.',
'admin.placeShadow.title': 'Registre de cerques de llocs',
'admin.placeShadow.subtitle':
'Desar quin resultat de cerca s\'ha triat, per poder avaluar més endavant un altre índex de llocs amb cerques reals. No surt res d\'aquesta instància i un administrador pot exportar o esborrar el registre quan vulgui.',
"Desar quin resultat de cerca s'ha triat, per poder avaluar més endavant un altre índex de llocs amb cerques reals. No surt res d'aquesta instància i un administrador pot exportar o esborrar el registre quan vulgui.",
'admin.bagTracking.title': "Seguiment d'equipatge",
'admin.bagTracking.subtitle': "Activar pes i assignació d'equipatge per a articles de la llista",
'admin.collab.chat.title': 'Xat',
@@ -213,7 +220,9 @@ const admin: TranslationStrings = {
'admin.packingTemplates.namePlaceholder': 'Nom de la plantilla (ex. Vacances a la platja)',
'admin.packingTemplates.empty': "Encara no s'ha creat cap plantilla",
'admin.packingTemplates.items': 'articles',
'admin.packingTemplates.items.one': 'article',
'admin.packingTemplates.categories': 'categories',
'admin.packingTemplates.categories.one': 'categoria',
'admin.packingTemplates.itemName': "Nom de l'article",
'admin.packingTemplates.itemCategory': 'Categoria',
'admin.packingTemplates.categoryName': 'Nom de categoria (ex. Roba)',
@@ -413,7 +422,8 @@ const admin: TranslationStrings = {
'admin.notifications.adminNotificationsHint':
"Configura quins canals entreguen notificacions d'administrador (ex. alertes de versió). El webhook s'activa automàticament si hi ha una URL de webhook d'administrador configurada.",
'admin.notificationDefaults.title': 'Valors per defecte dels usuaris',
'admin.notificationDefaults.hint': "Com comencen les notificacions de cada usuari. \"Desactivat\" l'usuari encara el pot activar; \"Bloquejat\" el desactiva per a tothom i apareix bloquejat a la seva configuració. S'aplica a qui no ha canviat la cel·la.",
'admin.notificationDefaults.hint':
'Com comencen les notificacions de cada usuari. "Desactivat" l\'usuari encara el pot activar; "Bloquejat" el desactiva per a tothom i apareix bloquejat a la seva configuració. S\'aplica a qui no ha canviat la cel·la.',
'admin.notificationDefaults.on': 'Activat',
'admin.notificationDefaults.off': 'Desactivat',
'admin.notificationDefaults.blocked': 'Bloquejat',
@@ -445,7 +455,8 @@ const admin: TranslationStrings = {
'admin.passkey.resetHint':
"Elimina totes les claus d'accés d'aquest usuari (p. ex. després de perdre un dispositiu). Encara podrà iniciar sessió amb la seva contrasenya.",
'admin.passkey.resetConfirm': "Vols eliminar totes les claus d'accés de {name}?",
'admin.passkey.resetDone': "S'han eliminat {count} clau(s) d'accés",
'admin.passkey.resetDone': "S'han eliminat {count} claus d'accés",
'admin.passkey.resetDone.one': "S'ha eliminat {count} clau d'accés",
'admin.defaultSettings.mapProvider': 'Motor de mapes',
'admin.defaultSettings.mapProviderHint':
'El mapa per defecte per a tothom en aquesta instància. Cada usuari pot canviar-lo en els seus propis ajustos.',
@@ -513,7 +524,8 @@ const admin: TranslationStrings = {
"Aquest connector no utilitza amfitrions proporcionats per l'operador. Els seus amfitrions permesos estan fixats al seu manifest.",
'admin.plugins.allowedHosts.restartNote': 'En desar es reinicia el connector perquè apliqui la nova llista.',
'admin.plugins.allowedHosts.add': 'Afegeix un amfitrió permès',
'admin.plugins.allowedHosts.count': '{n} amfitrió(ns) permès(os)',
'admin.plugins.allowedHosts.count': '{n} amfitrions permesos',
'admin.plugins.allowedHosts.count.one': '{n} amfitrió permès',
'admin.plugins.operatorEgressPill': '+ amfitrions que afegeixis',
'admin.plugins.operatorEgressHint':
"Aquest connector es comunica amb un servei que només tu pots indicar (un servidor autoallotjat). Després d'instal·lar-lo, afegeix els amfitrions als quals pot accedir a ⋯ → Amfitrions permesos. No pot accedir a cap altre.",
@@ -563,11 +575,82 @@ const admin: TranslationStrings = {
'admin.plugins.homepage': 'Lloc web',
'admin.plugins.requiresTrek': 'Requereix TREK {version}+',
'admin.plugins.reviewedOn': 'Verificat el {date}',
'admin.plugins.perm.db:own': 'Desar les seves pròpies dades en una base de dades aïllada',
'admin.plugins.perm.db:read:trips': "Llegir els viatges als quals té accés l'usuari actiu",
'admin.plugins.perm.db:read:users': 'Llegir informació bàsica del perfil (nom i avatar, mai les credencials)',
'admin.plugins.perm.db:read:costs':
"Llegir les despeses (partides del pressupost) a les quals té accés l'usuari actiu",
'admin.plugins.perm.db:read:packing': "Llegir les llistes d'equipatge dels viatges als quals té accés l'usuari actiu",
'admin.plugins.perm.db:write:packing':
"Crear, editar i eliminar articles d'equipatge als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.weather:read':
'Llegir la previsió meteorològica que el servidor té en memòria cau (per coordenades)',
'admin.plugins.perm.db:read:categories': 'Llegir la llista global de categories de llocs',
'admin.plugins.perm.db:read:tags': "Llegir les etiquetes pròpies de l'usuari actiu",
'admin.plugins.perm.db:write:tags': "Crear, editar i eliminar les etiquetes pròpies de l'usuari actiu",
'admin.plugins.perm.db:read:todos': "Llegir les tasques dels viatges als quals té accés l'usuari actiu",
'admin.plugins.perm.db:write:todos': "Crear, editar i eliminar tasques als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:atlas':
"Marcar països i regions com a visitats i gestionar la llista de desitjos de l'usuari actiu (cal el complement Atles)",
'admin.plugins.perm.db:write:vacay':
"Marcar i desmarcar dies de vacances i festius de l'empresa al pla vigent de l'usuari actiu (cal el complement Vacances)",
'admin.plugins.perm.db:write:journal':
"Crear, editar i eliminar entrades del diari, i adjuntar-hi fotos, a les travessies que l'usuari actiu pot editar (cal el complement Travessia)",
'admin.plugins.perm.db:write:collections':
"Crear i editar col·leccions i desar-hi llocs, amb el rol de col·lecció de l'usuari actiu (cal el complement Col·leccions)",
'admin.plugins.perm.db:write:files':
"Adjuntar fitxers als viatges que l'usuari actiu pot editar (màxim 10 MB, es rebutgen les extensions bloquejades) i gestionar-ne els enllaços",
'admin.plugins.perm.db:write:collab':
"Publicar notes, enquestes i missatges de xat als viatges que l'usuari actiu pot editar (cal el complement Col·laboració)",
'admin.plugins.perm.db:write:members':
"Afegir usuaris als viatges, cosa que els dona accés al viatge; només si l'usuari actiu té dret a gestionar-ne els membres",
'admin.plugins.perm.notify:send':
"Enviar una notificació (safata de la campana + correu/ntfy) a l'usuari actiu o a un viatge del qual forma part, mai a un destinatari qualsevol",
'admin.plugins.perm.ai:invoke':
"Utilitzar el proveïdor d'IA configurat per l'administrador (compleció de text + extracció de documents) en nom de l'usuari actiu; el connector no té mai cap clau",
'admin.plugins.perm.oauth:client':
'Connectar-se a un servei de tercers en nom teu amb OAuth gestionat pel servidor (el servidor guarda els tokens, el connector no els veu mai)',
'admin.plugins.perm.db:read:files': "Llegir els fitxers dels viatges als quals té accés l'usuari actiu",
'admin.plugins.perm.db:read:journal': "Llegir els diaris de viatge de l'usuari actiu (cal el complement Travessia)",
'admin.plugins.perm.db:read:atlas':
"Llegir els països i les regions que ha visitat l'usuari actiu (cal el complement Atles)",
'admin.plugins.perm.db:read:vacay': "Llegir el pla de vacances de l'usuari actiu (cal el complement Vacances)",
'admin.plugins.perm.db:read:daynotes': "Llegir les notes del dia dels viatges als quals té accés l'usuari actiu",
'admin.plugins.perm.db:read:collections':
"Llegir les col·leccions de llocs desats de l'usuari actiu (cal el complement Col·leccions)",
'admin.plugins.perm.db:write:costs':
"Crear despeses (partides del pressupost) als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:places': "Afegir, editar i eliminar llocs als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:days': "Afegir, editar i eliminar dies als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:itinerary':
"Assignar llocs als dies i treure'ls-en als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:trips':
"Editar els detalls del viatge (títol, dates, moneda…) als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:reservations':
"Crear, editar i eliminar reserves als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:accommodations':
"Crear, editar i eliminar allotjaments (blocs d'estada) als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:write:daynotes':
"Crear, editar i eliminar notes del dia als viatges que l'usuari actiu pot editar",
'admin.plugins.perm.db:meta':
"Adjuntar dades privades pròpies als viatges, llocs i dies als quals té accés l'usuari actiu",
'admin.plugins.perm.ws:broadcast:trip': 'Enviar actualitzacions en temps real als membres del viatge',
'admin.plugins.perm.ws:broadcast:user': 'Enviar actualitzacions en temps real a usuaris concrets',
'admin.plugins.perm.hook:photo-provider': 'Proporcionar fotos a la secció Fotos',
'admin.plugins.perm.hook:calendar-source': 'Proporcionar esdeveniments al calendari',
'admin.plugins.perm.hook:place-detail-provider':
'Aportar detalls addicionals (ressenyes, valoracions, enllaços) a un lloc',
'admin.plugins.perm.hook:map-layer-provider': 'Dibuixar rutes, corredors i zones al mapa del viatge',
'admin.plugins.perm.hook:search-provider':
"Respondre cerques de llocs des d'un índex propi, al costat dels resultats de TREK",
'admin.plugins.perm.hook:poi-category-provider':
'Afegir categories de llocs pròpies a «Explora llocs al mapa»; triar-ne una envia al connector la zona del mapa que estàs mirant',
'admin.plugins.perm.hook:trip-warning-provider':
'Generar avisos de validació en un viatge (es mostren al planificador)',
'admin.plugins.perm.hook:table-contributor':
'Afegir columnes i accions a les vistes del viatge (reserves, llocs, dies)',
'admin.plugins.perm.hook:map-marker-provider':
"Afegir marcadors al mapa del viatge (p. ex. per mostrar reserves o punts d'interès)",
'admin.plugins.perm.hook:route-provider':
'Oferir perfils de ruta amb què el planificador pot calcular els dies (p. ex. rutes per a cotxe elèctric amb parades de recàrrega)',
'admin.plugins.perm.hook:day-schedule-provider':
@@ -582,6 +665,27 @@ const admin: TranslationStrings = {
"Publicar eines que un assistent d'IA pot executar en nom teu (actua amb els permisos que concedeixes aquí al connector, no amb els seus)",
'admin.plugins.perm.geolocation:read':
"Consultar la teva ubicació en temps real mentre una de les seves vistes és oberta (el TREK la llegeix amb el permís d'ubicació d'aquest lloc, no amb un permís propi del connector)",
'admin.plugins.perm.hook:pdf-section-provider': "Afegir seccions de text a l'exportació en PDF del viatge",
'admin.plugins.perm.hook:atlas-layer-provider':
"Destacar països al mapa del món de l'Atles (p. ex. llistes de desitjos o avisos de viatge)",
'admin.plugins.perm.hook:journal-entry-provider':
'Aportar files addicionals (enllaços, estadístiques) a les entrades del diari',
'admin.plugins.perm.hook:trip-card-provider':
'Afegir petites insígnies (estat, recomptes) a les targetes de viatge del teu tauler',
'admin.plugins.perm.hook:notification-channel': 'Enviar les teves notificacions per un canal addicional',
'admin.plugins.perm.hook:user-data':
'Esborrar o exportar les dades que desa sobre un usuari (RGPD: eliminació del compte i sol·licituds de dades)',
'admin.plugins.perm.events:subscribe':
"Reaccionar als esdeveniments d'activitat del nucli (només el nom de l'esdeveniment i el viatge, mai el contingut)",
'admin.plugins.perm.jobs:run':
"Executar les tasques en segon pla que ha declarat segons una programació (sense context d'usuari: no pot llegir dades d'usuaris)",
'admin.plugins.perm.http:outbound': 'Fer peticions de sortida als amfitrions que ha declarat',
'admin.plugins.perm.db:read:collab':
"Llegir les notes, enquestes i missatges de xat dels viatges als quals té accés l'usuari actiu (cal el complement Col·laboració)",
'admin.plugins.perm.db:read:files:content':
"Llegir el contingut en bytes dels fitxers dels viatges als quals té accés l'usuari actiu",
'admin.plugins.perm.db:create:trips': "Crear viatges nous dels quals l'usuari actiu sigui el propietari",
'admin.plugins.perm.rates:read': 'Llegir els tipus de canvi de divises que el servidor té en memòria cau',
'admin.plugins.updateConsentTitle': 'Aquesta actualització necessita permisos nous',
'admin.plugins.updateConsentBody':
"{name} v{version} demana permisos que encara no has concedit. La versió nova està instal·lada, però roman desactivada fins que l'aprovis.",
@@ -654,13 +758,14 @@ const admin: TranslationStrings = {
'admin.plugins.sortUpdates': 'Primer les actualitzacions',
'admin.plugins.sortDownloads': 'Més baixades',
'admin.plugins.updatesAvailable': '{count} actualitzacions disponibles per als teus connectors.',
'admin.plugins.updatesAvailable.one': '{count} actualització disponible per als teus connectors.',
'admin.plugins.newerNeedsTrek': 'v{version} disponible — necessita TREK {range}',
'admin.plugins.versionsTitle': 'Versions',
'admin.plugins.versionPickerTitle': 'Canvia la versió — {name}',
'admin.plugins.versionSwitch': 'Canvia a {version}',
'admin.plugins.versionNeedsTrek': 'necessita TREK {range}',
'admin.plugins.changeVersion': 'Canvia la versió…',
'admin.plugins.noVersions': 'No s\'han trobat versions publicades al registre.',
'admin.plugins.noVersions': "No s'han trobat versions publicades al registre.",
'admin.plugins.downgradeTitle': 'Vols revertir aquest connector?',
'admin.plugins.downgradeBody': 'Canvi de v{from} a v{to}: les dades escrites per la versió més nova es mantenen, i la versió antiga pot no entendre-les.',
'admin.plugins.downgradeConfirm': 'Reverteix',
+10 -3
View File
@@ -3,15 +3,21 @@ import type { TranslationStrings } from '../types';
const atlas: TranslationStrings = {
'atlas.subtitle': 'La teva empremta viatgera pel món',
'atlas.countries': 'Països',
'atlas.countries.one': 'País',
'atlas.trips': 'Viatges',
'atlas.trips.one': 'Viatge',
'atlas.places': 'Llocs',
'atlas.places.one': 'Lloc',
'atlas.placesShow': 'Mostra els llocs d’aquest país',
'atlas.placesSearch': 'Cerca llocs',
'atlas.placesNone': 'Cap lloc coincideix',
'atlas.days': 'Dies',
'atlas.days.one': 'Dia',
'atlas.visitedCountries': 'Països visitats',
'atlas.cities': 'Ciutats',
'atlas.cities.one': 'Ciutat',
'atlas.regions': 'Regions',
'atlas.regions.one': 'Regió',
'atlas.noData': 'Encara no hi ha dades de viatge',
'atlas.noDataHint': 'Crea un viatge i afegeix llocs per veure el teu mapa del món',
'atlas.nextTrip': 'Proper viatge',
@@ -21,8 +27,8 @@ const atlas: TranslationStrings = {
'atlas.years': 'anys',
'atlas.yearsInRow': 'anys seguits',
'atlas.yearsInRow.one': 'any seguit',
'atlas.tripsIn': 'viatges a',
'atlas.tripsIn.one': 'viatge a',
'atlas.tripsIn': 'viatges el',
'atlas.tripsIn.one': 'viatge el',
'atlas.since': 'des de',
'atlas.europe': 'Europa',
'atlas.asia': 'Àsia',
@@ -33,7 +39,6 @@ const atlas: TranslationStrings = {
'atlas.other': 'Altres',
'atlas.firstVisit': 'Primer viatge',
'atlas.lastVisitLabel': 'Darrer viatge',
'atlas.tripPlural': 'Viatges',
'atlas.tripsLabel': 'Viatges',
'atlas.tripsLabel.one': 'Viatge',
'atlas.placesVisited': 'Llocs visitats',
@@ -66,5 +71,7 @@ const atlas: TranslationStrings = {
'atlas.showPlanned': 'Mostra els països planificats',
'atlas.plannedFor': 'Planificat per a',
'atlas.antarctica': 'Antàrtida',
'atlas.regionPlacesLabel': 'llocs',
'atlas.regionPlacesLabel.one': 'lloc',
};
export default atlas;
+12 -2
View File
@@ -27,6 +27,7 @@ const budget: TranslationStrings = {
'budget.editTooltip': 'Fes clic per editar',
'budget.linkedToReservation': 'Vinculat a una reserva — edita el nom allà',
'budget.confirm.deleteCategory': 'Segur que vols eliminar la categoria "{name}" amb {count} entrades?',
'budget.confirm.deleteCategory.one': 'Segur que vols eliminar la categoria "{name}" amb {count} entrada?',
'budget.deleteCategory': 'Elimina la categoria',
'budget.perPerson': 'Per persona',
'budget.paid': 'Pagat',
@@ -54,6 +55,7 @@ const budget: TranslationStrings = {
'costs.youPaid': 'Vas pagar tu',
'costs.expenses': 'Despeses',
'costs.entries': '{count} entrades',
'costs.entries.one': '{count} entrada',
'costs.searchPlaceholder': 'Cercar despeses…',
'costs.filter.all': 'Tot',
'costs.filter.mine': 'Pagat per mi',
@@ -61,6 +63,7 @@ const budget: TranslationStrings = {
'costs.filter.allCategories': 'Totes les categories',
'costs.filter.allDays': 'Tots els dies',
'costs.expensesCount': '{count} despeses',
'costs.expensesCount.one': '{count} despesa',
'costs.addExpense': 'Afegir despesa',
'costs.view.label': 'Vista',
'costs.view.list': 'Llista',
@@ -100,6 +103,7 @@ const budget: TranslationStrings = {
'costs.settleHistory': 'Historial de liquidacions',
'costs.noSettlements': "Encara no s'ha liquidat cap pagament.",
'costs.paymentsSettled': '{count} pagaments liquidats',
'costs.paymentsSettled.one': '{count} pagament liquidat',
'costs.paid': 'pagat',
'costs.undo': 'Desfer',
'costs.whatFor': 'Per a què ha estat?',
@@ -131,7 +135,8 @@ const budget: TranslationStrings = {
'costs.splitPercentOff': '{sum} % de 100 % repartit',
'costs.splitHint.ticket': 'Llista el que hi havia al rebut i marca qui ha pres cada article.',
'costs.pickSomeone': 'Tria almenys una persona amb qui dividir-ho.',
'costs.splitSummary': 'Dividit de {count} maneres · {amount} cadascú',
'costs.splitSummary': 'Dividit entre {count} persones · {amount} cadascú',
'costs.splitSummary.one': '{count} persona · {amount}',
'costs.cat.accommodation': 'Allotjament',
'costs.cat.food': 'Menjar i beguda',
'costs.cat.groceries': 'Supermercat',
@@ -147,7 +152,9 @@ const budget: TranslationStrings = {
'costs.cat.parking': 'Aparcament',
'costs.cat.other': 'Altres',
'costs.daysCount': '{count} dies',
'costs.daysCount.one': '{count} dia',
'costs.travelers': '{count} viatgers',
'costs.travelers.one': '{count} viatger',
'costs.liveRate': 'tipus de canvi actual',
'costs.settleAll': 'Liquidar-ho tot',
'costs.payment': 'Pagament',
@@ -175,6 +182,7 @@ const budget: TranslationStrings = {
'costs.splitSumOver': 'Suma de les parts: {sum} de {total} ({diff} de més)',
'costs.toggleSign': 'Alterna entre despesa i devolució',
'costs.receipts': 'Rebuts',
'costs.receipts.one': 'Rebut',
'costs.receiptsTitle': 'Rebuts i factures',
'costs.attachReceipt': 'Adjuntar rebut / factura',
'costs.attach': 'Adjuntar',
@@ -194,7 +202,9 @@ const budget: TranslationStrings = {
'costs.deleteReceipt': 'Eliminar rebut',
'costs.viewReceipt': 'Veure rebut',
'costs.receiptLeftBehind':
'No es pot desar i encara hi ha {count} rebuts pujats. Elimina aquests fitxers a la pestanya Fitxers.',
"No s'ha pogut desar i encara hi ha {count} rebuts pujats. Elimina'ls a la pestanya Fitxers.",
'costs.receiptLeftBehind.one':
"No s'ha pogut desar i encara hi ha {count} rebut pujat. Elimina'l a la pestanya Fitxers.",
};
export default budget;
+8 -8
View File
@@ -8,16 +8,16 @@ const collab: TranslationStrings = {
'collab.links.add': 'Afegeix un enllaç',
'collab.chat.imageRejected': "Només s'admeten imatges JPEG, PNG, GIF i WebP de fins a 10 MB",
'collab.links.cancel': 'Cancel·la',
'collab.links.save': 'Desa l\'enllaç',
'collab.links.titlePlaceholder': 'Títol de l\'enllaç',
'collab.links.save': "Desa l'enllaç",
'collab.links.titlePlaceholder': "Títol de l'enllaç",
'collab.links.urlPlaceholder': 'https://...',
'collab.links.empty': 'Encara no hi ha enllaços compartits',
'collab.links.pin': 'Fixa l\'enllaç',
'collab.links.unpin': 'Desfixa l\'enllaç',
'collab.links.delete': 'Suprimeix l\'enllaç',
'collab.links.edit': 'Edita l\'enllaç',
'collab.links.open': 'Obre l\'enllaç',
'collab.links.confirmDeleteTitle': 'Suprimir l\'enllaç?',
'collab.links.pin': "Fixa l'enllaç",
'collab.links.unpin': "Desfixa l'enllaç",
'collab.links.delete': "Suprimeix l'enllaç",
'collab.links.edit': "Edita l'enllaç",
'collab.links.open': "Obre l'enllaç",
'collab.links.confirmDeleteTitle': "Suprimir l'enllaç?",
'collab.links.confirmDeleteBody': 'Aquest enllaç se suprimirà permanentment.',
'collab.whatsNext.title': 'Què ve ara',
'collab.whatsNext.today': 'Avui',
+26 -3
View File
@@ -19,8 +19,11 @@ const collection: TranslationStrings = {
'collections.duplicateToListTitle': 'Duplica {count} a una altra llista',
'collections.noOtherLists': 'Encara no hi ha cap altra llista',
'collections.movedCount': "S'han mogut {count} llocs",
'collections.movedCount.one': "S'ha mogut {count} lloc",
'collections.duplicatedCount': "S'han duplicat {count} llocs",
'collections.duplicatedCount.one': "S'ha duplicat {count} lloc",
'collections.placeCount': '{count} llocs',
'collections.placeCount.one': '{count} lloc',
'collections.category': 'Categoria',
'collections.noCategory': 'Sense categoria',
'collections.editListTitle': 'Editar llista',
@@ -42,6 +45,7 @@ const collection: TranslationStrings = {
'collections.importPickTripHint': 'Tria un viatge i porta’n els llocs a {name}.',
'collections.importNoTrips': 'Encara no hi ha viatges',
'collections.importPlacesCount': '{count} llocs',
'collections.importPlacesCount.one': '{count} lloc',
'collections.importSearchPlaces': 'Cerca llocs…',
'collections.importOnlyNew': 'Només nous',
'collections.importSelectAll': 'Selecciona-ho tot',
@@ -50,11 +54,14 @@ const collection: TranslationStrings = {
'collections.importUnscheduled': 'Sense dia',
'collections.importOnDay': 'Dia {count}',
'collections.importSelectedCount': '{count} seleccionats',
'collections.importSelectedCount.one': '{count} seleccionat',
'collections.importAction': 'Importa {count}',
'collections.importEmptyTrip': 'Aquest viatge encara no té llocs',
'collections.importNothingNew': 'Tot aquest viatge ja és en aquesta llista',
'collections.importDone': 'S’han afegit {count} llocs',
'collections.importDone.one': 'S’ha afegit {count} lloc',
'collections.importDoneSkipped': '{count} ja hi eren i s’han deixat igual',
'collections.importDoneSkipped.one': '{count} ja hi era i s’ha deixat igual',
'collections.importDoneClean': 'Ara són tots a {name}',
'collections.sort.default': 'Predeterminat',
'collections.sort.nameAsc': 'Nom (A–Z)',
@@ -96,9 +103,10 @@ const collection: TranslationStrings = {
'collections.markVisited': 'Marca com a visitat',
'collections.markVisitedAll': 'Visitat pertot',
'collections.markVisitedSelection': 'Marca com a visitat a les teves llistes',
'collections.markVisitedNone': 'Cap d\'aquests llocs no és desat en cap llista',
'collections.markVisitedNone': "Cap d'aquests llocs no és desat en cap llista",
'collections.markedVisited': 'Marcat com a visitat',
'collections.markedVisitedTrip': '{count} llocs marcats com a visitats',
'collections.markedVisitedTrip.one': '{count} lloc marcat com a visitat',
'collections.copyToTrip': 'Copiar al viatge',
'collections.copyToTripTitle': 'Copiar al viatge',
'collections.copyN': 'Copia {count} al viatge',
@@ -109,7 +117,9 @@ const collection: TranslationStrings = {
'collections.alreadyInTrip': 'Ja es troba en aquest viatge',
'collections.copied': 'Copiat al viatge',
'collections.copiedCount': "S'han copiat {count} llocs",
'collections.copiedCount.one': "S'ha copiat {count} lloc",
'collections.skippedDuplicates': "S'han omès {count} duplicats",
'collections.skippedDuplicates.one': "S'ha omès {count} duplicat",
'collections.copyNothing': 'Res a copiar',
'collections.removeFromList': 'Eliminar de la llista',
'collections.removeFromListConfirm': 'Vols eliminar aquest lloc de la llista?',
@@ -121,6 +131,7 @@ const collection: TranslationStrings = {
'collections.search': 'Cercar llocs',
'collections.selectMode': 'Seleccionar',
'collections.selectedCount': '{count} seleccionats',
'collections.selectedCount.one': '{count} seleccionat',
'collections.pickList': 'Desar a la llista',
'collections.pickListPlaceholder': 'Tria una llista',
'collections.addedToList': 'Afegit a {name}',
@@ -147,17 +158,22 @@ const collection: TranslationStrings = {
'collections.file.targetExisting': 'Afegeix a una llista',
'collections.file.targetExistingHint': 'A una que ja tens',
'collections.file.searchLists': 'Cerca llistes',
'collections.file.intoHint': 'Els llocs que la llista ja té es queden com estan, igual que el nom i el color. Les etiquetes del fitxer s\'hi afegeixen.',
'collections.file.intoHint':
"Els llocs que la llista ja té es queden com estan, igual que el nom i el color. Les etiquetes del fitxer s'hi afegeixen.",
'collections.file.confirmInto': 'Afegeix a la llista',
'collections.file.doneInto': '{count} llocs afegits a {name}',
'collections.file.doneInto.one': '{count} lloc afegit a {name}',
'collections.file.doneIntoDuplicates': '{count} afegits a {name}, {duplicates} ja hi eren',
'collections.file.doneIntoNothing': 'Tots els llocs del fitxer ja són a {name}',
'collections.file.change': 'Canvia',
'collections.file.labelCount': '{count} etiquetes',
'collections.file.labelCount.one': '{count} etiqueta',
'collections.file.hint':
'Els llocs arriben com una llista nova teva. Les valoracions, els membres i les fotos pujades es queden enrere.',
'collections.file.done': '{count} llocs importats',
'collections.file.doneSkipped': '{count} llocs importats, {skipped} omesos',
'collections.file.done.one': '{count} lloc importat',
'collections.file.doneSkipped': '{count} llocs importats (omesos: {skipped})',
'collections.file.doneSkipped.one': '{count} lloc importat (omesos: {skipped})',
'collections.file.errorTooLarge': 'Aquest fitxer és massa gran per ser una llista.',
'collections.file.errorUnreadable': 'No s’ha pogut llegir aquest fitxer.',
'collections.file.errorNotACollection': 'Això no és un fitxer de llista del TREK.',
@@ -165,12 +181,16 @@ const collection: TranslationStrings = {
'collections.file.formatTrekHint': 'Per a un altre TREK, amb etiquetes i estat',
'collections.file.formatGpxHint': 'Punts de pas per a OsmAnd, Organic Maps, Garmin i altres aplicacions de mapes',
'collections.file.gpxOmitted': '{count} llocs no tenen coordenades i han quedat fora del fitxer GPX',
'collections.file.gpxOmitted.one': '{count} lloc no té coordenades i ha quedat fora del fitxer GPX',
'collections.file.gpxNothing':
'Cap d’aquests llocs té coordenades, així que no hi ha res per posar en un fitxer GPX.',
'collections.file.reading': 'S’està llegint el fitxer…',
'collections.file.gpxSkipped': 'Es deixen fora {count} punts de pas sense coordenades vàlides.',
'collections.file.gpxSkipped.one': 'Es deixa fora {count} punt de pas sense coordenades vàlides.',
'collections.file.gpxTrack':
'Aquest fitxer també té {count} punts de traça. Les traces no s’importen, només els punts de pas.',
'collections.file.gpxTrack.one':
'Aquest fitxer també té {count} punt de traça. Les traces no s’importen, només els punts de pas.',
'collections.file.gpxEmpty': 'Aquest fitxer GPX no té punts de pas, així que no hi ha res per importar.',
'collections.file.errorNotGpx': 'Això no és un fitxer GPX.',
'collections.file.errorTooManyPlaces':
@@ -208,6 +228,7 @@ const collection: TranslationStrings = {
'collections.widget.title': 'Col·leccions',
'collections.widget.empty': 'Encara no hi ha llocs desats',
'collections.widget.savedCount': '{count} desats',
'collections.widget.savedCount.one': '{count} desat',
'collections.labels.title': 'Etiquetes',
'collections.labels.manage': 'Gestionar etiquetes',
'collections.labels.add': 'Afegir etiqueta',
@@ -215,7 +236,9 @@ const collection: TranslationStrings = {
'collections.labels.namePlaceholder': 'p. ex. Berlín',
'collections.labels.assign': 'Assignar etiqueta',
'collections.labels.assignN': 'Afegir etiquetes a {count} llocs',
'collections.labels.assignN.one': 'Afegir etiquetes a {count} lloc',
'collections.labels.assignedCount': "S'han etiquetat {count} llocs",
'collections.labels.assignedCount.one': "S'ha etiquetat {count} lloc",
'collections.labels.empty': 'Encara no hi ha etiquetes',
'collections.labels.emptyHint': 'Crea primer una etiqueta per agrupar llocs en aquesta llista.',
};
+5 -4
View File
@@ -69,13 +69,14 @@ const common: TranslationStrings = {
'common.datepicker.dialog': 'Selector de data',
'common.datepicker.clearDate': 'Netejar data',
'common.errorTitle': 'Alguna cosa ha anat malament',
'common.errorBody': 'Aquesta part de l\'aplicació ha deixat de funcionar. Les teves dades estan segures.',
'common.errorPanelTitle': 'No s\'ha pogut mostrar aquesta secció',
'common.errorBody': "Aquesta part de l'aplicació ha deixat de funcionar. Les teves dades estan segures.",
'common.errorPanelTitle': "No s'ha pogut mostrar aquesta secció",
'common.errorPanelBody': 'La resta de la pàgina continua funcionant.',
'common.errorRetry': 'Torna-ho a provar',
'common.errorReload': 'Torna a carregar la pàgina',
'common.errorUpdateTitle': 'Hi ha una versió nova disponible',
'common.errorUpdateBody': 'TREK s\'ha actualitzat mentre aquesta pestanya era oberta. Torna a carregar per obtenir la versió nova.',
'common.errorPluginTitle': 'No s\'ha pogut mostrar aquest connector',
'common.errorUpdateBody':
"TREK s'ha actualitzat mentre aquesta pestanya era oberta. Torna a carregar per obtenir la versió nova.",
'common.errorPluginTitle': "No s'ha pogut mostrar aquest connector",
};
export default common;
+12 -2
View File
@@ -3,11 +3,13 @@ import type { TranslationStrings } from '../types';
const dashboard: TranslationStrings = {
'dashboard.title': 'Els meus viatges',
'dashboard.subtitle.loading': 'Carregant viatges...',
'dashboard.subtitle.trips': '{count} viatges ({archived} arxivats)',
'dashboard.subtitle.trips': '{count} viatges (arxivats: {archived})',
'dashboard.subtitle.trips.one': '{count} viatge (arxivats: {archived})',
'dashboard.subtitle.empty': 'Comença el teu primer viatge',
'dashboard.subtitle.activeOne': '{count} viatge actiu',
'dashboard.subtitle.activeMany': '{count} viatges actius',
'dashboard.subtitle.archivedSuffix': ' · {count} arxivats',
'dashboard.subtitle.archivedSuffix.one': ' · {count} arxivat',
'dashboard.newTrip': 'Viatge nou',
'dashboard.newTripSub': 'Planifica un viatge nou des de zero',
'dashboard.gridView': 'Vista de graella',
@@ -29,10 +31,13 @@ const dashboard: TranslationStrings = {
'dashboard.shared': 'Compartit',
'dashboard.sharedBy': 'Compartit per {name}',
'dashboard.days': 'Dies',
'dashboard.days.one': 'Dia',
'dashboard.places': 'Llocs',
'dashboard.places.one': 'Lloc',
'dashboard.pass.places': 'Llocs',
'dashboard.members': 'Companys de viatge',
'dashboard.card.buddies': 'Companys de viatge',
'dashboard.card.buddies.one': 'Company',
'dashboard.card.buddies.one': 'Company de viatge',
'dashboard.archive': 'Arxiva',
'dashboard.copyTrip': 'Copia',
'dashboard.copySuffix': 'còpia',
@@ -47,6 +52,7 @@ const dashboard: TranslationStrings = {
'dashboard.status.tomorrow': 'Demà',
'dashboard.status.past': 'Passat',
'dashboard.status.daysLeft': 'Queden {count} dies',
'dashboard.status.daysLeft.one': 'Queda {count} dia',
'dashboard.toast.loadError': "No s'han pogut carregar els viatges",
'dashboard.toast.created': 'Viatge creat correctament!',
'dashboard.toast.createError': "No s'ha pogut crear el viatge",
@@ -88,6 +94,7 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.liveNow': 'En viu ara',
'dashboard.mobile.tripProgress': 'Progrés del viatge',
'dashboard.mobile.daysLeft': '{count} dies restants',
'dashboard.mobile.daysLeft.one': '{count} dia restant',
'dashboard.mobile.places': 'Llocs',
'dashboard.mobile.buddies': 'Companys',
'dashboard.mobile.newTrip': 'Viatge nou',
@@ -104,7 +111,9 @@ const dashboard: TranslationStrings = {
'dashboard.mobile.startsToday': 'Comença avui',
'dashboard.mobile.tomorrow': 'Demà',
'dashboard.mobile.inDays': "D'aquí a {count} dies",
'dashboard.mobile.inDays.one': "D'aquí a {count} dia",
'dashboard.mobile.inMonths': "D'aquí a {count} mesos",
'dashboard.mobile.inMonths.one': "D'aquí a {count} mes",
'dashboard.mobile.completed': 'Completat',
'dashboard.mobile.currencyConverter': 'Conversor de monedes',
'dashboard.filter.planned': 'Planificats',
@@ -130,6 +139,7 @@ const dashboard: TranslationStrings = {
'dashboard.atlas.ofTotal': 'de {total}',
'dashboard.atlas.tripsTotal': 'Viatges en total',
'dashboard.atlas.placesMapped': '{count} llocs al mapa',
'dashboard.atlas.placesMapped.one': '{count} lloc al mapa',
'dashboard.atlas.daysTraveled': 'Dies de viatge',
'dashboard.atlas.daysUnit': 'dies',
'dashboard.atlas.acrossAllTrips': 'en tots els viatges',

Some files were not shown because too many files have changed in this diff Show More