From 4fc73b05671770e26bdd7a558a84e513269b1cea Mon Sep 17 00:00:00 2001 From: Estifo77 <139631617+Estifo77@users.noreply.github.com> Date: Mon, 10 Aug 2026 14:42:21 +0300 Subject: [PATCH] feat(i18n): update medical verification label to include sea service verification fix(layouts): import baseApi in BackofficeLayout and PortalLayout for API state management refactor(auth): remove clearCurrentProfile call on logout and improve cookie removal logic chore(auth-storage): enhance cookie management with secure and sameSite attributes, and streamline cleanup process --- apps/backoffice/src/app/i18n/locales/am.ts | 1774 +++++++++-------- apps/backoffice/src/app/i18n/locales/en.ts | 2 +- .../src/app/layouts/BackofficeLayout.tsx | 2 +- apps/portal/src/app/layouts/PortalLayout.tsx | 3 +- libs/auth/src/lib/store/auth.slice.ts | 1 - libs/auth/src/lib/utils/auth-storage.ts | 125 +- 6 files changed, 1001 insertions(+), 906 deletions(-) diff --git a/apps/backoffice/src/app/i18n/locales/am.ts b/apps/backoffice/src/app/i18n/locales/am.ts index a32d69560..9a6011023 100644 --- a/apps/backoffice/src/app/i18n/locales/am.ts +++ b/apps/backoffice/src/app/i18n/locales/am.ts @@ -1,1060 +1,1066 @@ -import type { Translations } from './en'; +import type { Translations } from "./en"; export const am: Translations = { app: { - name: 'ኢማ አስተዳደር', - shortName: 'ኢማ', - authority: 'የኢትዮጵያ ባሕር ጉዳዮች ባለሥልጣን', - tagline: 'የቁጥጥር ማዕከል', + name: "ኢማ አስተዳደር", + shortName: "ኢማ", + authority: "የኢትዮጵያ ባሕር ጉዳዮች ባለሥልጣን", + tagline: "የቁጥጥር ማዕከል", }, msg: { - genericError: 'የሆነ ስህተት ተፈጥሯል። እባክዎ እንደገና ይሞክሩ።', - serverError: 'የሰርቨር ስህተት። እባክዎ ቆየት ብለው እንደገና ይሞክሩ።', - validationError: 'እባክዎ ያስገቡትን መረጃ ያረጋግጡና እንደገና ይሞክሩ።', - authError: 'ክፍለ ጊዜዎ አልቋል። እባክዎ እንደገና ይግቡ።', - permissionError: 'ይህን ድርጊት ለመፈጸም ፈቃድ የለዎትም።', - notFoundError: 'የተጠየቀው ንጥል አልተገኘም።', - fileTooLarge: 'ፋይሉ ለመስቀል በጣም ትልቅ ነው።', - networkError: 'የአውታረ መረብ ስህተት። ግንኙነትዎን አረጋግጠው እንደገና ይሞክሩ።', + genericError: "የሆነ ስህተት ተፈጥሯል። እባክዎ እንደገና ይሞክሩ።", + serverError: "የሰርቨር ስህተት። እባክዎ ቆየት ብለው እንደገና ይሞክሩ።", + validationError: "እባክዎ ያስገቡትን መረጃ ያረጋግጡና እንደገና ይሞክሩ።", + authError: "ክፍለ ጊዜዎ አልቋል። እባክዎ እንደገና ይግቡ።", + permissionError: "ይህን ድርጊት ለመፈጸም ፈቃድ የለዎትም።", + notFoundError: "የተጠየቀው ንጥል አልተገኘም።", + fileTooLarge: "ፋይሉ ለመስቀል በጣም ትልቅ ነው።", + networkError: "የአውታረ መረብ ስህተት። ግንኙነትዎን አረጋግጠው እንደገና ይሞክሩ።", }, language: { - label: 'ቋንቋ', - en: 'English', - am: 'አማርኛ', + label: "ቋንቋ", + en: "English", + am: "አማርኛ", }, nav: { - groupLicensing: 'ፈቃድ አሰጣጥ', - allApplications: 'ሁሉም ማመልከቻዎች', - licenceRegister: 'የፈቃድ መዝገብ', - certificateDesigner: 'የምስክር ወረቀት ንድፍ', - byType: 'በዓይነት', - typeFreightForwarder: 'የጭነት አስተላላፊ', - typeShippingAgent: 'የመርከብ ወኪል', - typeCombined: 'ጥምር የመርከብ ወኪል እና ጭነት አስተላላፊ', - typeJointInvestment: 'የጋራ ኢንቨስትመንት', - typeMto: 'የብዝሃ-ሁነታ ትራንስፖርት አንቀሳቃሽ', - typeSEAFARER_REGISTRATION: 'የመርከበኞች ምዝገባ', - primary: 'ዋና', - destinations: 'ወደ', - noResults: 'ምንም አልተገኘም', - commandPlaceholder: 'ማያ ገጾችን፣ ማመልከቻዎችን፣ ኩባንያዎችን፣ ቲን ይፈልጉ…', - pending: 'በመጠባበቅ ላይ ያሉ', - pendingCount_one: '{{count}} በመጠባበቅ ላይ', - pendingCount_other: '{{count}} በመጠባበቅ ላይ', - groupSeafarer: 'የመርከበኞች አገልግሎት', - groupVessels: 'መርከቦች', - groupExaminations: 'ፈተናዎች', - groupAdministration: 'አስተዳደር', - groupAccount: 'መለያ', - soon: 'በቅርቡ', - details: 'ዝርዝር', - licenceReview: 'የፈቃድ ማመልከቻዎች', - vesselRegistrationHeadDashboard: 'የመርከብ ምዝገባ ኃላፊ ዳሽቦርድ', - vesselRegistrationQueue: 'የመርከብ መዝገብ', - vesselFormBuilder: 'የመርከብ ቅጽ መገንቢያ', - vesselRegistrationReport: 'የመርከብ ምዝገባ ሪፖርት', - ownershipTransferQueue: 'የባለቤትነት ዝውውር ወረፋ', - logisticsHeadDashboard: 'የሎጂስቲክስ ኃላፊ ዳሽቦርድ', - freightForwarderLicense: 'የጭነት አስተላላፊ ፈቃድ', - shippingAgentLicense: 'የመርከብ ወኪል ፈቃድ', - combinedLicense: 'የተቀናጀ ፈቃድ', - jointInvestmentLicense: 'የጋራ ኢንቨስትመንት ፈቃድ', - mtoLicense: 'የMTO ፈቃድ', - waiver: 'ነፃ ፈቃድ', - preWaiverQueue: 'የቅድመ ነፃ ፈቃድ ወረፋ', - postWaiverQueue: 'የድህረ ነፃ ፈቃድ ወረፋ', - menu: 'ምናሌ', - dashboard: 'ዳሽቦርድ', - userManagement: 'የተጠቃሚ አስተዳደር', - seamanBookQueue: 'የመርከበኞች መጽሐፍ ወረፋ', - cocQueue: 'የCoC/CoP ወረፋ', - endorsementQueue: 'የማረጋገጫ ወረፋ', - vesselRegistrations: 'የመርከብ ምዝገባ', - vesselRegistrationReport: 'የምዝገባ ሪፖርት', - vesselTransfers: 'የመርከብ ባለቤትነት ዝውውር', - seafarerRegistry: 'የመርከበኞች መዝገብ', - seafarerRegistrationQueue: 'የመርከበኞች ምዝገባ ወረፋ', - applications: 'ማመልከቻዎች', - paymentConfig: 'የክፍያ ውቅረት', - analytics: 'ትንታኔ', - medicalVerification: 'የህክምና ማረጋገጫ', - locations: 'አካባቢዎች', - configuration: 'ውቅረት', - profile: 'መገለጫ', - questions: 'ጥያቄዎች', - exams: 'ፈተናዎች', - examResults: 'የፈተና ውጤቶች', - examAppeals: 'የፈተና ይግባኞች', - collapseSidebar: 'ሰብስብ', - expandSidebar: 'ዘርጋ', + groupLicensing: "ፈቃድ አሰጣጥ", + allApplications: "ሁሉም ማመልከቻዎች", + licenceRegister: "የፈቃድ መዝገብ", + certificateDesigner: "የምስክር ወረቀት ንድፍ", + byType: "በዓይነት", + typeFreightForwarder: "የጭነት አስተላላፊ", + typeShippingAgent: "የመርከብ ወኪል", + typeCombined: "ጥምር የመርከብ ወኪል እና ጭነት አስተላላፊ", + typeJointInvestment: "የጋራ ኢንቨስትመንት", + typeMto: "የብዝሃ-ሁነታ ትራንስፖርት አንቀሳቃሽ", + typeSEAFARER_REGISTRATION: "የመርከበኞች ምዝገባ", + primary: "ዋና", + destinations: "ወደ", + noResults: "ምንም አልተገኘም", + commandPlaceholder: "ማያ ገጾችን፣ ማመልከቻዎችን፣ ኩባንያዎችን፣ ቲን ይፈልጉ…", + pending: "በመጠባበቅ ላይ ያሉ", + pendingCount_one: "{{count}} በመጠባበቅ ላይ", + pendingCount_other: "{{count}} በመጠባበቅ ላይ", + groupSeafarer: "የመርከበኞች አገልግሎት", + groupVessels: "መርከቦች", + groupExaminations: "ፈተናዎች", + groupAdministration: "አስተዳደር", + groupAccount: "መለያ", + soon: "በቅርቡ", + details: "ዝርዝር", + licenceReview: "የፈቃድ ማመልከቻዎች", + vesselRegistrationHeadDashboard: "የመርከብ ምዝገባ ኃላፊ ዳሽቦርድ", + vesselRegistrationQueue: "የመርከብ መዝገብ", + vesselFormBuilder: "የመርከብ ቅጽ መገንቢያ", + vesselRegistrationReport: "የመርከብ ምዝገባ ሪፖርት", + ownershipTransferQueue: "የባለቤትነት ዝውውር ወረፋ", + logisticsHeadDashboard: "የሎጂስቲክስ ኃላፊ ዳሽቦርድ", + freightForwarderLicense: "የጭነት አስተላላፊ ፈቃድ", + shippingAgentLicense: "የመርከብ ወኪል ፈቃድ", + combinedLicense: "የተቀናጀ ፈቃድ", + jointInvestmentLicense: "የጋራ ኢንቨስትመንት ፈቃድ", + mtoLicense: "የMTO ፈቃድ", + waiver: "ነፃ ፈቃድ", + preWaiverQueue: "የቅድመ ነፃ ፈቃድ ወረፋ", + postWaiverQueue: "የድህረ ነፃ ፈቃድ ወረፋ", + menu: "ምናሌ", + dashboard: "ዳሽቦርድ", + userManagement: "የተጠቃሚ አስተዳደር", + seamanBookQueue: "የመርከበኞች መጽሐፍ ወረፋ", + cocQueue: "የCoC/CoP ወረፋ", + endorsementQueue: "የማረጋገጫ ወረፋ", + vesselRegistrations: "የመርከብ ምዝገባ", + // vesselRegistrationReport: 'የምዝገባ ሪፖርት', + vesselTransfers: "የመርከብ ባለቤትነት ዝውውር", + seafarerRegistry: "የመርከበኞች መዝገብ", + seafarerRegistrationQueue: "የመርከበኞች ምዝገባ ወረፋ", + applications: "ማመልከቻዎች", + paymentConfig: "የክፍያ ውቅረት", + analytics: "ትንታኔ", + medicalVerification: "የሕክምና እና የባህር አገልግሎት ማረጋገጫ", + locations: "አካባቢዎች", + configuration: "ውቅረት", + profile: "መገለጫ", + questions: "ጥያቄዎች", + exams: "ፈተናዎች", + examResults: "የፈተና ውጤቶች", + examAppeals: "የፈተና ይግባኞች", + collapseSidebar: "ሰብስብ", + expandSidebar: "ዘርጋ", }, common: { - logout: 'ውጣ', - profile: 'መገለጫ', - settings: 'ቅንብሮች', - export: 'ላክ', - viewAll: 'ሁሉንም ይመልከቱ', - home: 'መነሻ', - notifications: 'ማሳወቂያዎች', - administrator: 'አስተዳዳሪ', - collapse: 'ሰብስብ', - expand: 'ዘርጋ', - toggleTheme: 'የብርሃን / ጨለማ ሁነታን ይቀይሩ', - refresh: 'አድስ', - view: 'ይመልከቱ', - toggleColumns: 'አምዶችን ቀያይር', - noResult: 'ምንም አልተገኘም', - switchCalendar: 'የቀን መቁጠሪያ ዓይነት ቀይር', - time: 'ሰዓት', + logout: "ውጣ", + profile: "መገለጫ", + settings: "ቅንብሮች", + export: "ላክ", + viewAll: "ሁሉንም ይመልከቱ", + home: "መነሻ", + notifications: "ማሳወቂያዎች", + administrator: "አስተዳዳሪ", + collapse: "ሰብስብ", + expand: "ዘርጋ", + toggleTheme: "የብርሃን / ጨለማ ሁነታን ይቀይሩ", + refresh: "አድስ", + view: "ይመልከቱ", + toggleColumns: "አምዶችን ቀያይር", + noResult: "ምንም አልተገኘም", + switchCalendar: "የቀን መቁጠሪያ ዓይነት ቀይር", + time: "ሰዓት", }, breadcrumbs: { - dashboard: 'ዳሽቦርድ', - um: 'የተጠቃሚ አስተዳደር', - home: 'መነሻ', + dashboard: "ዳሽቦርድ", + um: "የተጠቃሚ አስተዳደር", + home: "መነሻ", }, dashboard: { - title: 'አጠቃላይ እይታ', - subtitle: 'እንኳን ደህና መጡ — በመድረክዎ ላይ ያለው እንቅስቃሴ አጠቃላይ እይታ።', + title: "አጠቃላይ እይታ", + subtitle: "እንኳን ደህና መጡ — በመድረክዎ ላይ ያለው እንቅስቃሴ አጠቃላይ እይታ።", kpis: { - totalUsers: 'ጠቅላላ ተጠቃሚዎች', - activeUsers: 'ንቁ ተጠቃሚዎች', - newThisMonth: 'በዚህ ወር አዲስ', - pendingApprovals: 'በመጠባበቅ ላይ ያሉ', + totalUsers: "ጠቅላላ ተጠቃሚዎች", + activeUsers: "ንቁ ተጠቃሚዎች", + newThisMonth: "በዚህ ወር አዲስ", + pendingApprovals: "በመጠባበቅ ላይ ያሉ", }, charts: { - userRegistrations: 'የተጠቃሚ ምዝገባ', - registrationsSubtitle: 'ባለፉት 8 ወራት አዲስ ምዝገባ', - vsPreviousPeriod: 'ካለፈው ጊዜ ጋር ሲነጻጸር', - usersByRole: 'ተጠቃሚዎች በሚና', - roleDistribution: 'በተደራሽነት ደረጃ ስርጭት', - totalUsers: 'ጠቅላላ ተጠቃሚዎች', + userRegistrations: "የተጠቃሚ ምዝገባ", + registrationsSubtitle: "ባለፉት 8 ወራት አዲስ ምዝገባ", + vsPreviousPeriod: "ካለፈው ጊዜ ጋር ሲነጻጸር", + usersByRole: "ተጠቃሚዎች በሚና", + roleDistribution: "በተደራሽነት ደረጃ ስርጭት", + totalUsers: "ጠቅላላ ተጠቃሚዎች", }, quickLinks: { - title: 'ፈጣን አገናኞች', - subtitle: 'የተለመዱ የአስተዳደር አቋራጮች', - addUser: 'ተጠቃሚ ያክሉ', - addUserDesc: 'አዲስ መለያ ይፍጠሩ', - rolesAndPermissions: 'ሚናዎች እና ፈቃዶች', - rolesAndPermissionsDesc: 'የተደራሽነት ደረጃዎችን ያስተዳድሩ', - inviteMembers: 'አባላትን ይጋብዙ', - inviteMembersDesc: 'በኢሜይል ግብዣ ይላኩ', - importUsers: 'ተጠቃሚዎችን ያስመጡ', - importUsersDesc: 'የCSV ጅምላ ማስመጣት', - exportData: 'ውሂብ ያላኩ', - exportDataDesc: 'ሪፖርቶችን ያውርዱ', - auditLog: 'የኦዲት መዝገብ', - auditLogDesc: 'እንቅስቃሴን ይገምግሙ', + title: "ፈጣን አገናኞች", + subtitle: "የተለመዱ የአስተዳደር አቋራጮች", + addUser: "ተጠቃሚ ያክሉ", + addUserDesc: "አዲስ መለያ ይፍጠሩ", + rolesAndPermissions: "ሚናዎች እና ፈቃዶች", + rolesAndPermissionsDesc: "የተደራሽነት ደረጃዎችን ያስተዳድሩ", + inviteMembers: "አባላትን ይጋብዙ", + inviteMembersDesc: "በኢሜይል ግብዣ ይላኩ", + importUsers: "ተጠቃሚዎችን ያስመጡ", + importUsersDesc: "የCSV ጅምላ ማስመጣት", + exportData: "ውሂብ ያላኩ", + exportDataDesc: "ሪፖርቶችን ያውርዱ", + auditLog: "የኦዲት መዝገብ", + auditLogDesc: "እንቅስቃሴን ይገምግሙ", }, recentUsers: { - title: 'የቅርብ ጊዜ ተጠቃሚዎች', + title: "የቅርብ ጊዜ ተጠቃሚዎች", }, timeRange: { - today: 'ዛሬ', - thisWeek: 'በዚህ ሳምንት', - thisMonth: 'በዚህ ወር', + today: "ዛሬ", + thisWeek: "በዚህ ሳምንት", + thisMonth: "በዚህ ወር", }, }, exam: { - title: 'ፈተናዎች', - subtitle: 'ፈተናዎችን ያስተዳድሩ፣ ጥያቄዎችን ይመድቡ እና ውጤቶችን ይከታተሉ', - create: 'ፈተና ይፍጠሩ', - update: 'ፈተና ያዘምኑ', - add: 'ፈተና ይፍጠሩ', - noItems: 'ምንም ፈተናዎች አልተገኙም', - created: 'ፈተና ተፈጥሯል', - updated: 'ፈተና ዘምኗል', - deleted: 'ፈተና ተሰርዟል', - error: 'ክዋኔው አልተሳካም', - loadError: 'ፈተናዎችን በመጫን ላይ ስህተት', - cancel: 'ሰርዝ', - delete: 'ሰርዝ', - confirmDelete: 'ፈተና ይሰረዝ', - deleteConfirmText: 'እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?', - print: 'ፈተና ያትሙ', - recordResult: 'ውጤት ይመዝግቡ', - manageQuestions: 'ጥያቄዎችን ያስተዳድሩ', - saveAssignments: 'ምደባዎችን ያስቀምጡ', - randomSelect: 'በዘፈቀደ ይምረጡ', - backToExams: 'ወደ ፈተናዎች ይመለሱ', - notFound: 'ፈተና አልተገኘም።', - noQuestionsAssigned: 'ገና ምንም ጥያቄዎች አልተመደቡም።', + title: "ፈተናዎች", + subtitle: "ፈተናዎችን ያስተዳድሩ፣ ጥያቄዎችን ይመድቡ እና ውጤቶችን ይከታተሉ", + create: "ፈተና ይፍጠሩ", + update: "ፈተና ያዘምኑ", + add: "ፈተና ይፍጠሩ", + noItems: "ምንም ፈተናዎች አልተገኙም", + created: "ፈተና ተፈጥሯል", + updated: "ፈተና ዘምኗል", + deleted: "ፈተና ተሰርዟል", + error: "ክዋኔው አልተሳካም", + loadError: "ፈተናዎችን በመጫን ላይ ስህተት", + cancel: "ሰርዝ", + delete: "ሰርዝ", + confirmDelete: "ፈተና ይሰረዝ", + deleteConfirmText: "እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?", + print: "ፈተና ያትሙ", + recordResult: "ውጤት ይመዝግቡ", + manageQuestions: "ጥያቄዎችን ያስተዳድሩ", + saveAssignments: "ምደባዎችን ያስቀምጡ", + randomSelect: "በዘፈቀደ ይምረጡ", + backToExams: "ወደ ፈተናዎች ይመለሱ", + notFound: "ፈተና አልተገኘም።", + noQuestionsAssigned: "ገና ምንም ጥያቄዎች አልተመደቡም።", columns: { - title: 'ርዕስ', - certification: 'የምስክር ወረቀት', - date: 'ቀን', - type: 'አይነት', - form: 'ቅጽ', - venue: 'ቦታ', - questions: 'ጥያቄዎች', - status: 'ሁኔታ', + title: "ርዕስ", + certification: "የምስክር ወረቀት", + date: "ቀን", + type: "አይነት", + form: "ቅጽ", + venue: "ቦታ", + questions: "ጥያቄዎች", + status: "ሁኔታ", }, detail: { - title: 'የፈተና ዝርዝሮች', - certification: 'የምስክር ወረቀት', - type: 'አይነት', - form: 'ቅጽ', - venue: 'ቦታ', - date: 'ቀን', - administration: 'አስተዳደር', - evaluation: 'ግምገማ', - selection: 'ምርጫ', - timeAllowed: 'የተፈቀደ ጊዜ', - passMark: 'የማለፊያ ነጥብ', - totalPoints: 'ጠቅላላ ነጥብ', - questions: 'ጥያቄዎች', - directions: 'መመሪያዎች', - questionLabel: 'ጥያቄ', - questionsSection: 'ጥያቄዎች (ጠቅላላ {{pts}} ነጥብ)', + title: "የፈተና ዝርዝሮች", + certification: "የምስክር ወረቀት", + type: "አይነት", + form: "ቅጽ", + venue: "ቦታ", + date: "ቀን", + administration: "አስተዳደር", + evaluation: "ግምገማ", + selection: "ምርጫ", + timeAllowed: "የተፈቀደ ጊዜ", + passMark: "የማለፊያ ነጥብ", + totalPoints: "ጠቅላላ ነጥብ", + questions: "ጥያቄዎች", + directions: "መመሪያዎች", + questionLabel: "ጥያቄ", + questionsSection: "ጥያቄዎች (ጠቅላላ {{pts}} ነጥብ)", }, form: { - basicInfo: 'መሠረታዊ መረጃ', - settings: 'ቅንብሮች', - certification: 'የምስክር ወረቀት', - selectCertification: 'የምስክር ወረቀት ይምረጡ', - titleEn: 'ርዕስ (እንግሊዝኛ)', - titleEnPlaceholder: 'የፈተና ርዕስ በእንግሊዝኛ', - titleAm: 'ርዕስ (አማርኛ)', - titleAmPlaceholder: 'የፈተና ርዕስ', - directionEn: 'መመሪያ (እንግሊዝኛ)', - directionEnPlaceholder: 'መመሪያ በእንግሊዝኛ', - directionAm: 'መመሪያ (አማርኛ)', - directionAmPlaceholder: 'መመሪያ በአማርኛ', - examDate: 'የፈተና ቀን', - venue: 'ቦታ', - venuePlaceholder: 'የፈተና ቦታ', - timeAllowed: 'የተፈቀደ ጊዜ', - days: 'ቀናት', - hours: 'ሰአታት', - minutes: 'ደቂቃዎች', - written: 'ጽሑፍ', - oral: 'ቃል', - essay: 'ኢሴይ', - choice: 'ምርጫ', - offline: 'ከመስመር ውጪ', - online: 'በመስመር', - sum: 'ድምር', - average: 'አማካይ', - percentage: 'መቶኛ', - manual: 'በእጅ', - random: 'በዘፈቀደ', - cuttingPoint: 'የማለፊያ ነጥብ', - cuttingPointPlaceholder: 'ለማለፍ ዝቅተኛ ነጥብ', - status: 'ሁኔታ', - statusPlaceholder: 'የፈተና ሁኔታ', - pending: 'በመጠባበቅ ላይ', - active: 'ንቁ', - completed: 'ተጠናቋል', - cancelled: 'ተሰርዟል', - postponed: 'ተላልፏል', - published: 'ታትሟል', + basicInfo: "መሠረታዊ መረጃ", + settings: "ቅንብሮች", + certification: "የምስክር ወረቀት", + selectCertification: "የምስክር ወረቀት ይምረጡ", + titleEn: "ርዕስ (እንግሊዝኛ)", + titleEnPlaceholder: "የፈተና ርዕስ በእንግሊዝኛ", + titleAm: "ርዕስ (አማርኛ)", + titleAmPlaceholder: "የፈተና ርዕስ", + directionEn: "መመሪያ (እንግሊዝኛ)", + directionEnPlaceholder: "መመሪያ በእንግሊዝኛ", + directionAm: "መመሪያ (አማርኛ)", + directionAmPlaceholder: "መመሪያ በአማርኛ", + examDate: "የፈተና ቀን", + venue: "ቦታ", + venuePlaceholder: "የፈተና ቦታ", + timeAllowed: "የተፈቀደ ጊዜ", + days: "ቀናት", + hours: "ሰአታት", + minutes: "ደቂቃዎች", + written: "ጽሑፍ", + oral: "ቃል", + essay: "ኢሴይ", + choice: "ምርጫ", + offline: "ከመስመር ውጪ", + online: "በመስመር", + sum: "ድምር", + average: "አማካይ", + percentage: "መቶኛ", + manual: "በእጅ", + random: "በዘፈቀደ", + cuttingPoint: "የማለፊያ ነጥብ", + cuttingPointPlaceholder: "ለማለፍ ዝቅተኛ ነጥብ", + status: "ሁኔታ", + statusPlaceholder: "የፈተና ሁኔታ", + pending: "በመጠባበቅ ላይ", + active: "ንቁ", + completed: "ተጠናቋል", + cancelled: "ተሰርዟል", + postponed: "ተላልፏል", + published: "ታትሟል", }, assigner: { - title: 'ጥያቄዎችን ለፈተና ይመድቡ', - assignedTitle: 'የተመደቡ ጥያቄዎች', - available: 'የሚገኙ ጥያቄዎች', - assigned: 'የተመደቡ ጥያቄዎች', - search: 'ፈልግ...', - noQuestions: 'ምንም ጥያቄዎች የሉም', - assignSelected: 'የተመረጡትን ይመድቡ ({{count}})', - removeSelected: 'የተመረጡትን ያስወግዱ ({{count}})', - randomHint: 'ከጠቅላላ {{total}} ብቁ ጥያቄዎች ውስጥ በዘፈቀደ ይምረጡ። ምርጫው አጠቃላይ ነጥቦች የማለፊያ ነጥብ ({{pts}}) ላይ እንደሚደርሱ በራስ-ሰር ያረጋግጣል።', - selectCount: 'ብዛት', + title: "ጥያቄዎችን ለፈተና ይመድቡ", + assignedTitle: "የተመደቡ ጥያቄዎች", + available: "የሚገኙ ጥያቄዎች", + assigned: "የተመደቡ ጥያቄዎች", + search: "ፈልግ...", + noQuestions: "ምንም ጥያቄዎች የሉም", + assignSelected: "የተመረጡትን ይመድቡ ({{count}})", + removeSelected: "የተመረጡትን ያስወግዱ ({{count}})", + randomHint: + "ከጠቅላላ {{total}} ብቁ ጥያቄዎች ውስጥ በዘፈቀደ ይምረጡ። ምርጫው አጠቃላይ ነጥቦች የማለፊያ ነጥብ ({{pts}}) ላይ እንደሚደርሱ በራስ-ሰር ያረጋግጣል።", + selectCount: "ብዛት", }, status: { - PENDING: 'በመጠባበቅ ላይ', - ACTIVE: 'ንቁ', - COMPLETED: 'ተጠናቋል', - CANCELLED: 'ተሰርዟል', - POSTPONED: 'ተላልፏል', - PUBLISHED: 'ታትሟል', + PENDING: "በመጠባበቅ ላይ", + ACTIVE: "ንቁ", + COMPLETED: "ተጠናቋል", + CANCELLED: "ተሰርዟል", + POSTPONED: "ተላልፏል", + PUBLISHED: "ታትሟል", }, type: { - WRITTEN: 'ጽሑፍ', - ORAL: 'ቃል', + WRITTEN: "ጽሑፍ", + ORAL: "ቃል", }, formType: { - ESSAY: 'ኢሴይ', - CHOICE: 'ምርጫ', + ESSAY: "ኢሴይ", + CHOICE: "ምርጫ", }, admin: { - OFFLINE: 'ከመስመር ውጪ', - ONLINE: 'በመስመር', + OFFLINE: "ከመስመር ውጪ", + ONLINE: "በመስመር", }, eval: { - SUM: 'ድምር', - AVERAGE: 'አማካይ', - PERCENTAGE: 'መቶኛ', + SUM: "ድምር", + AVERAGE: "አማካይ", + PERCENTAGE: "መቶኛ", }, selection: { - MANUAL: 'በእጅ', - RANDOM: 'በዘፈቀደ', + MANUAL: "በእጅ", + RANDOM: "በዘፈቀደ", }, candidates: { - section: 'ተፈታኞች', - admission: 'የመግቢያ ቁጥር', - name: 'ተፈታኝ', - attempt: 'ሙከራ', - attendance: 'ተገኝነት', - remark: 'አስተያየት', - record: 'መዝግብ', - recorded: 'ተገኝነት ተመዝግቧል', - none: 'ለዚህ ፈተና እስካሁን የተመዘገበ ተፈታኝ የለም።', - retake: 'ድጋሚ {{n}}', - firstSitting: 'የመጀመሪያ ሙከራ', - remarkRequired: 'ለመውጣት ወይም ለመታገድ ምክንያት ያስፈልጋል።', + section: "ተፈታኞች", + admission: "የመግቢያ ቁጥር", + name: "ተፈታኝ", + attempt: "ሙከራ", + attendance: "ተገኝነት", + remark: "አስተያየት", + record: "መዝግብ", + recorded: "ተገኝነት ተመዝግቧል", + none: "ለዚህ ፈተና እስካሁን የተመዘገበ ተፈታኝ የለም።", + retake: "ድጋሚ {{n}}", + firstSitting: "የመጀመሪያ ሙከራ", + remarkRequired: "ለመውጣት ወይም ለመታገድ ምክንያት ያስፈልጋል።", }, attendance: { - REGISTERED: 'አልተጠራም', - PRESENT: 'ተገኝቷል', - ABSENT: 'አልተገኘም', - LATE: 'ዘግይቷል', - WITHDRAWN: 'ወጥቷል', - DISQUALIFIED: 'ታግዷል', + REGISTERED: "አልተጠራም", + PRESENT: "ተገኝቷል", + ABSENT: "አልተገኘም", + LATE: "ዘግይቷል", + WITHDRAWN: "ወጥቷል", + DISQUALIFIED: "ታግዷል", }, incidents: { - section: 'ክስተቶች', - add: 'ክስተት መዝግብ', - type: 'ዓይነት', - candidate: 'ተፈታኝ', - wholeRoom: 'ሙሉ ፈተና', - description: 'የተከሰተው ነገር', - occurred: 'የተከሰተበት', - status: 'ሁኔታ', - resolve: 'ፍታ', - resolution: 'ውሳኔ', - outcome: 'ውጤት', - none: 'ለዚህ ፈተና የተመዘገበ ክስተት የለም።', - filed: 'ክስተት ተመዝግቧል', - resolved: 'ክስተት ተዘግቷል', - error: 'ተግባሩ አልተሳካም', + section: "ክስተቶች", + add: "ክስተት መዝግብ", + type: "ዓይነት", + candidate: "ተፈታኝ", + wholeRoom: "ሙሉ ፈተና", + description: "የተከሰተው ነገር", + occurred: "የተከሰተበት", + status: "ሁኔታ", + resolve: "ፍታ", + resolution: "ውሳኔ", + outcome: "ውጤት", + none: "ለዚህ ፈተና የተመዘገበ ክስተት የለም።", + filed: "ክስተት ተመዝግቧል", + resolved: "ክስተት ተዘግቷል", + error: "ተግባሩ አልተሳካም", }, incidentType: { - MISCONDUCT: 'ሥነ ምግባር ጥሰት', - TECHNICAL_FAILURE: 'ቴክኒካዊ ብልሽት', - MEDICAL: 'የጤና', - ADMINISTRATIVE: 'አስተዳደራዊ', - OTHER: 'ሌላ', + MISCONDUCT: "ሥነ ምግባር ጥሰት", + TECHNICAL_FAILURE: "ቴክኒካዊ ብልሽት", + MEDICAL: "የጤና", + ADMINISTRATIVE: "አስተዳደራዊ", + OTHER: "ሌላ", }, incidentStatus: { - OPEN: 'ክፍት', - UNDER_REVIEW: 'በግምገማ ላይ', - RESOLVED: 'ተፈትቷል', - DISMISSED: 'ውድቅ ተደርጓል', + OPEN: "ክፍት", + UNDER_REVIEW: "በግምገማ ላይ", + RESOLVED: "ተፈትቷል", + DISMISSED: "ውድቅ ተደርጓል", }, randomHintServer: - 'ጥያቄዎች ለዚህ ትምህርት ከጸደቁ ንጥሎች በሰርቨሩ ላይ ይመረጣሉ፤ ስለዚህ ማከማቻው ለአሳሹ አይጋለጥም።', - randomSelected: '{{count}} የጸደቁ ጥያቄዎች ተመርጠዋል', - randomError: 'ጥያቄዎችን መምረጥ አልተቻለም', - notEnoughApproved: 'ለዚህ ትምህርት በቂ የጸደቁ ጥያቄዎች የሉም።', + "ጥያቄዎች ለዚህ ትምህርት ከጸደቁ ንጥሎች በሰርቨሩ ላይ ይመረጣሉ፤ ስለዚህ ማከማቻው ለአሳሹ አይጋለጥም።", + randomSelected: "{{count}} የጸደቁ ጥያቄዎች ተመርጠዋል", + randomError: "ጥያቄዎችን መምረጥ አልተቻለም", + notEnoughApproved: "ለዚህ ትምህርት በቂ የጸደቁ ጥያቄዎች የሉም።", }, country: { - select: 'አገር ይምረጡ', - notFound: 'ምንም አገር አልተገኘም', + select: "አገር ይምረጡ", + notFound: "ምንም አገር አልተገኘም", }, location: { - title: 'አካባቢዎች', - hierarchy: 'የአካባቢ ተዋረድ', - search: 'አካባቢዎችን ይፈልጉ...', - noLocations: 'ምንም አካባቢዎች አልተገኙም። ለመጀመር የስር አካባቢ ያክሉ።', - selectHint: 'ዝርዝሮችን ለማየት ከዛፉ ውስጥ አካባቢ ይምረጡ', - addRoot: 'የስር አካባቢ ያክሉ', - addSubLocation: 'ንዑስ አካባቢ ያክሉ', - addTitle: 'አካባቢ ያክሉ', - editTitle: 'አካባቢ ያስተካክሉ', - code: 'ኮድ', - name: 'ስም', - nameEn: 'ስም (እንግሊዝኛ)', - nameAm: 'ስም (አማርኛ)', - type: 'አይነት', - level: 'ደረጃ', - parent: 'ወላጅ', - selectType: 'አይነት ይምረጡ', - cancel: 'ሰርዝ', - create: 'ፍጠር', - update: 'አዘምን', - edit: 'አስተካክል', - delete: 'ሰርዝ', - created: 'አካባቢ በተሳካ ሁኔታ ተፈጥሯል', - updated: 'አካባቢ በተሳካ ሁኔታ ዘምኗል', - deleted: 'አካባቢ በተሳካ ሁኔታ ተሰርዟል', - error: 'አንድ ስህተት ተፈጥሯል', - deleteError: 'አካባቢውን መሰረዝ አልተቻለም', - confirmDelete: 'መሰረዝን ያረጋግጡ', - deleteConfirmText: 'እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?', - manageTypes: 'የአካባቢ አይነቶችን ያስተዳድሩ', - addType: 'የአካባቢ አይነት ያክሉ', - noTypes: 'ገና ምንም የአካባቢ አይነቶች አልተገለጹም', - typeCreated: 'የአካባቢ አይነት ተፈጥሯል', - typeUpdated: 'የአካባቢ አይነት ዘምኗል', - typeDeleted: 'የአካባቢ አይነት ተሰርዟል', - typeError: 'የአካባቢ አይነቱን ማስቀመጥ አልተቻለም', - setupRequired: 'ማዋቀር ያስፈልጋል', - setupHint: 'አካባቢዎችን ከመጨመርዎ በፊት የአካባቢ አይነቶችን ማዋቀር ያስፈልግዎታል።', - configureTypes: 'የአካባቢ አይነቶችን ያዋቅሩ', - noTypesAvailable: 'ለዚህ ደረጃ ምንም የአካባቢ አይነቶች የሉም', - multipleTypesHint: 'በርካታ አይነቶች ተገኝተዋል — አይነቱ ከዝቅተኛው ደረጃ በራስ-ሰር ተመርጧል።', + title: "አካባቢዎች", + hierarchy: "የአካባቢ ተዋረድ", + search: "አካባቢዎችን ይፈልጉ...", + noLocations: "ምንም አካባቢዎች አልተገኙም። ለመጀመር የስር አካባቢ ያክሉ።", + selectHint: "ዝርዝሮችን ለማየት ከዛፉ ውስጥ አካባቢ ይምረጡ", + addRoot: "የስር አካባቢ ያክሉ", + addSubLocation: "ንዑስ አካባቢ ያክሉ", + addTitle: "አካባቢ ያክሉ", + editTitle: "አካባቢ ያስተካክሉ", + code: "ኮድ", + name: "ስም", + nameEn: "ስም (እንግሊዝኛ)", + nameAm: "ስም (አማርኛ)", + type: "አይነት", + level: "ደረጃ", + parent: "ወላጅ", + selectType: "አይነት ይምረጡ", + cancel: "ሰርዝ", + create: "ፍጠር", + update: "አዘምን", + edit: "አስተካክል", + delete: "ሰርዝ", + created: "አካባቢ በተሳካ ሁኔታ ተፈጥሯል", + updated: "አካባቢ በተሳካ ሁኔታ ዘምኗል", + deleted: "አካባቢ በተሳካ ሁኔታ ተሰርዟል", + error: "አንድ ስህተት ተፈጥሯል", + deleteError: "አካባቢውን መሰረዝ አልተቻለም", + confirmDelete: "መሰረዝን ያረጋግጡ", + deleteConfirmText: "እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?", + manageTypes: "የአካባቢ አይነቶችን ያስተዳድሩ", + addType: "የአካባቢ አይነት ያክሉ", + noTypes: "ገና ምንም የአካባቢ አይነቶች አልተገለጹም", + typeCreated: "የአካባቢ አይነት ተፈጥሯል", + typeUpdated: "የአካባቢ አይነት ዘምኗል", + typeDeleted: "የአካባቢ አይነት ተሰርዟል", + typeError: "የአካባቢ አይነቱን ማስቀመጥ አልተቻለም", + setupRequired: "ማዋቀር ያስፈልጋል", + setupHint: "አካባቢዎችን ከመጨመርዎ በፊት የአካባቢ አይነቶችን ማዋቀር ያስፈልግዎታል።", + configureTypes: "የአካባቢ አይነቶችን ያዋቅሩ", + noTypesAvailable: "ለዚህ ደረጃ ምንም የአካባቢ አይነቶች የሉም", + multipleTypesHint: "በርካታ አይነቶች ተገኝተዋል — አይነቱ ከዝቅተኛው ደረጃ በራስ-ሰር ተመርጧል።", validation: { - codeRequired: 'ኮድ ያስፈልጋል', - nameEnRequired: 'የእንግሊዝኛ ስም ያስፈልጋል', - nameAmRequired: 'የአማርኛ ስም ያስፈልጋል', - typeRequired: 'የአካባቢ አይነት ያስፈልጋል', + codeRequired: "ኮድ ያስፈልጋል", + nameEnRequired: "የእንግሊዝኛ ስም ያስፈልጋል", + nameAmRequired: "የአማርኛ ስም ያስፈልጋል", + typeRequired: "የአካባቢ አይነት ያስፈልጋል", }, }, profile: { - title: 'የእኔ መገለጫ', - subtitle: 'የመለያ ዝርዝሮችዎን እና ምርጫዎችዎን ያስተዳድሩ።', - personal: 'የግል መረጃ', - contact: 'መገኛ', - preferences: 'ምርጫዎች', - security: 'ደህንነት', - securityHint: 'በሌላ ቦታ የማይጠቀሙትን ጠንካራ የይለፍ ቃል ይምረጡ።', - changePassword: 'የይለፍ ቃል ይቀይሩ', - updatePassword: 'የይለፍ ቃል አዘምን', - updateProfile: 'ለውጦችን አስቀምጥ', - savePreferences: 'ምርጫዎችን አስቀምጥ', - cancel: 'ሰርዝ', - verified: 'የተረጋገጠ', - unverified: 'ያልተረጋገጠ', + title: "የእኔ መገለጫ", + subtitle: "የመለያ ዝርዝሮችዎን እና ምርጫዎችዎን ያስተዳድሩ።", + personal: "የግል መረጃ", + contact: "መገኛ", + preferences: "ምርጫዎች", + security: "ደህንነት", + securityHint: "በሌላ ቦታ የማይጠቀሙትን ጠንካራ የይለፍ ቃል ይምረጡ።", + changePassword: "የይለፍ ቃል ይቀይሩ", + updatePassword: "የይለፍ ቃል አዘምን", + updateProfile: "ለውጦችን አስቀምጥ", + savePreferences: "ምርጫዎችን አስቀምጥ", + cancel: "ሰርዝ", + verified: "የተረጋገጠ", + unverified: "ያልተረጋገጠ", tabs: { - profile: 'መገለጫ', - security: 'ደህንነት', - preferences: 'ምርጫዎች', + profile: "መገለጫ", + security: "ደህንነት", + preferences: "ምርጫዎች", }, - personalHint: 'በኦፊሴላዊ ኢማ ሰነዶች ላይ እንደሚታየው ስምዎ።', - languageTitle: 'ቋንቋ', - languageHint: 'በአስተዳደር ፓነል ውስጥ የሚጠቀሙትን ቋንቋ ይምረጡ።', + personalHint: "በኦፊሴላዊ ኢማ ሰነዶች ላይ እንደሚታየው ስምዎ።", + languageTitle: "ቋንቋ", + languageHint: "በአስተዳደር ፓነል ውስጥ የሚጠቀሙትን ቋንቋ ይምረጡ።", appearance: { - title: 'መልክ', - subtitle: 'የአስተዳደር ፓነል በመሣሪያዎ ላይ እንዴት እንደሚታይ ይምረጡ።', - light: 'የቀን', - dark: 'ሌሊት', - system: 'ሲስተም', + title: "መልክ", + subtitle: "የአስተዳደር ፓነል በመሣሪያዎ ላይ እንዴት እንደሚታይ ይምረጡ።", + light: "የቀን", + dark: "ሌሊት", + system: "ሲስተም", }, twoStep: { - title: 'ባለሁለት ደረጃ ማረጋገጫ', - desc: 'በየጊዜው ሲገቡ ከስልክዎ የአንድ ጊዜ ኮድ ያስፈልጋል።', + title: "ባለሁለት ደረጃ ማረጋገጫ", + desc: "በየጊዜው ሲገቡ ከስልክዎ የአንድ ጊዜ ኮድ ያስፈልጋል።", }, layout: { - title: 'አቀማመጥ', - subtitle: 'የማውጫ አቀማመጥ እንዴት እንደሚታይ ይምረጡ።', - top: 'የላይኛው ትሮች', - sidebar: 'የጎን አሞሌ', + title: "አቀማመጥ", + subtitle: "የማውጫ አቀማመጥ እንዴት እንደሚታይ ይምረጡ።", + top: "የላይኛው ትሮች", + sidebar: "የጎን አሞሌ", }, notifications: { - title: 'የኢሜይል ማሳወቂያዎች', - desc: 'ስለ መለያ እንቅስቃሴዎ በኢሜይል ዝማኔዎችን ይቀበሉ።', + title: "የኢሜይል ማሳወቂያዎች", + desc: "ስለ መለያ እንቅስቃሴዎ በኢሜይል ዝማኔዎችን ይቀበሉ።", }, strength: { - label: 'የይለፍ ቃል ጥንካሬ', - weak: 'ደካማ', - fair: 'መካከለኛ', - good: 'ጥሩ', - strong: 'ጠንካራ', + label: "የይለፍ ቃል ጥንካሬ", + weak: "ደካማ", + fair: "መካከለኛ", + good: "ጥሩ", + strong: "ጠንካራ", }, - profileUpdated: 'መገለጫ በተሳካ ሁኔታ ዘምኗል', - passwordChanged: 'የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል', - updateFailed: 'መገለጫውን ማዘመን አልተቻለም። እባክዎ እንደገና ይሞክሩ።', - passwordFailed: 'የይለፍ ቃሉን መቀየር አልተቻለም። የአሁኑን የይለፍ ቃል ያረጋግጡ እና እንደገና ይሞክሩ።', + profileUpdated: "መገለጫ በተሳካ ሁኔታ ዘምኗል", + passwordChanged: "የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል", + updateFailed: "መገለጫውን ማዘመን አልተቻለም። እባክዎ እንደገና ይሞክሩ።", + passwordFailed: "የይለፍ ቃሉን መቀየር አልተቻለም። የአሁኑን የይለፍ ቃል ያረጋግጡ እና እንደገና ይሞክሩ።", fields: { - fullNameEn: 'ሙሉ ስም (እንግሊዝኛ)', - fullNameAm: 'ሙሉ ስም (አማርኛ)', - username: 'የተጠቃሚ ስም', - usernameHint: 'የተጠቃሚ ስም መቀየር አይቻልም', - organization: 'ድርጅት', - email: 'የኢሜይል አድራሻ', - phone: 'ስልክ ቁጥር', - address: 'አድራሻ', - language: 'የሚመረጥ ቋንቋ', - currentPassword: 'የአሁኑ የይለፍ ቃል', - newPassword: 'አዲስ የይለፍ ቃል', - confirmPassword: 'አዲስ የይለፍ ቃል ያረጋግጡ', + fullNameEn: "ሙሉ ስም (እንግሊዝኛ)", + fullNameAm: "ሙሉ ስም (አማርኛ)", + username: "የተጠቃሚ ስም", + usernameHint: "የተጠቃሚ ስም መቀየር አይቻልም", + organization: "ድርጅት", + email: "የኢሜይል አድራሻ", + phone: "ስልክ ቁጥር", + address: "አድራሻ", + language: "የሚመረጥ ቋንቋ", + currentPassword: "የአሁኑ የይለፍ ቃል", + newPassword: "አዲስ የይለፍ ቃል", + confirmPassword: "አዲስ የይለፍ ቃል ያረጋግጡ", }, validation: { - nameRequired: 'ስም ያስፈልጋል', - emailInvalid: 'የሚሰራ ኢሜይል ያስገቡ', - usernameRequired: 'የተጠቃሚ ስም ያስፈልጋል', - phoneRequired: 'ስልክ ቁጥር ያስፈልጋል', - passwordMin: 'የይለፍ ቃል ቢያንስ 8 ቁምፊዎች መሆን አለበት', - passwordMismatch: 'የይለፍ ቃላት አይዛመዱም', + nameRequired: "ስም ያስፈልጋል", + emailInvalid: "የሚሰራ ኢሜይል ያስገቡ", + usernameRequired: "የተጠቃሚ ስም ያስፈልጋል", + phoneRequired: "ስልክ ቁጥር ያስፈልጋል", + passwordMin: "የይለፍ ቃል ቢያንስ 8 ቁምፊዎች መሆን አለበት", + passwordMismatch: "የይለፍ ቃላት አይዛመዱም", }, }, certification: { - title: 'የምስክር ወረቀቶች', - subtitle: 'የምስክር ወረቀት አይነቶችን ያስተዳድሩ (ለምሳሌ CoC, CoP)', - add: 'የምስክር ወረቀት ያክሉ', - noItems: 'ምንም የምስክር ወረቀቶች አልተገኙም', - confirmDelete: 'የምስክር ወረቀት ይሰረዝ', - deleteConfirmText: 'እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?', - created: 'የምስክር ወረቀት ተፈጥሯል', - updated: 'የምስክር ወረቀት ዘምኗል', - deleted: 'የምስክር ወረቀት ተሰርዟል', - error: 'ክዋኔው አልተሳካም', - loadError: 'የምስክር ወረቀቶችን በመጫን ላይ ስህተት', - cancel: 'ሰርዝ', - create: 'ፍጠር', - update: 'አዘምን', - delete: 'ሰርዝ', + title: "የምስክር ወረቀቶች", + subtitle: "የምስክር ወረቀት አይነቶችን ያስተዳድሩ (ለምሳሌ CoC, CoP)", + add: "የምስክር ወረቀት ያክሉ", + noItems: "ምንም የምስክር ወረቀቶች አልተገኙም", + confirmDelete: "የምስክር ወረቀት ይሰረዝ", + deleteConfirmText: "እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?", + created: "የምስክር ወረቀት ተፈጥሯል", + updated: "የምስክር ወረቀት ዘምኗል", + deleted: "የምስክር ወረቀት ተሰርዟል", + error: "ክዋኔው አልተሳካም", + loadError: "የምስክር ወረቀቶችን በመጫን ላይ ስህተት", + cancel: "ሰርዝ", + create: "ፍጠር", + update: "አዘምን", + delete: "ሰርዝ", columns: { - name: 'ስም', - description: 'መግለጫ', - status: 'ሁኔታ', + name: "ስም", + description: "መግለጫ", + status: "ሁኔታ", }, form: { - nameEn: 'ስም (እንግሊዝኛ)', - nameEnPlaceholder: 'የምስክር ወረቀት ስም በእንግሊዝኛ', - nameAm: 'ስም (አማርኛ)', - nameAmPlaceholder: 'የምስክር ወረቀት ስም', - descEn: 'መግለጫ (እንግሊዝኛ)', - descEnPlaceholder: 'የእንግሊዝኛ መግለጫ', - descAm: 'መግለጫ (አማርኛ)', - descAmPlaceholder: 'የአማርኛ መግለጫ', + nameEn: "ስም (እንግሊዝኛ)", + nameEnPlaceholder: "የምስክር ወረቀት ስም በእንግሊዝኛ", + nameAm: "ስም (አማርኛ)", + nameAmPlaceholder: "የምስክር ወረቀት ስም", + descEn: "መግለጫ (እንግሊዝኛ)", + descEnPlaceholder: "የእንግሊዝኛ መግለጫ", + descAm: "መግለጫ (አማርኛ)", + descAmPlaceholder: "የአማርኛ መግለጫ", }, status: { - active: 'ንቁ', - inactive: 'እንቅስቃሴ የሌለ', + active: "ንቁ", + inactive: "እንቅስቃሴ የሌለ", }, }, result: { - title: 'የፈተና ውጤቶች', - subtitle: 'የመርከበኞችን የፈተና ውጤቶች እና የውጤት ክፍፍል ይመልከቱ', - record: 'ውጤት ያስመዝግቡ', - noItems: 'ምንም ውጤት አልተገኘም', - noData: 'ምንም መረጃ የለም', - created: 'ውጤት በተሳካ ሁኔታ ተመዝግቧል', - updated: 'ውጤት በተሳካ ሁኔታ ዘምኗል', - deleted: 'ውጤት በተሳካ ሁኔታ ተሰርዟል', - error: 'ክዋኔው አልተሳካም', - loadError: 'ውጤቶችን በማምጣት ላይ ስህተት', - cancel: 'ሰርዝ', - delete: 'ሰርዝ', - close: 'ዝጋ', - save: 'አስቀምጥ', - saveResult: 'ውጤት አስቀምጥ', - section: 'ውጤቶች', - selectExamError: 'እባክዎ ፈተና ይምረጡ', - continue: 'ቀጥል', - confirmDelete: 'ውጤት ሰርዝ', - deleteConfirmText: 'እርግጠኛ ነዎት ይህን ውጤት መሰረዝ ይፈልጋሉ?', + title: "የፈተና ውጤቶች", + subtitle: "የመርከበኞችን የፈተና ውጤቶች እና የውጤት ክፍፍል ይመልከቱ", + record: "ውጤት ያስመዝግቡ", + noItems: "ምንም ውጤት አልተገኘም", + noData: "ምንም መረጃ የለም", + created: "ውጤት በተሳካ ሁኔታ ተመዝግቧል", + updated: "ውጤት በተሳካ ሁኔታ ዘምኗል", + deleted: "ውጤት በተሳካ ሁኔታ ተሰርዟል", + error: "ክዋኔው አልተሳካም", + loadError: "ውጤቶችን በማምጣት ላይ ስህተት", + cancel: "ሰርዝ", + delete: "ሰርዝ", + close: "ዝጋ", + save: "አስቀምጥ", + saveResult: "ውጤት አስቀምጥ", + section: "ውጤቶች", + selectExamError: "እባክዎ ፈተና ይምረጡ", + continue: "ቀጥል", + confirmDelete: "ውጤት ሰርዝ", + deleteConfirmText: "እርግጠኛ ነዎት ይህን ውጤት መሰረዝ ይፈልጋሉ?", stats: { - totalResults: 'ጠቅላላ ውጤቶች', - passed: 'ያለፉ', - failed: 'ያልተሳኩ', - avgScore: 'አማካይ ውጤት', + totalResults: "ጠቅላላ ውጤቶች", + passed: "ያለፉ", + failed: "ያልተሳኩ", + avgScore: "አማካይ ውጤት", }, columns: { - seafarer: 'መርከበኛ', - exam: 'ፈተና', - totalScore: 'ጠቅላላ ውጤት', - status: 'ሁኔታ', - date: 'ቀን', + seafarer: "መርከበኛ", + exam: "ፈተና", + totalScore: "ጠቅላላ ውጤት", + status: "ሁኔታ", + date: "ቀን", }, detail: { - title: 'የውጤት ዝርዝር', - seafarerProfile: 'የመርከበኛ መገለጫ', - examDetails: 'የፈተና ዝርዝሮች', - fullName: 'ሙሉ ስም', - gender: 'ፆታ', - dateOfBirth: 'የትውልድ ቀን', - maritalStatus: 'የትዳር ሁኔታ', - examTitle: 'የፈተና ርዕስ', - titleAm: 'ርዕስ (አማርኛ)', - type: 'አይነት', - venue: 'ቦታ', - date: 'ቀን', - passMark: 'ማለፊያ ውጤት', - status: 'ሁኔታ', - remark: 'ማስታወሻ', - scoreBreakdown: 'የውጤት ክፍፍል', - question: 'ጥያቄ', - max: 'ከፍተኛ', - score: 'ውጤት', - remarkShort: 'ማስታወሻ', - selectExam: 'ውጤት ለመመዝገብ የሚፈልጉትን ፈተና ይምረጡ።', - exam: 'ፈተና', - selectExamPlaceholder: 'ፈተና ይምረጡ', + title: "የውጤት ዝርዝር", + seafarerProfile: "የመርከበኛ መገለጫ", + examDetails: "የፈተና ዝርዝሮች", + fullName: "ሙሉ ስም", + gender: "ፆታ", + dateOfBirth: "የትውልድ ቀን", + maritalStatus: "የትዳር ሁኔታ", + examTitle: "የፈተና ርዕስ", + titleAm: "ርዕስ (አማርኛ)", + type: "አይነት", + venue: "ቦታ", + date: "ቀን", + passMark: "ማለፊያ ውጤት", + status: "ሁኔታ", + remark: "ማስታወሻ", + scoreBreakdown: "የውጤት ክፍፍል", + question: "ጥያቄ", + max: "ከፍተኛ", + score: "ውጤት", + remarkShort: "ማስታወሻ", + selectExam: "ውጤት ለመመዝገብ የሚፈልጉትን ፈተና ይምረጡ።", + exam: "ፈተና", + selectExamPlaceholder: "ፈተና ይምረጡ", }, recordModal: { - title: 'ውጤት ያስመዝግቡ', - seafarer: 'መርከበኛ', - seafarerPlaceholder: 'መርከበኛ ይፈልጉ እና ይምረጡ', - scorePerQuestion: 'በጥያቄ ውጤት', - question: 'ጥያቄ', - maxPoints: 'ከፍተኛ ውጤት', - score: 'ውጤት', - remark: 'ማስታወሻ', - remarkOptional: 'ማስታወሻ (አማራጭ)', - remarkPlaceholder: 'የኦፊሰር ማስታወሻ', - totalScore: 'ጠቅላላ ውጤት', - passMark: 'ማለፊያ ውጤት', - status: 'ሁኔታ', - noQuestions: 'ለዚህ ፈተና ምንም ጥያቄዎች አልተመደቡም። መጀመሪያ ጥያቄዎችን ይመድቡ።', - seafarerRequired: 'እባክዎ መርከበኛ ይምረጡ', - saveSuccess: 'ውጤት ተመዝግቧል', - saveError: 'ውጤቱን ማስቀመጥ አልተሳካም', - passed: 'አልፏል', - failed: 'አልተሳካም', + title: "ውጤት ያስመዝግቡ", + seafarer: "መርከበኛ", + seafarerPlaceholder: "መርከበኛ ይፈልጉ እና ይምረጡ", + scorePerQuestion: "በጥያቄ ውጤት", + question: "ጥያቄ", + maxPoints: "ከፍተኛ ውጤት", + score: "ውጤት", + remark: "ማስታወሻ", + remarkOptional: "ማስታወሻ (አማራጭ)", + remarkPlaceholder: "የኦፊሰር ማስታወሻ", + totalScore: "ጠቅላላ ውጤት", + passMark: "ማለፊያ ውጤት", + status: "ሁኔታ", + noQuestions: "ለዚህ ፈተና ምንም ጥያቄዎች አልተመደቡም። መጀመሪያ ጥያቄዎችን ይመድቡ።", + seafarerRequired: "እባክዎ መርከበኛ ይምረጡ", + saveSuccess: "ውጤት ተመዝግቧል", + saveError: "ውጤቱን ማስቀመጥ አልተሳካም", + passed: "አልፏል", + failed: "አልተሳካም", }, status: { - PASSED: 'አልፏል', - FAILED: 'አልተሳካም', + PASSED: "አልፏል", + FAILED: "አልተሳካም", }, action: { - viewEdit: 'ተመልከት / አስተካክል', - delete: 'ሰርዝ', + viewEdit: "ተመልከት / አስተካክል", + delete: "ሰርዝ", }, search: { - seafarer: 'መርከበኛ ይፈልጉ...', - filterByExam: 'በፈተና አጣራ', - allExams: 'ሁሉም ፈተናዎች', + seafarer: "መርከበኛ ይፈልጉ...", + filterByExam: "በፈተና አጣራ", + allExams: "ሁሉም ፈተናዎች", }, review: { - column: 'ግምገማ', - MARKED: 'ተስተካክሏል', - MODERATED: 'ተመርምሯል', - APPROVED: 'ጸድቋል', - PUBLISHED: 'ወጥቷል', - moderate: 'አስተካክል', - approve: 'አጽድቅ', - return: 'ወደ ፈታኙ መልስ', - publish: 'የፈተናውን ውጤቶች አውጣ', - adjustment: 'በጠቅላላ ውጤት ላይ የሚደረግ ማስተካከያ', - adjustmentHint: 'እንደ 3 ወይም -2 ያለ ለውጥ። ዜሮ ውጤቱን እንዳለ ያጸድቃል።', - remark: 'ምክንያት', - remarkRequired: 'ምክንያት ያስፈልጋል።', - moderated: 'ውጤቶች ተስተካክለዋል', - approved: 'ውጤት ጸድቋል', - returned: 'ውጤት ወደ ፈታኙ ተመልሷል', - publishedCount: '{{published}} ውጤቶች ወጥተዋል፤ {{skipped}} ተዘለዋል።', - publishNeedsExam: 'ውጤቶችን ለማውጣት መጀመሪያ በፈተና ያጣሩ።', - lockedAfterApproval: - 'ይህ ውጤት ጸድቋል፤ ማስተካከል አይቻልም። መጀመሪያ ወደ ፈታኙ ይመልሱት።', - originalScore: 'የፈታኙ ጠቅላላ', - derivedStatus: 'ውጤት (ከማለፊያ ነጥብ የተገኘ)', - error: 'ተግባሩ አልተሳካም', + column: "ግምገማ", + MARKED: "ተስተካክሏል", + MODERATED: "ተመርምሯል", + APPROVED: "ጸድቋል", + PUBLISHED: "ወጥቷል", + moderate: "አስተካክል", + approve: "አጽድቅ", + return: "ወደ ፈታኙ መልስ", + publish: "የፈተናውን ውጤቶች አውጣ", + adjustment: "በጠቅላላ ውጤት ላይ የሚደረግ ማስተካከያ", + adjustmentHint: "እንደ 3 ወይም -2 ያለ ለውጥ። ዜሮ ውጤቱን እንዳለ ያጸድቃል።", + remark: "ምክንያት", + remarkRequired: "ምክንያት ያስፈልጋል።", + moderated: "ውጤቶች ተስተካክለዋል", + approved: "ውጤት ጸድቋል", + returned: "ውጤት ወደ ፈታኙ ተመልሷል", + publishedCount: "{{published}} ውጤቶች ወጥተዋል፤ {{skipped}} ተዘለዋል።", + publishNeedsExam: "ውጤቶችን ለማውጣት መጀመሪያ በፈተና ያጣሩ።", + lockedAfterApproval: "ይህ ውጤት ጸድቋል፤ ማስተካከል አይቻልም። መጀመሪያ ወደ ፈታኙ ይመልሱት።", + originalScore: "የፈታኙ ጠቅላላ", + derivedStatus: "ውጤት (ከማለፊያ ነጥብ የተገኘ)", + error: "ተግባሩ አልተሳካም", }, appeals: { - title: 'የፈተና ይግባኞች', - subtitle: 'ተፈታኞች በወጡ ውጤቶች ላይ ያቀረቡት ቅሬታ', - number: 'የይግባኝ ቁጥር', - candidate: 'ተፈታኝ', - exam: 'ፈተና', - reason: 'ምክንያት', - lodged: 'የቀረበበት', - decide: 'ወስን', - uphold: 'ተቀበል', - reject: 'አትቀበል', - remark: 'ውሳኔና ምክንያት', - decided: 'ይግባኙ ተወስኗል', - none: 'ውሳኔ የሚጠብቅ ይግባኝ የለም።', + title: "የፈተና ይግባኞች", + subtitle: "ተፈታኞች በወጡ ውጤቶች ላይ ያቀረቡት ቅሬታ", + number: "የይግባኝ ቁጥር", + candidate: "ተፈታኝ", + exam: "ፈተና", + reason: "ምክንያት", + lodged: "የቀረበበት", + decide: "ወስን", + uphold: "ተቀበል", + reject: "አትቀበል", + remark: "ውሳኔና ምክንያት", + decided: "ይግባኙ ተወስኗል", + none: "ውሳኔ የሚጠብቅ ይግባኝ የለም።", upheldHint: - 'ይግባኙን መቀበል ውጤቱን ለድጋሚ እርማት ወደ ፈታኙ ይመልሰዋል፤ እስኪጸድቅና እንደገና እስኪወጣ ተፈታኙ አያየውም።', - error: 'ውሳኔውን መመዝገብ አልተቻለም', + "ይግባኙን መቀበል ውጤቱን ለድጋሚ እርማት ወደ ፈታኙ ይመልሰዋል፤ እስኪጸድቅና እንደገና እስኪወጣ ተፈታኙ አያየውም።", + error: "ውሳኔውን መመዝገብ አልተቻለም", }, }, question: { - title: 'ጥያቄዎች', - pool: 'የጥያቄ ማከማቻ', - filterByCertification: 'በምስክር ወረቀት አጣራ', - noQuestions: 'ምንም ጥያቄዎች አልተገኙም', - addQuestion: 'ጥያቄ ያክሉ', - editQuestion: 'ጥያቄ ያስተካክሉ', - confirmDelete: 'መሰረዝን ያረጋግጡ', - deleteConfirmText: 'እርግጠኛ ነዎት ይህን ጥያቄ መሰረዝ ይፈልጋሉ?', - created: 'ጥያቄ ተፈጥሯል', - updated: 'ጥያቄ ዘምኗል', - deleted: 'ጥያቄ ተሰርዟል', - error: 'ክዋኔው አልተሳካም', - loadError: 'ጥያቄዎችን በመጫን ላይ ስህተት', - cancel: 'ሰርዝ', - create: 'ፍጠር', - update: 'አዘምን', - delete: 'ሰርዝ', + title: "ጥያቄዎች", + pool: "የጥያቄ ማከማቻ", + filterByCertification: "በምስክር ወረቀት አጣራ", + noQuestions: "ምንም ጥያቄዎች አልተገኙም", + addQuestion: "ጥያቄ ያክሉ", + editQuestion: "ጥያቄ ያስተካክሉ", + confirmDelete: "መሰረዝን ያረጋግጡ", + deleteConfirmText: "እርግጠኛ ነዎት ይህን ጥያቄ መሰረዝ ይፈልጋሉ?", + created: "ጥያቄ ተፈጥሯል", + updated: "ጥያቄ ዘምኗል", + deleted: "ጥያቄ ተሰርዟል", + error: "ክዋኔው አልተሳካም", + loadError: "ጥያቄዎችን በመጫን ላይ ስህተት", + cancel: "ሰርዝ", + create: "ፍጠር", + update: "አዘምን", + delete: "ሰርዝ", columns: { - title: 'ርዕስ', - certification: 'የምስክር ወረቀት', - form: 'ቅጽ', - points: 'ነጥብ', - status: 'ሁኔታ', + title: "ርዕስ", + certification: "የምስክር ወረቀት", + form: "ቅጽ", + points: "ነጥብ", + status: "ሁኔታ", }, form: { - certification: 'የምስክር ወረቀት', - selectCertification: 'የምስክር ወረቀት ይምረጡ', - titleEn: 'ርዕስ (እንግሊዝኛ)', - titleEnPlaceholder: 'ጥያቄ በእንግሊዝኛ', - titleAm: 'ርዕስ (አማርኛ)', - titleAmPlaceholder: 'ጥያቄ በአማርኛ', - form: 'ቅጽ', - selectForm: 'ቅጽ ይምረጡ', - essay: 'ኢሴይ', - choice: 'ምርጫ', - points: 'ነጥብ', - pointsPlaceholder: 'ነጥብ', - timeAllowed: 'የተፈቀደ ጊዜ', - days: 'ቀናት', - hours: 'ሰአታት', - minutes: 'ደቂቃዎች', + certification: "የምስክር ወረቀት", + selectCertification: "የምስክር ወረቀት ይምረጡ", + titleEn: "ርዕስ (እንግሊዝኛ)", + titleEnPlaceholder: "ጥያቄ በእንግሊዝኛ", + titleAm: "ርዕስ (አማርኛ)", + titleAmPlaceholder: "ጥያቄ በአማርኛ", + form: "ቅጽ", + selectForm: "ቅጽ ይምረጡ", + essay: "ኢሴይ", + choice: "ምርጫ", + points: "ነጥብ", + pointsPlaceholder: "ነጥብ", + timeAllowed: "የተፈቀደ ጊዜ", + days: "ቀናት", + hours: "ሰአታት", + minutes: "ደቂቃዎች", }, status: { - active: 'ንቁ', - inactive: 'እንቅስቃሴ የሌለ', + active: "ንቁ", + inactive: "እንቅስቃሴ የሌለ", }, qc: { - column: 'ማጽደቅ', - DRAFT: 'ረቂቅ', - PENDING_APPROVAL: 'ማጽደቅ በመጠባበቅ ላይ', - APPROVED: 'ጸድቋል', - REJECTED: 'ተቀባይነት አላገኘም', - RETIRED: 'ከአገልግሎት ወጥቷል', - submit: 'ለማጽደቅ ላክ', - approve: 'አጽድቅ', - reject: 'አትቀበል', - retire: 'ከአገልግሎት አውጣ', - remark: 'ምክንያት', - remarkRequired: 'ላለመቀበል ወይም ከአገልግሎት ለማውጣት ምክንያት ያስፈልጋል።', - submitted: 'ለማጽደቅ ተልኳል', - reviewed: 'ውሳኔ ተመዝግቧል', - reviewTitle: 'የጥያቄ ማከማቻ ንጥል ግምገማ', - onlyApprovedUsable: 'የጸደቁ ጥያቄዎች ብቻ በፈተና ወረቀት ላይ ሊቀመጡ ይችላሉ።', - error: 'ተግባሩ አልተሳካም', + column: "ማጽደቅ", + DRAFT: "ረቂቅ", + PENDING_APPROVAL: "ማጽደቅ በመጠባበቅ ላይ", + APPROVED: "ጸድቋል", + REJECTED: "ተቀባይነት አላገኘም", + RETIRED: "ከአገልግሎት ወጥቷል", + submit: "ለማጽደቅ ላክ", + approve: "አጽድቅ", + reject: "አትቀበል", + retire: "ከአገልግሎት አውጣ", + remark: "ምክንያት", + remarkRequired: "ላለመቀበል ወይም ከአገልግሎት ለማውጣት ምክንያት ያስፈልጋል።", + submitted: "ለማጽደቅ ተልኳል", + reviewed: "ውሳኔ ተመዝግቧል", + reviewTitle: "የጥያቄ ማከማቻ ንጥል ግምገማ", + onlyApprovedUsable: "የጸደቁ ጥያቄዎች ብቻ በፈተና ወረቀት ላይ ሊቀመጡ ይችላሉ።", + error: "ተግባሩ አልተሳካም", }, }, configuration: { - title: 'ውቅረት', - departments: 'ክፍሎች', - professions: 'ሙያዎች', - departmentsList: 'ክፍሎች', - professionsList: 'ሙያዎች', - addDepartment: 'ክፍል ያክሉ', - addProfession: 'ሙያ ያክሉ', - name: 'ስም', - nameEn: 'ስም (እንግሊዝኛ)', - nameAm: 'ስም (አማርኛ)', - description: 'መግለጫ', - descEn: 'መግለጫ (እንግሊዝኛ)', - descAm: 'መግለጫ (አማርኛ)', - department: 'ክፍል', - selectDepartment: 'ክፍል ይምረጡ', - cancel: 'ሰርዝ', - create: 'ፍጠር', - update: 'አዘምን', - edit: 'አስተካክል', - delete: 'ሰርዝ', - created: 'በተሳካ ሁኔታ ተፈጥሯል', - updated: 'በተሳካ ሁኔታ ዘምኗል', - deleted: 'በተሳካ ሁኔታ ተሰርዟል', - error: 'አንድ ስህተት ተፈጥሯል', - confirmDelete: 'መሰረዝን ያረጋግጡ', - deleteConfirmText: 'እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?', - noDepartments: 'ገና ምንም ክፍሎች አልተገለጹም', - noProfessions: 'ገና ምንም ሙያዎች አልተገለጹም', + title: "ውቅረት", + departments: "ክፍሎች", + professions: "ሙያዎች", + departmentsList: "ክፍሎች", + professionsList: "ሙያዎች", + addDepartment: "ክፍል ያክሉ", + addProfession: "ሙያ ያክሉ", + name: "ስም", + nameEn: "ስም (እንግሊዝኛ)", + nameAm: "ስም (አማርኛ)", + description: "መግለጫ", + descEn: "መግለጫ (እንግሊዝኛ)", + descAm: "መግለጫ (አማርኛ)", + department: "ክፍል", + selectDepartment: "ክፍል ይምረጡ", + cancel: "ሰርዝ", + create: "ፍጠር", + update: "አዘምን", + edit: "አስተካክል", + delete: "ሰርዝ", + created: "በተሳካ ሁኔታ ተፈጥሯል", + updated: "በተሳካ ሁኔታ ዘምኗል", + deleted: "በተሳካ ሁኔታ ተሰርዟል", + error: "አንድ ስህተት ተፈጥሯል", + confirmDelete: "መሰረዝን ያረጋግጡ", + deleteConfirmText: "እርግጠኛ ነዎት {{name}}ን መሰረዝ ይፈልጋሉ?", + noDepartments: "ገና ምንም ክፍሎች አልተገለጹም", + noProfessions: "ገና ምንም ሙያዎች አልተገለጹም", validation: { - nameEnRequired: 'የእንግሊዝኛ ስም ያስፈልጋል', - nameAmRequired: 'የአማርኛ ስም ያስፈልጋል', - departmentRequired: 'ክፍል ያስፈልጋል', + nameEnRequired: "የእንግሊዝኛ ስም ያስፈልጋል", + nameAmRequired: "የአማርኛ ስም ያስፈልጋል", + departmentRequired: "ክፍል ያስፈልጋል", }, }, queue: { - title: 'የፈቃድ ማመልከቻዎች', - search: 'ፍለጋ', - searchPlaceholder: 'ኩባንያ፣ ቲን ወይም ቁጥር', - status: 'ሁኔታ', - anyStatus: 'ማንኛውም', - type: 'የፈቃድ ዓይነት', - anyType: 'ማንኛውም', - typeCol: 'ዓይነት', - statusCol: 'ሁኔታ', - submittedFrom: 'ከቀን ጀምሮ የቀረበ', - submittedTo: 'እስከ ቀን የቀረበ', - clearFilters: 'አጽዳ', - refresh: 'አድስ', - export: 'ወደ CSV ላክ', - exportTruncated: 'ወደ ውጭ መላክ ተቆርጧል', - exportTruncatedBody: 'ከ{{total}} ረድፎች ውስጥ የመጀመሪያዎቹ {{exported}} ተልከዋል። ለቀሪው ማጣሪያውን ያጥቡ።', - exportFailed: 'ወደ ውጭ መላክ አልተሳካም', - comfortable: 'ሰፊ', - compact: 'ጥብቅ', - number: 'ማመልከቻ ቁ.', - company: 'ኩባንያ', - applicant: 'አመልካች', - tin: 'ቲን', - submitted: 'የቀረበበት', - sla: 'ዕድሜ / የጊዜ ገደብ', - claim: 'ውሰድ', - review: 'ገምግም', - claimed: 'ተወስዷል', - claimedBody: 'ማመልከቻው አሁን ለእርስዎ ተመድቧል።', - claimFailed: 'መውሰድ አልተቻለም', - claimRace: 'ሌላ ሹም አስቀድሞ ወስዶታል።', - bulkClaim_one: '{{count}} ውሰድ', - bulkClaim_other: '{{count}} ውሰድ', - bulkClaimed_one: '{{count}} ተወስዷል', - bulkClaimed_other: '{{count}} ተወስደዋል', - bulkClaimPartial_one: '{{count}} አስቀድሞ በሌላ ሹም ተወስዷል።', - bulkClaimPartial_other: '{{count}} አስቀድሞ በሌሎች ሹማምንት ተወስደዋል።', - selectAll: 'ሁሉንም ምረጥ', - selectRow: '{{number}} ምረጥ', - selectedCount_one: '{{count}} ተመርጧል', - selectedCount_other: '{{count}} ተመርጠዋል', - showing: 'ከ{{total}} ውስጥ {{from}}–{{to}} በማሳየት ላይ', - empty: 'እዚህ የሚጠብቅ ነገር የለም', - emptyBody: 'አዲስ ማመልከቻዎች ሲቀርቡ እዚህ ይታያሉ።', - emptyFiltered: 'በእነዚህ ማጣሪያዎች የሚዛመድ ማመልከቻ የለም', - emptyFilteredBody: 'ማጣሪያዎቹን ለማስፋት ወይም ለማጽዳት ይሞክሩ።', - errorTitle: 'ወረፋውን መጫን አልተቻለም', + title: "የፈቃድ ማመልከቻዎች", + search: "ፍለጋ", + searchPlaceholder: "ኩባንያ፣ ቲን ወይም ቁጥር", + status: "ሁኔታ", + anyStatus: "ማንኛውም", + type: "የፈቃድ ዓይነት", + anyType: "ማንኛውም", + typeCol: "ዓይነት", + statusCol: "ሁኔታ", + submittedFrom: "ከቀን ጀምሮ የቀረበ", + submittedTo: "እስከ ቀን የቀረበ", + clearFilters: "አጽዳ", + refresh: "አድስ", + export: "ወደ CSV ላክ", + exportTruncated: "ወደ ውጭ መላክ ተቆርጧል", + exportTruncatedBody: + "ከ{{total}} ረድፎች ውስጥ የመጀመሪያዎቹ {{exported}} ተልከዋል። ለቀሪው ማጣሪያውን ያጥቡ።", + exportFailed: "ወደ ውጭ መላክ አልተሳካም", + comfortable: "ሰፊ", + compact: "ጥብቅ", + number: "ማመልከቻ ቁ.", + company: "ኩባንያ", + applicant: "አመልካች", + tin: "ቲን", + submitted: "የቀረበበት", + sla: "ዕድሜ / የጊዜ ገደብ", + claim: "ውሰድ", + review: "ገምግም", + claimed: "ተወስዷል", + claimedBody: "ማመልከቻው አሁን ለእርስዎ ተመድቧል።", + claimFailed: "መውሰድ አልተቻለም", + claimRace: "ሌላ ሹም አስቀድሞ ወስዶታል።", + bulkClaim_one: "{{count}} ውሰድ", + bulkClaim_other: "{{count}} ውሰድ", + bulkClaimed_one: "{{count}} ተወስዷል", + bulkClaimed_other: "{{count}} ተወስደዋል", + bulkClaimPartial_one: "{{count}} አስቀድሞ በሌላ ሹም ተወስዷል።", + bulkClaimPartial_other: "{{count}} አስቀድሞ በሌሎች ሹማምንት ተወስደዋል።", + selectAll: "ሁሉንም ምረጥ", + selectRow: "{{number}} ምረጥ", + selectedCount_one: "{{count}} ተመርጧል", + selectedCount_other: "{{count}} ተመርጠዋል", + showing: "ከ{{total}} ውስጥ {{from}}–{{to}} በማሳየት ላይ", + empty: "እዚህ የሚጠብቅ ነገር የለም", + emptyBody: "አዲስ ማመልከቻዎች ሲቀርቡ እዚህ ይታያሉ።", + emptyFiltered: "በእነዚህ ማጣሪያዎች የሚዛመድ ማመልከቻ የለም", + emptyFilteredBody: "ማጣሪያዎቹን ለማስፋት ወይም ለማጽዳት ይሞክሩ።", + errorTitle: "ወረፋውን መጫን አልተቻለም", views: { - unassigned: 'ያልተመደበ', - mine: 'የእኔ ወረፋ', - awaitingApplicant: 'አመልካችን በመጠባበቅ', - overdue: 'ጊዜው ያለፈበት', - readyToIssue: 'ለመስጠት ዝግጁ', - all: 'ሁሉም', + unassigned: "ያልተመደበ", + mine: "የእኔ ወረፋ", + awaitingApplicant: "አመልካችን በመጠባበቅ", + overdue: "ጊዜው ያለፈበት", + readyToIssue: "ለመስጠት ዝግጁ", + all: "ሁሉም", }, }, review: { - summary: 'ማጠቃለያ', - officer: 'ሹም', - supervisor: 'የበላይ ኃላፊ', - officerPlaceholder: 'ማን እንደሚረከበው ይምረጡ', - noOfficers: 'ምንም ሹም አልተገኘም', - typeToConfirm: 'ለማረጋገጥ {{number}} ይተይቡ', - confirmMismatch: 'አይዛመድም', - type: 'ዓይነት', - tin: 'ቲን', - kind: 'ዓይነት', - submitted: 'የቀረበበት', - slaLabel: 'የጊዜ ገደብ', - eligibility: 'ብቁነት', - statusTimeline: 'ሂደት', - assigned: 'ተመድቧል', - decisionBar: 'የውሳኔ አሞሌ', - moreActions: 'ተጨማሪ ተግባራት', - irreversible: 'መመለስ አይቻልም', - irreversibleWarning: 'ይህ ውሳኔ የመጨረሻ ሲሆን ከጀርባ ቢሮ መመለስ አይቻልም።', - irreversibleAck: 'ይህ የመጨረሻ መሆኑን ተረድቻለሁ', - reasonCode: 'ምክንያት', - reasonCodePlaceholder: 'ምክንያት ይምረጡ', - reasonDetail: 'ለአመልካቹ ዝርዝር', - reasonDetailHint: 'ይህ ጽሑፍ ለአመልካቹ እንዳለ ይላካል።', - deficiencies: 'አመልካቹ ማስተካከል ያለበት ነገሮች', - deficienciesHint: 'የተመረጡት ብቻ ለአመልካቹ ሊስተካከሉ ይችላሉ።', - notificationPreview: 'ለአመልካቹ የሚላክ መልእክት', - notificationPreviewHint: 'በኤስኤምኤስ እና ኢሜይል ይላካል። ከማረጋገጥዎ በፊት ያስተካክሉ።', - needsCorrection: 'ማስተካከያ ያስፈልገዋል', - correctionPlaceholder: 'አመልካቹ ምን ማስተካከል አለበት?', - verifiedCapital: 'የተረጋገጠ ካፒታል (ብር)', - capitalHint: 'ዝቅተኛ {{min}} — ከባንክ ደብዳቤ ጋር ያረጋግጡ', - capitalHintNoMin: 'ከባንክ ደብዳቤ ጋር ተረጋግጧል', - capitalLocked: 'በዚህ ደረጃ ካፒታል ማስተካከል አይቻልም።', - belowMinimum: 'ከ{{min}} ዝቅተኛ በታች', - declared: 'አመልካቹ ያሳወቀው', - role: 'ሚና', - name: 'ስም', - evidence: 'ማስረጃ', - noInspections: 'እስካሁን ምርመራ አልተያዘም።', - unscheduled: 'አልተያዘም', - inspectionResult: 'የምርመራ ውጤት', - findings: 'ግኝቶች', - dateTime: 'ቀን እና ሰዓት', - schedule: 'ያዝ', - pickDate: 'መጀመሪያ ቀን እና ሰዓት ይምረጡ', - passed: 'አልፏል', - failed: 'ወድቋል', - round_one: 'ዙር {{count}}', - round_other: 'ዙር {{count}}', - theApplicant: 'አመልካቹ', - linkCopied: 'አገናኝ ተቀድቷል', - actionFailed: 'ተግባሩ አልተሳካም', - errorTitle: 'ይህን ማመልከቻ መጫን አልተቻለም', - hideActivity: 'እንቅስቃሴ ደብቅ', - showActivity: 'እንቅስቃሴ አሳይ', - awaitingPayment: 'አመልካቹ {{amount}} {{currency}} እንዲከፍል በመጠባበቅ ላይ።', + summary: "ማጠቃለያ", + officer: "ሹም", + supervisor: "የበላይ ኃላፊ", + officerPlaceholder: "ማን እንደሚረከበው ይምረጡ", + noOfficers: "ምንም ሹም አልተገኘም", + typeToConfirm: "ለማረጋገጥ {{number}} ይተይቡ", + confirmMismatch: "አይዛመድም", + type: "ዓይነት", + tin: "ቲን", + kind: "ዓይነት", + submitted: "የቀረበበት", + slaLabel: "የጊዜ ገደብ", + eligibility: "ብቁነት", + statusTimeline: "ሂደት", + assigned: "ተመድቧል", + decisionBar: "የውሳኔ አሞሌ", + moreActions: "ተጨማሪ ተግባራት", + irreversible: "መመለስ አይቻልም", + irreversibleWarning: "ይህ ውሳኔ የመጨረሻ ሲሆን ከጀርባ ቢሮ መመለስ አይቻልም።", + irreversibleAck: "ይህ የመጨረሻ መሆኑን ተረድቻለሁ", + reasonCode: "ምክንያት", + reasonCodePlaceholder: "ምክንያት ይምረጡ", + reasonDetail: "ለአመልካቹ ዝርዝር", + reasonDetailHint: "ይህ ጽሑፍ ለአመልካቹ እንዳለ ይላካል።", + deficiencies: "አመልካቹ ማስተካከል ያለበት ነገሮች", + deficienciesHint: "የተመረጡት ብቻ ለአመልካቹ ሊስተካከሉ ይችላሉ።", + notificationPreview: "ለአመልካቹ የሚላክ መልእክት", + notificationPreviewHint: "በኤስኤምኤስ እና ኢሜይል ይላካል። ከማረጋገጥዎ በፊት ያስተካክሉ።", + needsCorrection: "ማስተካከያ ያስፈልገዋል", + correctionPlaceholder: "አመልካቹ ምን ማስተካከል አለበት?", + verifiedCapital: "የተረጋገጠ ካፒታል (ብር)", + capitalHint: "ዝቅተኛ {{min}} — ከባንክ ደብዳቤ ጋር ያረጋግጡ", + capitalHintNoMin: "ከባንክ ደብዳቤ ጋር ተረጋግጧል", + capitalLocked: "በዚህ ደረጃ ካፒታል ማስተካከል አይቻልም።", + belowMinimum: "ከ{{min}} ዝቅተኛ በታች", + declared: "አመልካቹ ያሳወቀው", + role: "ሚና", + name: "ስም", + evidence: "ማስረጃ", + noInspections: "እስካሁን ምርመራ አልተያዘም።", + unscheduled: "አልተያዘም", + inspectionResult: "የምርመራ ውጤት", + findings: "ግኝቶች", + dateTime: "ቀን እና ሰዓት", + schedule: "ያዝ", + pickDate: "መጀመሪያ ቀን እና ሰዓት ይምረጡ", + passed: "አልፏል", + failed: "ወድቋል", + round_one: "ዙር {{count}}", + round_other: "ዙር {{count}}", + theApplicant: "አመልካቹ", + linkCopied: "አገናኝ ተቀድቷል", + actionFailed: "ተግባሩ አልተሳካም", + errorTitle: "ይህን ማመልከቻ መጫን አልተቻለም", + hideActivity: "እንቅስቃሴ ደብቅ", + showActivity: "እንቅስቃሴ አሳይ", + awaitingPayment: "አመልካቹ {{amount}} {{currency}} እንዲከፍል በመጠባበቅ ላይ።", tabs: { - overview: 'አጠቃላይ እይታ', - financials: 'የገንዘብ መረጃ', - documents: 'ሰነዶች', - staff: 'ሠራተኞች', - inspection: 'ምርመራ', + overview: "አጠቃላይ እይታ", + financials: "የገንዘብ መረጃ", + documents: "ሰነዶች", + staff: "ሠራተኞች", + inspection: "ምርመራ", }, actions: { - claim: 'ውሰድ', - assign: 'መድብ', - escalate: 'ወደ ላይ አሳድግ', - hold: 'አግድ', - resume: 'ቀጥል', - completeReview: 'ግምገማ አጠናቅቅ', - approveDocuments: 'ሰነዶችን አጽድቅ', - scheduleInspection: 'ምርመራ ያዝ', - recordInspection: 'የምርመራ ውጤት መዝግብ', - finalApprove: 'አጽድቅ እና ስጥ', - requestAdjustment: 'ማስተካከያ ጠይቅ', - reject: 'አትቀበል', - confirmPayment: 'ክፍያ አረጋግጥ', - print: 'ሰነድ አትም', - copyLink: 'አገናኝ ቅዳ', - downloadDocuments: 'ሁሉንም ሰነዶች አውርድ', - generateCertificate: 'ሰርተፍኬት አዘጋጅ', - auditTrail: 'የኦዲት መዝገብ አሳይ', + claim: "ውሰድ", + assign: "መድብ", + escalate: "ወደ ላይ አሳድግ", + hold: "አግድ", + resume: "ቀጥል", + completeReview: "ግምገማ አጠናቅቅ", + approveDocuments: "ሰነዶችን አጽድቅ", + scheduleInspection: "ምርመራ ያዝ", + recordInspection: "የምርመራ ውጤት መዝግብ", + finalApprove: "አጽድቅ እና ስጥ", + requestAdjustment: "ማስተካከያ ጠይቅ", + reject: "አትቀበል", + confirmPayment: "ክፍያ አረጋግጥ", + print: "ሰነድ አትም", + copyLink: "አገናኝ ቅዳ", + downloadDocuments: "ሁሉንም ሰነዶች አውርድ", + generateCertificate: "ሰርተፍኬት አዘጋጅ", + auditTrail: "የኦዲት መዝገብ አሳይ", }, disabled: { - wrongStatus: 'በዚህ ደረጃ አይገኝም', - notAssigned: 'ለሌላ ሹም ተመድቧል', - noPermission: 'ፈቃድ የለዎትም', - needsFlags: 'ማስተካከያ ለመጠየቅ ቢያንስ አንድ ነገር ምልክት ያድርጉ', - needsCapital: 'መጀመሪያ የተረጋገጠውን ካፒታል ይመዝግቡ', - needsInspection: 'የምርመራ ውጤት ያስፈልጋል', + wrongStatus: "በዚህ ደረጃ አይገኝም", + notAssigned: "ለሌላ ሹም ተመድቧል", + noPermission: "ፈቃድ የለዎትም", + needsFlags: "ማስተካከያ ለመጠየቅ ቢያንስ አንድ ነገር ምልክት ያድርጉ", + needsCapital: "መጀመሪያ የተረጋገጠውን ካፒታል ይመዝግቡ", + needsInspection: "የምርመራ ውጤት ያስፈልጋል", }, reasons: { - incompleteDocuments: 'ያልተሟሉ ሰነዶች', - belowCapital: 'ካፒታል ከሚያስፈልገው በታች', - failedInspection: 'ምርመራ ወድቋል', - ineligibleApplicant: 'አመልካቹ ብቁ አይደለም', - duplicateApplication: 'ተደጋጋሚ ማመልከቻ', - illegibleDocument: 'ሰነዱ አይነበብም', - expiredDocument: 'ሰነዱ ጊዜው አልፎበታል', - missingDocument: 'ሰነዱ ጠፍቷል', - inconsistentDetails: 'ዝርዝሮቹ ከሰነዶቹ ጋር አይዛመዱም', - awaitingThirdParty: 'የሶስተኛ ወገን ማረጋገጫ በመጠባበቅ', - legalProceedings: 'በሕግ ሂደት ላይ', - applicantRequest: 'በአመልካቹ ጥያቄ', - aboveAuthority: 'ከእኔ የማጽደቅ ሥልጣን በላይ', - policyUnclear: 'የፖሊሲ መመሪያ ያስፈልጋል', - conflictOfInterest: 'የጥቅም ግጭት', + incompleteDocuments: "ያልተሟሉ ሰነዶች", + belowCapital: "ካፒታል ከሚያስፈልገው በታች", + failedInspection: "ምርመራ ወድቋል", + ineligibleApplicant: "አመልካቹ ብቁ አይደለም", + duplicateApplication: "ተደጋጋሚ ማመልከቻ", + illegibleDocument: "ሰነዱ አይነበብም", + expiredDocument: "ሰነዱ ጊዜው አልፎበታል", + missingDocument: "ሰነዱ ጠፍቷል", + inconsistentDetails: "ዝርዝሮቹ ከሰነዶቹ ጋር አይዛመዱም", + awaitingThirdParty: "የሶስተኛ ወገን ማረጋገጫ በመጠባበቅ", + legalProceedings: "በሕግ ሂደት ላይ", + applicantRequest: "በአመልካቹ ጥያቄ", + aboveAuthority: "ከእኔ የማጽደቅ ሥልጣን በላይ", + policyUnclear: "የፖሊሲ መመሪያ ያስፈልጋል", + conflictOfInterest: "የጥቅም ግጭት", }, consequences: { - fallback: 'ይህ ለ{{applicant}} ማመልከቻ {{number}} ያዘምናል።', - 'final-approve': 'ለ{{applicant}} ማመልከቻ {{number}} ያጸድቃል እና የሰርተፍኬት አሰጣጥ ይጀምራል።', - reject: 'ለ{{applicant}} ማመልከቻ {{number}} አይቀበልም። ይህ ማመልከቻውን ያጠናቅቃል።', - 'request-adjustment': 'ማመልከቻ {{number}} ለማስተካከያ ወደ {{applicant}} ይመልሳል።', - hold: 'ለ{{applicant}} ማመልከቻ {{number}} ያግዳል። ለእርስዎ ተመድቦ ይቆያል።', - resume: 'ማመልከቻ {{number}} ወደ ታገደበት ደረጃ ይመልሳል።', - escalate: 'ማመልከቻ {{number}} ለውሳኔ ወደ የበላይ ኃላፊ ያሳድጋል።', - 'confirm-payment': 'ለማመልከቻ {{number}} ክፍያ ያረጋግጣል።', + fallback: "ይህ ለ{{applicant}} ማመልከቻ {{number}} ያዘምናል።", + "final-approve": + "ለ{{applicant}} ማመልከቻ {{number}} ያጸድቃል እና የሰርተፍኬት አሰጣጥ ይጀምራል።", + reject: "ለ{{applicant}} ማመልከቻ {{number}} አይቀበልም። ይህ ማመልከቻውን ያጠናቅቃል።", + "request-adjustment": "ማመልከቻ {{number}} ለማስተካከያ ወደ {{applicant}} ይመልሳል።", + hold: "ለ{{applicant}} ማመልከቻ {{number}} ያግዳል። ለእርስዎ ተመድቦ ይቆያል።", + resume: "ማመልከቻ {{number}} ወደ ታገደበት ደረጃ ይመልሳል።", + escalate: "ማመልከቻ {{number}} ለውሳኔ ወደ የበላይ ኃላፊ ያሳድጋል።", + "confirm-payment": "ለማመልከቻ {{number}} ክፍያ ያረጋግጣል።", }, notifications: { - fallback: 'ውድ {{applicant}}፣ በማመልከቻ {{number}} ላይ ዝማኔ አለ፦ {{action}}።', - 'final-approve': 'ውድ {{applicant}}፣ ማመልከቻ {{number}} ጸድቋል። ሰርተፍኬትዎ በዝግጅት ላይ ነው።', - reject: 'ውድ {{applicant}}፣ ማመልከቻ {{number}} አልጸደቀም። እባክዎ ከታች ያለውን ምክንያት ይመልከቱ።', - 'request-adjustment': 'ውድ {{applicant}}፣ ማመልከቻ {{number}} ከመቀጠሉ በፊት ማስተካከያ ያስፈልገዋል።', + fallback: "ውድ {{applicant}}፣ በማመልከቻ {{number}} ላይ ዝማኔ አለ፦ {{action}}።", + "final-approve": + "ውድ {{applicant}}፣ ማመልከቻ {{number}} ጸድቋል። ሰርተፍኬትዎ በዝግጅት ላይ ነው።", + reject: + "ውድ {{applicant}}፣ ማመልከቻ {{number}} አልጸደቀም። እባክዎ ከታች ያለውን ምክንያት ይመልከቱ።", + "request-adjustment": + "ውድ {{applicant}}፣ ማመልከቻ {{number}} ከመቀጠሉ በፊት ማስተካከያ ያስፈልገዋል።", }, activity: { - title: 'እንቅስቃሴ እና የኦዲት መዝገብ', - empty: 'እስካሁን የተመዘገበ እንቅስቃሴ የለም።', - system: 'ሲስተም', - officer: 'ሹም', - applicant: 'አመልካች', - remarkOn: 'በ{{target}} ላይ ማስተካከያ ተጠይቋል', - uploaded: '{{document}} ተጭኗል', + title: "እንቅስቃሴ እና የኦዲት መዝገብ", + empty: "እስካሁን የተመዘገበ እንቅስቃሴ የለም።", + system: "ሲስተም", + officer: "ሹም", + applicant: "አመልካች", + remarkOn: "በ{{target}} ላይ ማስተካከያ ተጠይቋል", + uploaded: "{{document}} ተጭኗል", }, documents: { - completeness: 'የሚያስፈልጉ ሰነዶች', - accepted: 'ተቀባይነት አግኝቷል', - rejected: 'ተቀባይነት አላገኘም', - accept: 'ተቀበል', - clear: 'ውሳኔ አጽዳ', - confirmReject: 'አትቀበል', - includeInAdjustment: 'መልስ', - adjustmentNote: 'አመልካቹ ምን ማስተካከል አለበት?', - nothingToJudge: 'የሚገመገም ምንም አልተጫነም', - reviewedBy: 'በ{{name}} ተገምግሟል', - saveFailed: 'ውሳኔውን ማስቀመጥ አልተቻለም', - completenessLabel: '{{value}}% የሚያስፈልጉ ሰነዶች ተጭነዋል', - missing: 'እስካሁን አልተጫነም', - flagged: 'ማስተካከያ ተጠይቋል', - view: 'እይ', - preview: 'ቅድመ እይታ', - download: 'አውርድ', - downloadShort: 'አውርድ', - reject: 'አትቀበል', - rejectReason: 'ይህ ሰነድ ለምን መስተካከል አለበት?', - reasonRequired: 'ምክንያት ያስፈልጋል', - noFile: 'ፋይል የለም', - noFileUploaded: 'እስካሁን ምንም አልተጫነም', - noInlinePreview: 'ይህ የፋይል ዓይነት በአሳሹ ውስጥ ቅድመ እይታ አይደረግም።', + completeness: "የሚያስፈልጉ ሰነዶች", + accepted: "ተቀባይነት አግኝቷል", + rejected: "ተቀባይነት አላገኘም", + accept: "ተቀበል", + clear: "ውሳኔ አጽዳ", + confirmReject: "አትቀበል", + includeInAdjustment: "መልስ", + adjustmentNote: "አመልካቹ ምን ማስተካከል አለበት?", + nothingToJudge: "የሚገመገም ምንም አልተጫነም", + reviewedBy: "በ{{name}} ተገምግሟል", + saveFailed: "ውሳኔውን ማስቀመጥ አልተቻለም", + completenessLabel: "{{value}}% የሚያስፈልጉ ሰነዶች ተጭነዋል", + missing: "እስካሁን አልተጫነም", + flagged: "ማስተካከያ ተጠይቋል", + view: "እይ", + preview: "ቅድመ እይታ", + download: "አውርድ", + downloadShort: "አውርድ", + reject: "አትቀበል", + rejectReason: "ይህ ሰነድ ለምን መስተካከል አለበት?", + reasonRequired: "ምክንያት ያስፈልጋል", + noFile: "ፋይል የለም", + noFileUploaded: "እስካሁን ምንም አልተጫነም", + noInlinePreview: "ይህ የፋይል ዓይነት በአሳሹ ውስጥ ቅድመ እይታ አይደረግም።", }, done: { - completeReview: 'ግምገማ ተጠናቋል', - approveDocuments: 'ሰነዶች ጸድቀዋል', - finalApprove: 'ጸድቋል', - requestAdjustment: 'ማስተካከያ ተጠይቋል', - reject: 'ማመልከቻው አልተቀበለም', - confirmPayment: 'ክፍያ ተረጋግጧል', - hold: 'ማመልከቻው ታግዷል', - resume: 'ማመልከቻው ቀጥሏል', - escalate: 'ወደ ላይ አድጓል', - assign: 'እንደገና ተመድቧል', - scheduled: 'ምርመራ ተይዟል', - inspectionPassed: 'ምርመራ አልፏል', - inspectionFailed: 'ምርመራ ወድቋል', + completeReview: "ግምገማ ተጠናቋል", + approveDocuments: "ሰነዶች ጸድቀዋል", + finalApprove: "ጸድቋል", + requestAdjustment: "ማስተካከያ ተጠይቋል", + reject: "ማመልከቻው አልተቀበለም", + confirmPayment: "ክፍያ ተረጋግጧል", + hold: "ማመልከቻው ታግዷል", + resume: "ማመልከቻው ቀጥሏል", + escalate: "ወደ ላይ አድጓል", + assign: "እንደገና ተመድቧል", + scheduled: "ምርመራ ተይዟል", + inspectionPassed: "ምርመራ አልፏል", + inspectionFailed: "ምርመራ ወድቋል", }, }, error: { - reference: 'ማጣቀሻ', - retry: 'እንደገና ሞክር', + reference: "ማጣቀሻ", + retry: "እንደገና ሞክር", }, shortcuts: { - title: 'የቁልፍ ሰሌዳ አቋራጮች', - commandPalette: 'ሁሉንም ፈልግ', - moveRow: 'በረድፎች መካከል ተንቀሳቀስ', - openRow: 'የተመረጠውን ረድፍ ክፈት', - claimRow: 'የተመረጠውን ረድፍ ውሰድ', - dismiss: 'ምርጫ አጽዳ / ዝጋ', - help: 'ይህን ዝርዝር አሳይ', + title: "የቁልፍ ሰሌዳ አቋራጮች", + commandPalette: "ሁሉንም ፈልግ", + moveRow: "በረድፎች መካከል ተንቀሳቀስ", + openRow: "የተመረጠውን ረድፍ ክፈት", + claimRow: "የተመረጠውን ረድፍ ውሰድ", + dismiss: "ምርጫ አጽዳ / ዝጋ", + help: "ይህን ዝርዝር አሳይ", }, designer: { - title: 'የምስክር ወረቀት ንድፍ', - subtitle: 'ለፈቃድ ባለቤቶች የሚሰጠውን የምስክር ወረቀት ይንደፉ፣ የሚቆይበትንም ጊዜ ያዘጋጁ።', - licenceType: 'የፈቃድ ዓይነት', - validityYears: 'የሚቆይበት (ዓመታት)', - validityHint: 'ፈቃድ ሲሰጥ ተግባራዊ ይሆናል', - saveValidity: 'የሚቆይበትን ጊዜ አስቀምጥ', - validitySaved: 'የሚቆይበት ጊዜ ተዘምኗል', - newVersion: 'አዲስ ስሪት', - versions: 'ስሪቶች', - name: 'የስሪት ስም', - landscape: 'አግድም', - source: 'ቅንብር (Handlebars + HTML)', - variables: 'ቦታ ያዢዎች', - variablesHint: 'በጠቋሚው ቦታ ለማስገባት ይጫኑ።', - preview: 'PDF ቅድመ እይታ', - previewFailed: 'ቅድመ እይታውን ማዘጋጀት አልተቻለም', - save: 'ረቂቅ አስቀምጥ', - saved: 'ረቂቅ ተቀምጧል', - saveFirst: 'መጀመሪያ ለውጦችዎን ያስቀምጡ', - publish: 'አትም', - published: 'ንድፉ ታትሟል', - publishHint: 'ይህንን ቀጥታ የምስክር ወረቀት ንድፍ ያደርገዋል', - publishedLocked: 'ይህ ስሪት ቀጥታ ላይ ስለሆነ ማስተካከል አይቻልም — ከእሱ የምስክር ወረቀቶች ተሰጥተዋል። ለውጥ ለማድረግ አዲስ ስሪት ይፍጠሩ።', - archive: 'አንሳ', - archived: 'ንድፉ ተነስቷል', - delete: 'ረቂቅ ሰርዝ', - deleted: 'ረቂቅ ተሰርዟል', - create: 'ፍጠር', - created: 'ረቂቅ ተፈጥሯል', - newHint: 'ከቀጥታ ንድፉ ወይም ይህ ዓይነት ከሌለው ከውስጠ-ግንብ ቅንብር ይጀምራል።', - empty: 'ለዚህ የፈቃድ ዓይነት እስካሁን ንድፍ የለም', - emptyBody: 'የምስክር ወረቀቶች አሁን ውስጠ-ግንብ ቅንብር ይጠቀማሉ። ለመቆጣጠር ስሪት ይፍጠሩ።', - loadFailed: 'ንድፎቹን መጫን አልተቻለም', - actionFailed: 'ተግባሩ አልተሳካም', - noPermission: 'ፈቃድ የለዎትም', - noPublishPermission: 'ንድፎችን ማተም አይችሉም', + title: "የምስክር ወረቀት ንድፍ", + subtitle: "ለፈቃድ ባለቤቶች የሚሰጠውን የምስክር ወረቀት ይንደፉ፣ የሚቆይበትንም ጊዜ ያዘጋጁ።", + licenceType: "የፈቃድ ዓይነት", + validityYears: "የሚቆይበት (ዓመታት)", + validityHint: "ፈቃድ ሲሰጥ ተግባራዊ ይሆናል", + saveValidity: "የሚቆይበትን ጊዜ አስቀምጥ", + validitySaved: "የሚቆይበት ጊዜ ተዘምኗል", + newVersion: "አዲስ ስሪት", + versions: "ስሪቶች", + name: "የስሪት ስም", + landscape: "አግድም", + source: "ቅንብር (Handlebars + HTML)", + variables: "ቦታ ያዢዎች", + variablesHint: "በጠቋሚው ቦታ ለማስገባት ይጫኑ።", + preview: "PDF ቅድመ እይታ", + previewFailed: "ቅድመ እይታውን ማዘጋጀት አልተቻለም", + save: "ረቂቅ አስቀምጥ", + saved: "ረቂቅ ተቀምጧል", + saveFirst: "መጀመሪያ ለውጦችዎን ያስቀምጡ", + publish: "አትም", + published: "ንድፉ ታትሟል", + publishHint: "ይህንን ቀጥታ የምስክር ወረቀት ንድፍ ያደርገዋል", + publishedLocked: + "ይህ ስሪት ቀጥታ ላይ ስለሆነ ማስተካከል አይቻልም — ከእሱ የምስክር ወረቀቶች ተሰጥተዋል። ለውጥ ለማድረግ አዲስ ስሪት ይፍጠሩ።", + archive: "አንሳ", + archived: "ንድፉ ተነስቷል", + delete: "ረቂቅ ሰርዝ", + deleted: "ረቂቅ ተሰርዟል", + create: "ፍጠር", + created: "ረቂቅ ተፈጥሯል", + newHint: "ከቀጥታ ንድፉ ወይም ይህ ዓይነት ከሌለው ከውስጠ-ግንብ ቅንብር ይጀምራል።", + empty: "ለዚህ የፈቃድ ዓይነት እስካሁን ንድፍ የለም", + emptyBody: "የምስክር ወረቀቶች አሁን ውስጠ-ግንብ ቅንብር ይጠቀማሉ። ለመቆጣጠር ስሪት ይፍጠሩ።", + loadFailed: "ንድፎቹን መጫን አልተቻለም", + actionFailed: "ተግባሩ አልተሳካም", + noPermission: "ፈቃድ የለዎትም", + noPublishPermission: "ንድፎችን ማተም አይችሉም", }, }; diff --git a/apps/backoffice/src/app/i18n/locales/en.ts b/apps/backoffice/src/app/i18n/locales/en.ts index 61abf15ee..d90c7afa8 100644 --- a/apps/backoffice/src/app/i18n/locales/en.ts +++ b/apps/backoffice/src/app/i18n/locales/en.ts @@ -77,7 +77,7 @@ export const en = { applications: 'Applications', paymentConfig: 'Payment Config', analytics: 'Analytics', - medicalVerification: 'Medical Verification', + medicalVerification: 'Medical and Sea Service Verification', locations: 'Locations', configuration: 'Configuration', profile: 'Profile', diff --git a/apps/backoffice/src/app/layouts/BackofficeLayout.tsx b/apps/backoffice/src/app/layouts/BackofficeLayout.tsx index 9f3dd56b3..e9c9f857b 100644 --- a/apps/backoffice/src/app/layouts/BackofficeLayout.tsx +++ b/apps/backoffice/src/app/layouts/BackofficeLayout.tsx @@ -8,7 +8,7 @@ import { AppHeader, AppSidebar } from '@ema-platform/ui'; import type { NavItem, NavSection } from '@ema-platform/ui'; import { notify } from '@ema-platform/ui'; import { AppTopNav, filterByPermissions } from '@ema-platform/ui'; -import { useGetQueueCountsQuery } from '@ema-platform/api'; +import { baseApi, useGetQueueCountsQuery } from '@ema-platform/api'; import { usePermissions } from '@ema-platform/auth'; import { SUPPORTED_LANGUAGES } from '../i18n/config'; import { useAppDispatch, useAppSelector } from '../store/hooks'; diff --git a/apps/portal/src/app/layouts/PortalLayout.tsx b/apps/portal/src/app/layouts/PortalLayout.tsx index 4f90c42f3..02df6f773 100644 --- a/apps/portal/src/app/layouts/PortalLayout.tsx +++ b/apps/portal/src/app/layouts/PortalLayout.tsx @@ -22,7 +22,7 @@ import { useDispatch } from "react-redux"; import { notify, AppHeader, AppSidebar } from "@ema-platform/ui"; import type { NavItem } from "@ema-platform/ui"; import { BrandMark, logout } from "@ema-platform/auth"; -import { useGetUnseenNotificationsQuery } from "@ema-platform/api"; +import { baseApi, useGetUnseenNotificationsQuery } from "@ema-platform/api"; import { SUPPORTED_LANGUAGES } from "../i18n/config"; import { useAppSelector } from "../store/hooks"; @@ -172,6 +172,7 @@ export function PortalLayout() { const handleLogout = () => { dispatch(logout()); + dispatch(baseApi.util.resetApiState()); navigate("/login"); }; diff --git a/libs/auth/src/lib/store/auth.slice.ts b/libs/auth/src/lib/store/auth.slice.ts index 4b154a2aa..1fb70a533 100644 --- a/libs/auth/src/lib/store/auth.slice.ts +++ b/libs/auth/src/lib/store/auth.slice.ts @@ -42,7 +42,6 @@ const authSlice = createSlice({ state.isAuthenticated = false; state.currentProfile = null; authStorage.clear(); - clearCurrentProfile(); }, setToken(state, action: PayloadAction) { state.token = action.payload; diff --git a/libs/auth/src/lib/utils/auth-storage.ts b/libs/auth/src/lib/utils/auth-storage.ts index ca791d39b..1449f8988 100644 --- a/libs/auth/src/lib/utils/auth-storage.ts +++ b/libs/auth/src/lib/utils/auth-storage.ts @@ -1,6 +1,75 @@ import Cookies from "js-cookie"; -const rememberMe = localStorage.getItem("rememberMe") === "true"; -const COOKIE_EXPIRES_DAYS = rememberMe ? 15 : 1; + +function getCookieExpiresDays(): number { + if (typeof window === "undefined") return 1; + try { + const rememberMe = localStorage.getItem("rememberMe") === "true"; + return rememberMe ? 15 : 1; + } catch { + return 1; + } +} + +const isHttps = + typeof window !== "undefined" && window.location.protocol === "https:"; + +function removeCookieCompletely(name: string) { + if (typeof document === "undefined") return; + + const paths = ["/", ""]; + const samesites: Array<"strict" | "lax" | "none" | undefined> = [ + "strict", + "lax", + undefined, + ]; + const secures = [true, false]; + + for (const path of paths) { + for (const secure of secures) { + for (const sameSite of samesites) { + try { + Cookies.remove(name, { path, secure, sameSite }); + } catch { + // ignore + } + } + } + } + + const pastDate = "Thu, 01 Jan 1970 00:00:00 GMT"; + const expireStrings = [ + `${name}=; path=/; expires=${pastDate}; max-age=0`, + `${name}=; path=/; expires=${pastDate}; max-age=0; SameSite=Strict`, + `${name}=; path=/; expires=${pastDate}; max-age=0; SameSite=Strict; Secure`, + `${name}=; path=/; expires=${pastDate}; max-age=0; SameSite=Lax`, + `${name}=; path=/; expires=${pastDate}; max-age=0; SameSite=Lax; Secure`, + `${name}=; expires=${pastDate}; max-age=0`, + ]; + + try { + const domain = window.location.hostname; + const domainParts = domain.split("."); + if (domainParts.length > 1) { + expireStrings.push( + `${name}=; path=/; domain=${domain}; expires=${pastDate}; max-age=0` + ); + expireStrings.push( + `${name}=; path=/; domain=.${domain}; expires=${pastDate}; max-age=0` + ); + } + } catch { + // ignore + } + + expireStrings.forEach((str) => { + try { + document.cookie = str; + } catch { + // ignore + } + }); +} + interface Backend { get(k: string): string | null; set(k: string, v: string): void; @@ -15,15 +84,14 @@ const localStore: Backend = { const cookieStore: Backend = { get: (k) => Cookies.get(k) ?? null, - set: (k, v) => Cookies.set(k, v, { path: "/", - secure: true, + secure: isHttps, sameSite: "strict", - expires: COOKIE_EXPIRES_DAYS, + expires: getCookieExpiresDays(), }), - remove: (k) => Cookies.remove(k, { path: "/" }), + remove: (k) => removeCookieCompletely(k), }; const AUTH_KEY_NAMES = [ @@ -34,6 +102,8 @@ const AUTH_KEY_NAMES = [ "current-profile", ]; +const KNOWN_PREFIXES = ["ema-backoffice", "ema-portal", "ema-auth", ""]; + let _prefix = "ema-auth"; let backend: Backend = localStore; @@ -41,7 +111,7 @@ export function configureAuthStorage(prefix: string, useCookies = false) { _prefix = prefix; backend = useCookies ? cookieStore : localStore; if (useCookies) { - // one-time cleanup: drop pre-migration localStorage leftovers so tokens live in cookies only + // drop pre-migration localStorage leftovers so tokens live in cookies only AUTH_KEY_NAMES.forEach((k) => localStorage.removeItem(`${prefix}-${k}`)); } } @@ -78,17 +148,36 @@ export const authStorage = { backend.set(key("current-profile"), JSON.stringify(p)), removeProfile: () => backend.remove(key("current-profile")), clear: () => { - [ - key("auth-token"), - key("refresh-token"), - key("auth-user"), - key("profile-id"), - key("current-profile"), - key("profile-id"), - ].forEach((k) => backend.remove(k)); - Object.keys(Cookies.get()).forEach((name) => { - Cookies.remove(name); - Cookies.remove(name, { path: "/" }); + const prefixes = Array.from(new Set([_prefix, ...KNOWN_PREFIXES])); + prefixes.forEach((p) => { + AUTH_KEY_NAMES.forEach((k) => { + const fullKey = p ? `${p}-${k}` : k; + removeCookieCompletely(fullKey); + try { + localStorage.removeItem(fullKey); + } catch { + // ignore + } + }); }); + + try { + localStorage.removeItem("rememberMe"); + } catch { + // ignore + } + + try { + if (typeof Cookies !== "undefined") { + const allCookies = Cookies.get(); + if (allCookies) { + Object.keys(allCookies).forEach((name) => { + removeCookieCompletely(name); + }); + } + } + } catch { + // ignore + } }, };