feat: Add i18n with 7 languages (DE, EN, ES, FR, AR, RU, PL)

- Added vue-i18n with language switcher in header
- Flag icons with language codes dropdown
- RTL support for Arabic
- Translated all navigation, auth, and module labels
- Language preference saved to localStorage
This commit is contained in:
2026-03-13 04:51:12 +00:00
parent 3ca75cc4f2
commit aa0239abca
116 changed files with 69028 additions and 75 deletions

View File

@@ -0,0 +1,91 @@
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { SUPPORTED_LOCALES, setLocale, type LocaleCode } from '@/i18n'
const { locale } = useI18n()
const isOpen = ref(false)
const currentLocale = computed(() => {
return SUPPORTED_LOCALES.find(l => l.code === locale.value) || SUPPORTED_LOCALES[0]
})
function selectLocale(code: LocaleCode) {
setLocale(code)
isOpen.value = false
}
// Close dropdown when clicking outside
function handleClickOutside(event: MouseEvent) {
const target = event.target as HTMLElement
if (!target.closest('.language-switcher')) {
isOpen.value = false
}
}
// Add click listener
if (typeof window !== 'undefined') {
document.addEventListener('click', handleClickOutside)
}
</script>
<template>
<div class="language-switcher relative">
<button
class="flex items-center gap-1.5 px-2 py-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
@click.stop="isOpen = !isOpen"
:title="$t('settings.language')"
>
<span class="text-lg">{{ currentLocale.flag }}</span>
<span class="text-xs font-medium text-gray-600 dark:text-gray-300 uppercase">
{{ currentLocale.code }}
</span>
<svg
class="w-3 h-3 text-gray-500 transition-transform"
:class="{ 'rotate-180': isOpen }"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
<!-- Dropdown -->
<Transition
enter-active-class="transition ease-out duration-100"
enter-from-class="transform opacity-0 scale-95"
enter-to-class="transform opacity-100 scale-100"
leave-active-class="transition ease-in duration-75"
leave-from-class="transform opacity-100 scale-100"
leave-to-class="transform opacity-0 scale-95"
>
<div
v-if="isOpen"
class="absolute right-0 mt-2 w-44 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 py-1 z-50"
>
<button
v-for="loc in SUPPORTED_LOCALES"
:key="loc.code"
class="w-full flex items-center gap-3 px-3 py-2 text-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
:class="{
'bg-primary-50 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400': loc.code === locale,
'text-gray-700 dark:text-gray-200': loc.code !== locale
}"
@click="selectLocale(loc.code)"
>
<span class="text-lg">{{ loc.flag }}</span>
<span class="flex-1 text-left">{{ loc.name }}</span>
<svg
v-if="loc.code === locale"
class="w-4 h-4 text-primary-600 dark:text-primary-400"
fill="currentColor"
viewBox="0 0 20 20"
>
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</button>
</div>
</Transition>
</div>
</template>

View File

@@ -1,12 +1,15 @@
<script setup lang="ts">
import { ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { useAuthStore } from '@/stores/auth'
import LanguageSwitcher from '@/components/LanguageSwitcher.vue'
defineEmits<{
'toggle-sidebar': []
'logout': []
}>()
const { t } = useI18n()
const authStore = useAuthStore()
const darkMode = ref(localStorage.getItem('darkMode') === 'true')
const dropdownOpen = ref(false)
@@ -36,16 +39,20 @@ if (darkMode.value) {
<!-- Page title placeholder -->
<div class="flex-1 lg:ml-0">
<h1 class="text-lg font-semibold text-gray-900 dark:text-white hidden lg:block">
Mitarbeiterverwaltung
{{ t('app.title') }}
</h1>
</div>
<!-- Right side actions -->
<div class="flex items-center gap-2">
<!-- Language Switcher -->
<LanguageSwitcher />
<!-- Dark mode toggle -->
<button
class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700"
@click="toggleDarkMode"
:title="darkMode ? t('settings.lightMode') : t('settings.darkMode')"
>
<span class="text-xl">{{ darkMode ? '☀️' : '🌙' }}</span>
</button>
@@ -76,14 +83,14 @@ if (darkMode.value) {
to="/settings"
class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700"
>
Einstellungen
{{ t('nav.settings') }}
</router-link>
<hr class="my-1 border-gray-200 dark:border-gray-700">
<button
class="w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20"
@click="$emit('logout')"
>
🚪 Abmelden
🚪 {{ t('auth.logout') }}
</button>
</div>
</div>

View File

@@ -1,6 +1,7 @@
<script setup lang="ts">
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useAuthStore } from '@/stores/auth'
defineProps<{
@@ -12,48 +13,49 @@ defineEmits<{
}>()
const route = useRoute()
const { t } = useI18n()
const authStore = useAuthStore()
const navigation = computed(() => {
const items = [
{ name: 'Dashboard', href: '/', icon: '📊' },
{ name: 'Aufträge', href: '/orders', icon: '📋' },
{ name: t('nav.dashboard'), href: '/', icon: '📊' },
{ name: t('nav.orders'), href: '/orders', icon: '📋' },
]
if (authStore.canManageUsers) {
items.push(
{ name: 'Mitarbeiter', href: '/users', icon: '👥' },
{ name: 'Schichtplanung', href: '/shifts', icon: '📅' }
{ name: t('nav.users'), href: '/users', icon: '👥' },
{ name: t('nav.shifts'), href: '/shifts', icon: '📅' }
)
}
items.push(
{ name: 'Verfügbarkeit', href: '/availability', icon: '🗓️' },
{ name: 'Stundenzettel', href: '/timesheets', icon: '⏱️' },
{ name: 'Qualifikationen', href: '/qualifications', icon: '🎓' },
{ name: 'Objekte', href: '/objects', icon: '🏢' },
{ name: 'Rundgänge', href: '/patrols', icon: '📍' },
{ name: 'Vorfälle', href: '/incidents', icon: '🚨' },
{ name: 'Dokumente', href: '/documents', icon: '📁' },
{ name: t('nav.availability'), href: '/availability', icon: '🗓️' },
{ name: t('nav.timesheets'), href: '/timesheets', icon: '⏱️' },
{ name: t('nav.qualifications'), href: '/qualifications', icon: '🎓' },
{ name: t('nav.objects'), href: '/objects', icon: '🏢' },
{ name: t('nav.patrols'), href: '/patrols', icon: '📍' },
{ name: t('nav.incidents'), href: '/incidents', icon: '🚨' },
{ name: t('nav.documents'), href: '/documents', icon: '📁' },
)
if (authStore.canManageUsers) {
items.push(
{ name: 'Fahrzeuge', href: '/vehicles', icon: '🚗' },
{ name: 'Kunden', href: '/customers', icon: '🤝' }
{ name: t('nav.vehicles'), href: '/vehicles', icon: '🚗' },
{ name: t('nav.customers'), href: '/customers', icon: '🤝' }
)
}
if (authStore.isChef) {
items.push(
{ name: 'Abrechnung', href: '/billing', icon: '💰' },
{ name: 'Module', href: '/modules', icon: '⚙️' }
{ name: t('nav.billing'), href: '/billing', icon: '💰' },
{ name: t('nav.modules'), href: '/modules', icon: '⚙️' }
)
}
items.push(
{ name: 'Einstellungen', href: '/settings', icon: '🔧' },
{ name: 'Hilfe', href: '/help', icon: '📚' }
{ name: t('nav.settings'), href: '/settings', icon: '🔧' },
{ name: t('nav.help'), href: '/help', icon: '📚' }
)
return items

72
src/i18n.ts Normal file
View File

@@ -0,0 +1,72 @@
import { createI18n } from 'vue-i18n'
import de from './locales/de'
import en from './locales/en'
import es from './locales/es'
import fr from './locales/fr'
import ar from './locales/ar'
import ru from './locales/ru'
import pl from './locales/pl'
export const SUPPORTED_LOCALES = [
{ code: 'de', name: 'Deutsch', flag: '🇩🇪' },
{ code: 'es', name: 'Español', flag: '🇪🇸' },
{ code: 'en', name: 'English', flag: '🇬🇧' },
{ code: 'ar', name: 'العربية', flag: '🇸🇦', rtl: true },
{ code: 'ru', name: 'Русский', flag: '🇷🇺' },
{ code: 'fr', name: 'Français', flag: '🇫🇷' },
{ code: 'pl', name: 'Polski', flag: '🇵🇱' },
] as const
export type LocaleCode = typeof SUPPORTED_LOCALES[number]['code']
// Get saved locale or browser default
function getDefaultLocale(): LocaleCode {
const saved = localStorage.getItem('locale') as LocaleCode
if (saved && SUPPORTED_LOCALES.some(l => l.code === saved)) {
return saved
}
// Try browser language
const browserLang = navigator.language.split('-')[0]
const match = SUPPORTED_LOCALES.find(l => l.code === browserLang)
if (match) {
return match.code
}
return 'de' // Default to German
}
const i18n = createI18n({
legacy: false,
locale: getDefaultLocale(),
fallbackLocale: 'de',
messages: {
de,
en,
es,
fr,
ar,
ru,
pl,
},
})
// Update document direction for RTL languages
export function setLocale(locale: LocaleCode) {
const localeInfo = SUPPORTED_LOCALES.find(l => l.code === locale)
if (localeInfo) {
i18n.global.locale.value = locale
localStorage.setItem('locale', locale)
document.documentElement.dir = localeInfo.rtl ? 'rtl' : 'ltr'
document.documentElement.lang = locale
}
}
// Initialize direction on load
const currentLocale = SUPPORTED_LOCALES.find(l => l.code === getDefaultLocale())
if (currentLocale?.rtl) {
document.documentElement.dir = 'rtl'
}
document.documentElement.lang = getDefaultLocale()
export default i18n

434
src/locales/ar.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'إدارة الموظفين',
loading: 'جاري التحميل...',
save: 'حفظ',
cancel: 'إلغاء',
delete: 'حذف',
edit: 'تعديل',
add: 'إضافة',
search: 'بحث',
filter: 'تصفية',
actions: 'إجراءات',
close: 'إغلاق',
confirm: 'تأكيد',
yes: 'نعم',
no: 'لا',
back: 'رجوع',
next: 'التالي',
submit: 'إرسال',
reset: 'إعادة تعيين',
export: 'تصدير',
import: 'استيراد',
download: 'تحميل',
upload: 'رفع',
all: 'الكل',
none: 'لا شيء',
status: 'الحالة',
date: 'التاريخ',
time: 'الوقت',
from: 'من',
to: 'إلى',
total: 'المجموع',
details: 'التفاصيل',
description: 'الوصف',
notes: 'ملاحظات',
created: 'تم الإنشاء',
updated: 'تم التحديث',
},
// Auth
auth: {
login: 'تسجيل الدخول',
logout: 'تسجيل الخروج',
register: 'التسجيل',
email: 'البريد الإلكتروني',
password: 'كلمة المرور',
confirmPassword: 'تأكيد كلمة المرور',
forgotPassword: 'نسيت كلمة المرور؟',
rememberMe: 'تذكرني',
welcomeBack: 'مرحباً بعودتك',
loginToContinue: 'سجل الدخول للمتابعة',
noAccount: 'ليس لديك حساب؟',
hasAccount: 'لديك حساب بالفعل؟',
createOrg: 'إنشاء منظمة',
orgName: 'اسم الشركة',
firstName: 'الاسم الأول',
lastName: 'اسم العائلة',
},
// Navigation
nav: {
dashboard: 'لوحة التحكم',
orders: 'الطلبات',
users: 'الموظفون',
shifts: 'جدولة المناوبات',
availability: 'التوفر',
timesheets: 'جداول الدوام',
qualifications: 'المؤهلات',
objects: 'المواقع',
patrols: 'الدوريات',
incidents: 'الحوادث',
documents: 'المستندات',
vehicles: 'المركبات',
customers: 'العملاء',
billing: 'الفواتير',
modules: 'الوحدات',
settings: 'الإعدادات',
help: 'المساعدة',
partnerships: 'الشراكات',
},
// Dashboard
dashboard: {
welcome: 'مرحباً',
overview: 'نظرة عامة',
todayOrders: 'طلبات اليوم',
activeEmployees: 'الموظفون النشطون',
openIncidents: 'الحوادث المفتوحة',
pendingTimesheets: 'جداول الدوام المعلقة',
recentActivity: 'النشاط الأخير',
upcomingShifts: 'المناوبات القادمة',
expiringQualifications: 'المؤهلات المنتهية قريباً',
quickActions: 'إجراءات سريعة',
},
// Orders
orders: {
title: 'الطلبات',
new: 'طلب جديد',
orderNumber: 'رقم الطلب',
client: 'العميل',
location: 'الموقع',
startDate: 'تاريخ البدء',
endDate: 'تاريخ الانتهاء',
assignedTo: 'مُعين إلى',
priority: 'الأولوية',
priorities: {
low: 'منخفضة',
medium: 'متوسطة',
high: 'عالية',
urgent: 'عاجلة',
},
statuses: {
draft: 'مسودة',
scheduled: 'مجدول',
active: 'نشط',
completed: 'مكتمل',
cancelled: 'ملغي',
},
},
// Users
users: {
title: 'الموظفون',
new: 'موظف جديد',
employee: 'موظف',
employees: 'الموظفون',
role: 'الدور',
roles: {
chef: 'مدير',
disponent: 'منسق',
mitarbeiter: 'موظف',
},
phone: 'الهاتف',
address: 'العنوان',
hireDate: 'تاريخ التوظيف',
active: 'نشط',
inactive: 'غير نشط',
},
// Shifts
shifts: {
title: 'جدولة المناوبات',
new: 'مناوبة جديدة',
shift: 'مناوبة',
shiftPlan: 'خطة المناوبات',
morning: 'مناوبة صباحية',
afternoon: 'مناوبة مسائية',
night: 'مناوبة ليلية',
startTime: 'وقت البدء',
endTime: 'وقت الانتهاء',
break: 'استراحة',
assigned: 'مُعين',
unassigned: 'غير مُعين',
swapRequest: 'طلب تبديل',
approve: 'موافقة',
reject: 'رفض',
},
// Availability
availability: {
title: 'التوفر',
available: 'متاح',
unavailable: 'غير متاح',
partiallyAvailable: 'متاح جزئياً',
setAvailability: 'تحديد التوفر',
reason: 'السبب',
vacation: 'إجازة',
sick: 'مرض',
training: 'تدريب',
other: 'أخرى',
},
// Timesheets
timesheets: {
title: 'جداول الدوام',
new: 'إدخال جديد',
hours: 'ساعات',
totalHours: 'إجمالي الساعات',
workDate: 'يوم العمل',
checkIn: 'تسجيل الحضور',
checkOut: 'تسجيل الانصراف',
breakTime: 'وقت الاستراحة',
overtime: 'ساعات إضافية',
upload: 'رفع جدول الدوام',
statuses: {
pending: 'معلق',
approved: 'مُوافق عليه',
rejected: 'مرفوض',
},
},
// Qualifications
qualifications: {
title: 'المؤهلات',
new: 'مؤهل جديد',
type: 'النوع',
types: {
'34a': 'شهادة الأمن §34a',
'first_aid': 'دورة الإسعافات الأولية',
'fire_safety': 'السلامة من الحريق',
'security_check': 'التصريح الأمني',
'drivers_license': 'رخصة القيادة',
'other': 'أخرى',
},
issueDate: 'تاريخ الإصدار',
expiryDate: 'تاريخ الانتهاء',
issuedBy: 'صادر من',
valid: 'صالح',
expired: 'منتهي',
expiringSoon: 'ينتهي قريباً',
daysUntilExpiry: 'أيام حتى الانتهاء',
reminder: 'تذكير',
},
// Objects
objects: {
title: 'المواقع',
new: 'موقع جديد',
object: 'موقع',
name: 'الاسم',
address: 'العنوان',
contact: 'جهة الاتصال',
phone: 'الهاتف',
instructions: 'التعليمات',
documents: 'المستندات',
accessInfo: 'معلومات الدخول',
},
// Patrols
patrols: {
title: 'الدوريات',
new: 'دورية جديدة',
checkpoint: 'نقطة تفتيش',
checkpoints: 'نقاط التفتيش',
route: 'المسار',
routes: 'المسارات',
log: 'سجل',
logs: 'السجلات',
scanned: 'تم المسح',
missed: 'فائت',
scanTime: 'وقت المسح',
expectedTime: 'الوقت المتوقع',
deviation: 'الانحراف',
},
// Incidents
incidents: {
title: 'الحوادث',
new: 'حادثة جديدة',
incident: 'حادثة',
category: 'الفئة',
categories: {
theft: 'سرقة',
vandalism: 'تخريب',
trespassing: 'تعدي',
fire: 'حريق',
medical: 'طوارئ طبية',
technical: 'مشكلة تقنية',
other: 'أخرى',
},
severity: 'الشدة',
severities: {
low: 'منخفضة',
medium: 'متوسطة',
high: 'عالية',
critical: 'حرجة',
},
reporter: 'أبلغ عنها',
location: 'الموقع',
witnesses: 'الشهود',
attachments: 'المرفقات',
resolved: 'محلولة',
unresolved: 'غير محلولة',
},
// Documents
documents: {
title: 'المستندات',
new: 'مستند جديد',
document: 'مستند',
category: 'الفئة',
categories: {
contract: 'عقد',
certificate: 'شهادة',
policy: 'سياسة',
manual: 'دليل',
form: 'نموذج',
other: 'أخرى',
},
uploadDate: 'تاريخ الرفع',
fileType: 'نوع الملف',
fileSize: 'حجم الملف',
mandatory: 'إلزامي',
acknowledged: 'تم الإقرار',
acknowledgement: 'إقرار',
},
// Vehicles
vehicles: {
title: 'المركبات',
new: 'مركبة جديدة',
vehicle: 'مركبة',
licensePlate: 'لوحة الترخيص',
make: 'الشركة المصنعة',
model: 'الطراز',
year: 'السنة',
mileage: 'عداد المسافات',
fuelLevel: 'مستوى الوقود',
status: 'الحالة',
statuses: {
available: 'متاحة',
inUse: 'قيد الاستخدام',
maintenance: 'صيانة',
outOfService: 'خارج الخدمة',
},
booking: 'حجز',
bookings: 'الحجوزات',
maintenance: 'الصيانة',
nextService: 'الخدمة التالية',
},
// Customers
customers: {
title: 'العملاء',
new: 'عميل جديد',
customer: 'عميل',
company: 'الشركة',
contact: 'جهة الاتصال',
email: 'البريد الإلكتروني',
phone: 'الهاتف',
address: 'العنوان',
contracts: 'العقود',
communication: 'التواصل',
notes: 'ملاحظات',
},
// Billing
billing: {
title: 'الفواتير',
invoices: 'الفواتير',
newInvoice: 'فاتورة جديدة',
invoice: 'فاتورة',
invoiceNumber: 'رقم الفاتورة',
amount: 'المبلغ',
tax: 'الضريبة',
subtotal: 'المجموع الفرعي',
total: 'المجموع',
dueDate: 'تاريخ الاستحقاق',
paidDate: 'تاريخ الدفع',
statuses: {
draft: 'مسودة',
sent: 'مُرسلة',
paid: 'مدفوعة',
overdue: 'متأخرة',
cancelled: 'ملغاة',
},
hourlyRates: 'أسعار الساعة',
rate: 'السعر',
reminders: 'التذكيرات',
},
// Modules
modules: {
title: 'الوحدات',
enabled: 'مُفعّل',
disabled: 'معطّل',
enable: 'تفعيل',
disable: 'تعطيل',
configure: 'تكوين',
},
// Settings
settings: {
title: 'الإعدادات',
profile: 'الملف الشخصي',
account: 'الحساب',
notifications: 'الإشعارات',
security: 'الأمان',
language: 'اللغة',
theme: 'المظهر',
darkMode: 'الوضع الداكن',
lightMode: 'الوضع الفاتح',
changePassword: 'تغيير كلمة المرور',
twoFactor: 'المصادقة الثنائية',
lockScreen: 'قفل الشاشة',
lockMethod: 'طريقة القفل',
pin: 'رمز PIN',
pattern: 'نمط',
},
// Help
help: {
title: 'المساعدة والدعم',
faq: 'الأسئلة الشائعة',
contact: 'اتصل بنا',
documentation: 'التوثيق',
tutorials: 'الدروس',
feedback: 'ملاحظات',
},
// Messages
messages: {
success: 'نجاح',
error: 'خطأ',
warning: 'تحذير',
info: 'معلومات',
saved: 'تم الحفظ',
deleted: 'تم الحذف',
updated: 'تم التحديث',
created: 'تم الإنشاء',
confirmDelete: 'هل أنت متأكد من أنك تريد حذف هذا؟',
noData: 'لا توجد بيانات متاحة',
loading: 'جاري التحميل...',
required: 'حقل مطلوب',
invalid: 'إدخال غير صالح',
},
// Time
time: {
today: 'اليوم',
yesterday: 'أمس',
tomorrow: 'غداً',
thisWeek: 'هذا الأسبوع',
lastWeek: 'الأسبوع الماضي',
thisMonth: 'هذا الشهر',
lastMonth: 'الشهر الماضي',
days: 'أيام',
hours: 'ساعات',
minutes: 'دقائق',
},
}

434
src/locales/de.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'Mitarbeiterverwaltung',
loading: 'Laden...',
save: 'Speichern',
cancel: 'Abbrechen',
delete: 'Löschen',
edit: 'Bearbeiten',
add: 'Hinzufügen',
search: 'Suchen',
filter: 'Filtern',
actions: 'Aktionen',
close: 'Schließen',
confirm: 'Bestätigen',
yes: 'Ja',
no: 'Nein',
back: 'Zurück',
next: 'Weiter',
submit: 'Absenden',
reset: 'Zurücksetzen',
export: 'Exportieren',
import: 'Importieren',
download: 'Herunterladen',
upload: 'Hochladen',
all: 'Alle',
none: 'Keine',
status: 'Status',
date: 'Datum',
time: 'Zeit',
from: 'Von',
to: 'Bis',
total: 'Gesamt',
details: 'Details',
description: 'Beschreibung',
notes: 'Notizen',
created: 'Erstellt',
updated: 'Aktualisiert',
},
// Auth
auth: {
login: 'Anmelden',
logout: 'Abmelden',
register: 'Registrieren',
email: 'E-Mail',
password: 'Passwort',
confirmPassword: 'Passwort bestätigen',
forgotPassword: 'Passwort vergessen?',
rememberMe: 'Angemeldet bleiben',
welcomeBack: 'Willkommen zurück',
loginToContinue: 'Melden Sie sich an, um fortzufahren',
noAccount: 'Noch kein Konto?',
hasAccount: 'Bereits ein Konto?',
createOrg: 'Organisation erstellen',
orgName: 'Firmenname',
firstName: 'Vorname',
lastName: 'Nachname',
},
// Navigation
nav: {
dashboard: 'Dashboard',
orders: 'Aufträge',
users: 'Mitarbeiter',
shifts: 'Schichtplanung',
availability: 'Verfügbarkeit',
timesheets: 'Stundenzettel',
qualifications: 'Qualifikationen',
objects: 'Objekte',
patrols: 'Rundgänge',
incidents: 'Vorfälle',
documents: 'Dokumente',
vehicles: 'Fahrzeuge',
customers: 'Kunden',
billing: 'Abrechnung',
modules: 'Module',
settings: 'Einstellungen',
help: 'Hilfe',
partnerships: 'Partnerschaften',
},
// Dashboard
dashboard: {
welcome: 'Willkommen',
overview: 'Übersicht',
todayOrders: 'Heutige Aufträge',
activeEmployees: 'Aktive Mitarbeiter',
openIncidents: 'Offene Vorfälle',
pendingTimesheets: 'Ausstehende Stundenzettel',
recentActivity: 'Letzte Aktivitäten',
upcomingShifts: 'Kommende Schichten',
expiringQualifications: 'Ablaufende Qualifikationen',
quickActions: 'Schnellaktionen',
},
// Orders
orders: {
title: 'Aufträge',
new: 'Neuer Auftrag',
orderNumber: 'Auftragsnummer',
client: 'Kunde',
location: 'Einsatzort',
startDate: 'Startdatum',
endDate: 'Enddatum',
assignedTo: 'Zugewiesen an',
priority: 'Priorität',
priorities: {
low: 'Niedrig',
medium: 'Mittel',
high: 'Hoch',
urgent: 'Dringend',
},
statuses: {
draft: 'Entwurf',
scheduled: 'Geplant',
active: 'Aktiv',
completed: 'Abgeschlossen',
cancelled: 'Storniert',
},
},
// Users
users: {
title: 'Mitarbeiter',
new: 'Neuer Mitarbeiter',
employee: 'Mitarbeiter',
employees: 'Mitarbeiter',
role: 'Rolle',
roles: {
chef: 'Chef',
disponent: 'Disponent',
mitarbeiter: 'Mitarbeiter',
},
phone: 'Telefon',
address: 'Adresse',
hireDate: 'Einstellungsdatum',
active: 'Aktiv',
inactive: 'Inaktiv',
},
// Shifts
shifts: {
title: 'Schichtplanung',
new: 'Neue Schicht',
shift: 'Schicht',
shiftPlan: 'Schichtplan',
morning: 'Frühschicht',
afternoon: 'Spätschicht',
night: 'Nachtschicht',
startTime: 'Startzeit',
endTime: 'Endzeit',
break: 'Pause',
assigned: 'Zugewiesen',
unassigned: 'Nicht zugewiesen',
swapRequest: 'Tausch anfragen',
approve: 'Genehmigen',
reject: 'Ablehnen',
},
// Availability
availability: {
title: 'Verfügbarkeit',
available: 'Verfügbar',
unavailable: 'Nicht verfügbar',
partiallyAvailable: 'Teilweise verfügbar',
setAvailability: 'Verfügbarkeit eintragen',
reason: 'Grund',
vacation: 'Urlaub',
sick: 'Krank',
training: 'Fortbildung',
other: 'Sonstiges',
},
// Timesheets
timesheets: {
title: 'Stundenzettel',
new: 'Neuer Eintrag',
hours: 'Stunden',
totalHours: 'Gesamtstunden',
workDate: 'Arbeitstag',
checkIn: 'Einstempeln',
checkOut: 'Ausstempeln',
breakTime: 'Pausenzeit',
overtime: 'Überstunden',
upload: 'Stundenzettel hochladen',
statuses: {
pending: 'Ausstehend',
approved: 'Genehmigt',
rejected: 'Abgelehnt',
},
},
// Qualifications
qualifications: {
title: 'Qualifikationen',
new: 'Neue Qualifikation',
type: 'Art',
types: {
'34a': '§34a Sachkundeprüfung',
'first_aid': 'Erste-Hilfe-Kurs',
'fire_safety': 'Brandschutzhelfer',
'security_check': 'Sicherheitsüberprüfung',
'drivers_license': 'Führerschein',
'other': 'Sonstige',
},
issueDate: 'Ausstellungsdatum',
expiryDate: 'Ablaufdatum',
issuedBy: 'Ausgestellt von',
valid: 'Gültig',
expired: 'Abgelaufen',
expiringSoon: 'Läuft bald ab',
daysUntilExpiry: 'Tage bis Ablauf',
reminder: 'Erinnerung',
},
// Objects
objects: {
title: 'Objekte',
new: 'Neues Objekt',
object: 'Objekt',
name: 'Name',
address: 'Adresse',
contact: 'Ansprechpartner',
phone: 'Telefon',
instructions: 'Dienstanweisungen',
documents: 'Dokumente',
accessInfo: 'Zugangsinformationen',
},
// Patrols
patrols: {
title: 'Rundgänge',
new: 'Neuer Rundgang',
checkpoint: 'Checkpoint',
checkpoints: 'Checkpoints',
route: 'Route',
routes: 'Routen',
log: 'Protokoll',
logs: 'Protokolle',
scanned: 'Gescannt',
missed: 'Verpasst',
scanTime: 'Scan-Zeit',
expectedTime: 'Erwartete Zeit',
deviation: 'Abweichung',
},
// Incidents
incidents: {
title: 'Vorfälle',
new: 'Neuer Vorfall',
incident: 'Vorfall',
category: 'Kategorie',
categories: {
theft: 'Diebstahl',
vandalism: 'Vandalismus',
trespassing: 'Hausfriedensbruch',
fire: 'Brand',
medical: 'Medizinischer Notfall',
technical: 'Technisches Problem',
other: 'Sonstiges',
},
severity: 'Schweregrad',
severities: {
low: 'Niedrig',
medium: 'Mittel',
high: 'Hoch',
critical: 'Kritisch',
},
reporter: 'Gemeldet von',
location: 'Ort',
witnesses: 'Zeugen',
attachments: 'Anhänge',
resolved: 'Gelöst',
unresolved: 'Ungelöst',
},
// Documents
documents: {
title: 'Dokumente',
new: 'Neues Dokument',
document: 'Dokument',
category: 'Kategorie',
categories: {
contract: 'Vertrag',
certificate: 'Zertifikat',
policy: 'Richtlinie',
manual: 'Handbuch',
form: 'Formular',
other: 'Sonstiges',
},
uploadDate: 'Hochgeladen am',
fileType: 'Dateityp',
fileSize: 'Dateigröße',
mandatory: 'Pflichtdokument',
acknowledged: 'Bestätigt',
acknowledgement: 'Kenntnisnahme',
},
// Vehicles
vehicles: {
title: 'Fahrzeuge',
new: 'Neues Fahrzeug',
vehicle: 'Fahrzeug',
licensePlate: 'Kennzeichen',
make: 'Marke',
model: 'Modell',
year: 'Baujahr',
mileage: 'Kilometerstand',
fuelLevel: 'Tankstand',
status: 'Status',
statuses: {
available: 'Verfügbar',
inUse: 'In Benutzung',
maintenance: 'Wartung',
outOfService: 'Außer Betrieb',
},
booking: 'Buchung',
bookings: 'Buchungen',
maintenance: 'Wartung',
nextService: 'Nächste Wartung',
},
// Customers
customers: {
title: 'Kunden',
new: 'Neuer Kunde',
customer: 'Kunde',
company: 'Firma',
contact: 'Ansprechpartner',
email: 'E-Mail',
phone: 'Telefon',
address: 'Adresse',
contracts: 'Verträge',
communication: 'Kommunikation',
notes: 'Notizen',
},
// Billing
billing: {
title: 'Abrechnung',
invoices: 'Rechnungen',
newInvoice: 'Neue Rechnung',
invoice: 'Rechnung',
invoiceNumber: 'Rechnungsnummer',
amount: 'Betrag',
tax: 'MwSt.',
subtotal: 'Zwischensumme',
total: 'Gesamt',
dueDate: 'Fälligkeitsdatum',
paidDate: 'Bezahlt am',
statuses: {
draft: 'Entwurf',
sent: 'Versendet',
paid: 'Bezahlt',
overdue: 'Überfällig',
cancelled: 'Storniert',
},
hourlyRates: 'Stundensätze',
rate: 'Satz',
reminders: 'Mahnungen',
},
// Modules
modules: {
title: 'Module',
enabled: 'Aktiviert',
disabled: 'Deaktiviert',
enable: 'Aktivieren',
disable: 'Deaktivieren',
configure: 'Konfigurieren',
},
// Settings
settings: {
title: 'Einstellungen',
profile: 'Profil',
account: 'Konto',
notifications: 'Benachrichtigungen',
security: 'Sicherheit',
language: 'Sprache',
theme: 'Design',
darkMode: 'Dunkelmodus',
lightMode: 'Hellmodus',
changePassword: 'Passwort ändern',
twoFactor: 'Zwei-Faktor-Authentifizierung',
lockScreen: 'Bildschirmsperre',
lockMethod: 'Sperrmethode',
pin: 'PIN',
pattern: 'Muster',
},
// Help
help: {
title: 'Hilfe & Support',
faq: 'Häufige Fragen',
contact: 'Kontakt',
documentation: 'Dokumentation',
tutorials: 'Tutorials',
feedback: 'Feedback',
},
// Messages
messages: {
success: 'Erfolgreich',
error: 'Fehler',
warning: 'Warnung',
info: 'Information',
saved: 'Gespeichert',
deleted: 'Gelöscht',
updated: 'Aktualisiert',
created: 'Erstellt',
confirmDelete: 'Sind Sie sicher, dass Sie dies löschen möchten?',
noData: 'Keine Daten vorhanden',
loading: 'Wird geladen...',
required: 'Pflichtfeld',
invalid: 'Ungültige Eingabe',
},
// Time
time: {
today: 'Heute',
yesterday: 'Gestern',
tomorrow: 'Morgen',
thisWeek: 'Diese Woche',
lastWeek: 'Letzte Woche',
thisMonth: 'Dieser Monat',
lastMonth: 'Letzter Monat',
days: 'Tage',
hours: 'Stunden',
minutes: 'Minuten',
},
}

434
src/locales/en.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'Employee Management',
loading: 'Loading...',
save: 'Save',
cancel: 'Cancel',
delete: 'Delete',
edit: 'Edit',
add: 'Add',
search: 'Search',
filter: 'Filter',
actions: 'Actions',
close: 'Close',
confirm: 'Confirm',
yes: 'Yes',
no: 'No',
back: 'Back',
next: 'Next',
submit: 'Submit',
reset: 'Reset',
export: 'Export',
import: 'Import',
download: 'Download',
upload: 'Upload',
all: 'All',
none: 'None',
status: 'Status',
date: 'Date',
time: 'Time',
from: 'From',
to: 'To',
total: 'Total',
details: 'Details',
description: 'Description',
notes: 'Notes',
created: 'Created',
updated: 'Updated',
},
// Auth
auth: {
login: 'Login',
logout: 'Logout',
register: 'Register',
email: 'Email',
password: 'Password',
confirmPassword: 'Confirm Password',
forgotPassword: 'Forgot Password?',
rememberMe: 'Remember me',
welcomeBack: 'Welcome back',
loginToContinue: 'Sign in to continue',
noAccount: 'No account yet?',
hasAccount: 'Already have an account?',
createOrg: 'Create Organization',
orgName: 'Company Name',
firstName: 'First Name',
lastName: 'Last Name',
},
// Navigation
nav: {
dashboard: 'Dashboard',
orders: 'Orders',
users: 'Employees',
shifts: 'Shift Planning',
availability: 'Availability',
timesheets: 'Timesheets',
qualifications: 'Qualifications',
objects: 'Objects',
patrols: 'Patrols',
incidents: 'Incidents',
documents: 'Documents',
vehicles: 'Vehicles',
customers: 'Customers',
billing: 'Billing',
modules: 'Modules',
settings: 'Settings',
help: 'Help',
partnerships: 'Partnerships',
},
// Dashboard
dashboard: {
welcome: 'Welcome',
overview: 'Overview',
todayOrders: "Today's Orders",
activeEmployees: 'Active Employees',
openIncidents: 'Open Incidents',
pendingTimesheets: 'Pending Timesheets',
recentActivity: 'Recent Activity',
upcomingShifts: 'Upcoming Shifts',
expiringQualifications: 'Expiring Qualifications',
quickActions: 'Quick Actions',
},
// Orders
orders: {
title: 'Orders',
new: 'New Order',
orderNumber: 'Order Number',
client: 'Client',
location: 'Location',
startDate: 'Start Date',
endDate: 'End Date',
assignedTo: 'Assigned To',
priority: 'Priority',
priorities: {
low: 'Low',
medium: 'Medium',
high: 'High',
urgent: 'Urgent',
},
statuses: {
draft: 'Draft',
scheduled: 'Scheduled',
active: 'Active',
completed: 'Completed',
cancelled: 'Cancelled',
},
},
// Users
users: {
title: 'Employees',
new: 'New Employee',
employee: 'Employee',
employees: 'Employees',
role: 'Role',
roles: {
chef: 'Manager',
disponent: 'Dispatcher',
mitarbeiter: 'Employee',
},
phone: 'Phone',
address: 'Address',
hireDate: 'Hire Date',
active: 'Active',
inactive: 'Inactive',
},
// Shifts
shifts: {
title: 'Shift Planning',
new: 'New Shift',
shift: 'Shift',
shiftPlan: 'Shift Plan',
morning: 'Morning Shift',
afternoon: 'Afternoon Shift',
night: 'Night Shift',
startTime: 'Start Time',
endTime: 'End Time',
break: 'Break',
assigned: 'Assigned',
unassigned: 'Unassigned',
swapRequest: 'Request Swap',
approve: 'Approve',
reject: 'Reject',
},
// Availability
availability: {
title: 'Availability',
available: 'Available',
unavailable: 'Unavailable',
partiallyAvailable: 'Partially Available',
setAvailability: 'Set Availability',
reason: 'Reason',
vacation: 'Vacation',
sick: 'Sick',
training: 'Training',
other: 'Other',
},
// Timesheets
timesheets: {
title: 'Timesheets',
new: 'New Entry',
hours: 'Hours',
totalHours: 'Total Hours',
workDate: 'Work Date',
checkIn: 'Check In',
checkOut: 'Check Out',
breakTime: 'Break Time',
overtime: 'Overtime',
upload: 'Upload Timesheet',
statuses: {
pending: 'Pending',
approved: 'Approved',
rejected: 'Rejected',
},
},
// Qualifications
qualifications: {
title: 'Qualifications',
new: 'New Qualification',
type: 'Type',
types: {
'34a': '§34a Security Certificate',
'first_aid': 'First Aid Course',
'fire_safety': 'Fire Safety',
'security_check': 'Security Clearance',
'drivers_license': "Driver's License",
'other': 'Other',
},
issueDate: 'Issue Date',
expiryDate: 'Expiry Date',
issuedBy: 'Issued By',
valid: 'Valid',
expired: 'Expired',
expiringSoon: 'Expiring Soon',
daysUntilExpiry: 'Days Until Expiry',
reminder: 'Reminder',
},
// Objects
objects: {
title: 'Objects',
new: 'New Object',
object: 'Object',
name: 'Name',
address: 'Address',
contact: 'Contact Person',
phone: 'Phone',
instructions: 'Instructions',
documents: 'Documents',
accessInfo: 'Access Information',
},
// Patrols
patrols: {
title: 'Patrols',
new: 'New Patrol',
checkpoint: 'Checkpoint',
checkpoints: 'Checkpoints',
route: 'Route',
routes: 'Routes',
log: 'Log',
logs: 'Logs',
scanned: 'Scanned',
missed: 'Missed',
scanTime: 'Scan Time',
expectedTime: 'Expected Time',
deviation: 'Deviation',
},
// Incidents
incidents: {
title: 'Incidents',
new: 'New Incident',
incident: 'Incident',
category: 'Category',
categories: {
theft: 'Theft',
vandalism: 'Vandalism',
trespassing: 'Trespassing',
fire: 'Fire',
medical: 'Medical Emergency',
technical: 'Technical Issue',
other: 'Other',
},
severity: 'Severity',
severities: {
low: 'Low',
medium: 'Medium',
high: 'High',
critical: 'Critical',
},
reporter: 'Reported By',
location: 'Location',
witnesses: 'Witnesses',
attachments: 'Attachments',
resolved: 'Resolved',
unresolved: 'Unresolved',
},
// Documents
documents: {
title: 'Documents',
new: 'New Document',
document: 'Document',
category: 'Category',
categories: {
contract: 'Contract',
certificate: 'Certificate',
policy: 'Policy',
manual: 'Manual',
form: 'Form',
other: 'Other',
},
uploadDate: 'Upload Date',
fileType: 'File Type',
fileSize: 'File Size',
mandatory: 'Mandatory',
acknowledged: 'Acknowledged',
acknowledgement: 'Acknowledgement',
},
// Vehicles
vehicles: {
title: 'Vehicles',
new: 'New Vehicle',
vehicle: 'Vehicle',
licensePlate: 'License Plate',
make: 'Make',
model: 'Model',
year: 'Year',
mileage: 'Mileage',
fuelLevel: 'Fuel Level',
status: 'Status',
statuses: {
available: 'Available',
inUse: 'In Use',
maintenance: 'Maintenance',
outOfService: 'Out of Service',
},
booking: 'Booking',
bookings: 'Bookings',
maintenance: 'Maintenance',
nextService: 'Next Service',
},
// Customers
customers: {
title: 'Customers',
new: 'New Customer',
customer: 'Customer',
company: 'Company',
contact: 'Contact Person',
email: 'Email',
phone: 'Phone',
address: 'Address',
contracts: 'Contracts',
communication: 'Communication',
notes: 'Notes',
},
// Billing
billing: {
title: 'Billing',
invoices: 'Invoices',
newInvoice: 'New Invoice',
invoice: 'Invoice',
invoiceNumber: 'Invoice Number',
amount: 'Amount',
tax: 'Tax',
subtotal: 'Subtotal',
total: 'Total',
dueDate: 'Due Date',
paidDate: 'Paid Date',
statuses: {
draft: 'Draft',
sent: 'Sent',
paid: 'Paid',
overdue: 'Overdue',
cancelled: 'Cancelled',
},
hourlyRates: 'Hourly Rates',
rate: 'Rate',
reminders: 'Reminders',
},
// Modules
modules: {
title: 'Modules',
enabled: 'Enabled',
disabled: 'Disabled',
enable: 'Enable',
disable: 'Disable',
configure: 'Configure',
},
// Settings
settings: {
title: 'Settings',
profile: 'Profile',
account: 'Account',
notifications: 'Notifications',
security: 'Security',
language: 'Language',
theme: 'Theme',
darkMode: 'Dark Mode',
lightMode: 'Light Mode',
changePassword: 'Change Password',
twoFactor: 'Two-Factor Authentication',
lockScreen: 'Lock Screen',
lockMethod: 'Lock Method',
pin: 'PIN',
pattern: 'Pattern',
},
// Help
help: {
title: 'Help & Support',
faq: 'FAQ',
contact: 'Contact',
documentation: 'Documentation',
tutorials: 'Tutorials',
feedback: 'Feedback',
},
// Messages
messages: {
success: 'Success',
error: 'Error',
warning: 'Warning',
info: 'Information',
saved: 'Saved',
deleted: 'Deleted',
updated: 'Updated',
created: 'Created',
confirmDelete: 'Are you sure you want to delete this?',
noData: 'No data available',
loading: 'Loading...',
required: 'Required field',
invalid: 'Invalid input',
},
// Time
time: {
today: 'Today',
yesterday: 'Yesterday',
tomorrow: 'Tomorrow',
thisWeek: 'This Week',
lastWeek: 'Last Week',
thisMonth: 'This Month',
lastMonth: 'Last Month',
days: 'days',
hours: 'hours',
minutes: 'minutes',
},
}

434
src/locales/es.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'Gestión de Empleados',
loading: 'Cargando...',
save: 'Guardar',
cancel: 'Cancelar',
delete: 'Eliminar',
edit: 'Editar',
add: 'Añadir',
search: 'Buscar',
filter: 'Filtrar',
actions: 'Acciones',
close: 'Cerrar',
confirm: 'Confirmar',
yes: 'Sí',
no: 'No',
back: 'Atrás',
next: 'Siguiente',
submit: 'Enviar',
reset: 'Restablecer',
export: 'Exportar',
import: 'Importar',
download: 'Descargar',
upload: 'Subir',
all: 'Todos',
none: 'Ninguno',
status: 'Estado',
date: 'Fecha',
time: 'Hora',
from: 'Desde',
to: 'Hasta',
total: 'Total',
details: 'Detalles',
description: 'Descripción',
notes: 'Notas',
created: 'Creado',
updated: 'Actualizado',
},
// Auth
auth: {
login: 'Iniciar sesión',
logout: 'Cerrar sesión',
register: 'Registrarse',
email: 'Correo electrónico',
password: 'Contraseña',
confirmPassword: 'Confirmar contraseña',
forgotPassword: '¿Olvidaste tu contraseña?',
rememberMe: 'Recordarme',
welcomeBack: 'Bienvenido de nuevo',
loginToContinue: 'Inicia sesión para continuar',
noAccount: '¿No tienes cuenta?',
hasAccount: '¿Ya tienes una cuenta?',
createOrg: 'Crear organización',
orgName: 'Nombre de la empresa',
firstName: 'Nombre',
lastName: 'Apellido',
},
// Navigation
nav: {
dashboard: 'Panel',
orders: 'Pedidos',
users: 'Empleados',
shifts: 'Planificación de turnos',
availability: 'Disponibilidad',
timesheets: 'Hojas de horas',
qualifications: 'Cualificaciones',
objects: 'Objetos',
patrols: 'Rondas',
incidents: 'Incidentes',
documents: 'Documentos',
vehicles: 'Vehículos',
customers: 'Clientes',
billing: 'Facturación',
modules: 'Módulos',
settings: 'Configuración',
help: 'Ayuda',
partnerships: 'Asociaciones',
},
// Dashboard
dashboard: {
welcome: 'Bienvenido',
overview: 'Resumen',
todayOrders: 'Pedidos de hoy',
activeEmployees: 'Empleados activos',
openIncidents: 'Incidentes abiertos',
pendingTimesheets: 'Hojas de horas pendientes',
recentActivity: 'Actividad reciente',
upcomingShifts: 'Próximos turnos',
expiringQualifications: 'Cualificaciones por vencer',
quickActions: 'Acciones rápidas',
},
// Orders
orders: {
title: 'Pedidos',
new: 'Nuevo pedido',
orderNumber: 'Número de pedido',
client: 'Cliente',
location: 'Ubicación',
startDate: 'Fecha de inicio',
endDate: 'Fecha de fin',
assignedTo: 'Asignado a',
priority: 'Prioridad',
priorities: {
low: 'Baja',
medium: 'Media',
high: 'Alta',
urgent: 'Urgente',
},
statuses: {
draft: 'Borrador',
scheduled: 'Programado',
active: 'Activo',
completed: 'Completado',
cancelled: 'Cancelado',
},
},
// Users
users: {
title: 'Empleados',
new: 'Nuevo empleado',
employee: 'Empleado',
employees: 'Empleados',
role: 'Rol',
roles: {
chef: 'Gerente',
disponent: 'Despachador',
mitarbeiter: 'Empleado',
},
phone: 'Teléfono',
address: 'Dirección',
hireDate: 'Fecha de contratación',
active: 'Activo',
inactive: 'Inactivo',
},
// Shifts
shifts: {
title: 'Planificación de turnos',
new: 'Nuevo turno',
shift: 'Turno',
shiftPlan: 'Plan de turnos',
morning: 'Turno de mañana',
afternoon: 'Turno de tarde',
night: 'Turno de noche',
startTime: 'Hora de inicio',
endTime: 'Hora de fin',
break: 'Descanso',
assigned: 'Asignado',
unassigned: 'Sin asignar',
swapRequest: 'Solicitar cambio',
approve: 'Aprobar',
reject: 'Rechazar',
},
// Availability
availability: {
title: 'Disponibilidad',
available: 'Disponible',
unavailable: 'No disponible',
partiallyAvailable: 'Parcialmente disponible',
setAvailability: 'Establecer disponibilidad',
reason: 'Motivo',
vacation: 'Vacaciones',
sick: 'Enfermedad',
training: 'Formación',
other: 'Otro',
},
// Timesheets
timesheets: {
title: 'Hojas de horas',
new: 'Nueva entrada',
hours: 'Horas',
totalHours: 'Horas totales',
workDate: 'Día de trabajo',
checkIn: 'Entrada',
checkOut: 'Salida',
breakTime: 'Tiempo de descanso',
overtime: 'Horas extra',
upload: 'Subir hoja de horas',
statuses: {
pending: 'Pendiente',
approved: 'Aprobado',
rejected: 'Rechazado',
},
},
// Qualifications
qualifications: {
title: 'Cualificaciones',
new: 'Nueva cualificación',
type: 'Tipo',
types: {
'34a': 'Certificado de seguridad §34a',
'first_aid': 'Curso de primeros auxilios',
'fire_safety': 'Seguridad contra incendios',
'security_check': 'Verificación de seguridad',
'drivers_license': 'Licencia de conducir',
'other': 'Otro',
},
issueDate: 'Fecha de emisión',
expiryDate: 'Fecha de vencimiento',
issuedBy: 'Emitido por',
valid: 'Válido',
expired: 'Vencido',
expiringSoon: 'Próximo a vencer',
daysUntilExpiry: 'Días hasta el vencimiento',
reminder: 'Recordatorio',
},
// Objects
objects: {
title: 'Objetos',
new: 'Nuevo objeto',
object: 'Objeto',
name: 'Nombre',
address: 'Dirección',
contact: 'Persona de contacto',
phone: 'Teléfono',
instructions: 'Instrucciones',
documents: 'Documentos',
accessInfo: 'Información de acceso',
},
// Patrols
patrols: {
title: 'Rondas',
new: 'Nueva ronda',
checkpoint: 'Punto de control',
checkpoints: 'Puntos de control',
route: 'Ruta',
routes: 'Rutas',
log: 'Registro',
logs: 'Registros',
scanned: 'Escaneado',
missed: 'Perdido',
scanTime: 'Hora de escaneo',
expectedTime: 'Hora esperada',
deviation: 'Desviación',
},
// Incidents
incidents: {
title: 'Incidentes',
new: 'Nuevo incidente',
incident: 'Incidente',
category: 'Categoría',
categories: {
theft: 'Robo',
vandalism: 'Vandalismo',
trespassing: 'Allanamiento',
fire: 'Incendio',
medical: 'Emergencia médica',
technical: 'Problema técnico',
other: 'Otro',
},
severity: 'Gravedad',
severities: {
low: 'Baja',
medium: 'Media',
high: 'Alta',
critical: 'Crítica',
},
reporter: 'Reportado por',
location: 'Ubicación',
witnesses: 'Testigos',
attachments: 'Adjuntos',
resolved: 'Resuelto',
unresolved: 'Sin resolver',
},
// Documents
documents: {
title: 'Documentos',
new: 'Nuevo documento',
document: 'Documento',
category: 'Categoría',
categories: {
contract: 'Contrato',
certificate: 'Certificado',
policy: 'Política',
manual: 'Manual',
form: 'Formulario',
other: 'Otro',
},
uploadDate: 'Fecha de subida',
fileType: 'Tipo de archivo',
fileSize: 'Tamaño de archivo',
mandatory: 'Obligatorio',
acknowledged: 'Reconocido',
acknowledgement: 'Reconocimiento',
},
// Vehicles
vehicles: {
title: 'Vehículos',
new: 'Nuevo vehículo',
vehicle: 'Vehículo',
licensePlate: 'Matrícula',
make: 'Marca',
model: 'Modelo',
year: 'Año',
mileage: 'Kilometraje',
fuelLevel: 'Nivel de combustible',
status: 'Estado',
statuses: {
available: 'Disponible',
inUse: 'En uso',
maintenance: 'Mantenimiento',
outOfService: 'Fuera de servicio',
},
booking: 'Reserva',
bookings: 'Reservas',
maintenance: 'Mantenimiento',
nextService: 'Próximo servicio',
},
// Customers
customers: {
title: 'Clientes',
new: 'Nuevo cliente',
customer: 'Cliente',
company: 'Empresa',
contact: 'Persona de contacto',
email: 'Correo electrónico',
phone: 'Teléfono',
address: 'Dirección',
contracts: 'Contratos',
communication: 'Comunicación',
notes: 'Notas',
},
// Billing
billing: {
title: 'Facturación',
invoices: 'Facturas',
newInvoice: 'Nueva factura',
invoice: 'Factura',
invoiceNumber: 'Número de factura',
amount: 'Importe',
tax: 'IVA',
subtotal: 'Subtotal',
total: 'Total',
dueDate: 'Fecha de vencimiento',
paidDate: 'Fecha de pago',
statuses: {
draft: 'Borrador',
sent: 'Enviado',
paid: 'Pagado',
overdue: 'Vencido',
cancelled: 'Cancelado',
},
hourlyRates: 'Tarifas por hora',
rate: 'Tarifa',
reminders: 'Recordatorios',
},
// Modules
modules: {
title: 'Módulos',
enabled: 'Activado',
disabled: 'Desactivado',
enable: 'Activar',
disable: 'Desactivar',
configure: 'Configurar',
},
// Settings
settings: {
title: 'Configuración',
profile: 'Perfil',
account: 'Cuenta',
notifications: 'Notificaciones',
security: 'Seguridad',
language: 'Idioma',
theme: 'Tema',
darkMode: 'Modo oscuro',
lightMode: 'Modo claro',
changePassword: 'Cambiar contraseña',
twoFactor: 'Autenticación de dos factores',
lockScreen: 'Pantalla de bloqueo',
lockMethod: 'Método de bloqueo',
pin: 'PIN',
pattern: 'Patrón',
},
// Help
help: {
title: 'Ayuda y soporte',
faq: 'Preguntas frecuentes',
contact: 'Contacto',
documentation: 'Documentación',
tutorials: 'Tutoriales',
feedback: 'Comentarios',
},
// Messages
messages: {
success: 'Éxito',
error: 'Error',
warning: 'Advertencia',
info: 'Información',
saved: 'Guardado',
deleted: 'Eliminado',
updated: 'Actualizado',
created: 'Creado',
confirmDelete: '¿Estás seguro de que quieres eliminar esto?',
noData: 'No hay datos disponibles',
loading: 'Cargando...',
required: 'Campo obligatorio',
invalid: 'Entrada inválida',
},
// Time
time: {
today: 'Hoy',
yesterday: 'Ayer',
tomorrow: 'Mañana',
thisWeek: 'Esta semana',
lastWeek: 'La semana pasada',
thisMonth: 'Este mes',
lastMonth: 'El mes pasado',
days: 'días',
hours: 'horas',
minutes: 'minutos',
},
}

434
src/locales/fr.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'Gestion des employés',
loading: 'Chargement...',
save: 'Enregistrer',
cancel: 'Annuler',
delete: 'Supprimer',
edit: 'Modifier',
add: 'Ajouter',
search: 'Rechercher',
filter: 'Filtrer',
actions: 'Actions',
close: 'Fermer',
confirm: 'Confirmer',
yes: 'Oui',
no: 'Non',
back: 'Retour',
next: 'Suivant',
submit: 'Soumettre',
reset: 'Réinitialiser',
export: 'Exporter',
import: 'Importer',
download: 'Télécharger',
upload: 'Téléverser',
all: 'Tous',
none: 'Aucun',
status: 'Statut',
date: 'Date',
time: 'Heure',
from: 'De',
to: 'À',
total: 'Total',
details: 'Détails',
description: 'Description',
notes: 'Notes',
created: 'Créé',
updated: 'Mis à jour',
},
// Auth
auth: {
login: 'Connexion',
logout: 'Déconnexion',
register: "S'inscrire",
email: 'E-mail',
password: 'Mot de passe',
confirmPassword: 'Confirmer le mot de passe',
forgotPassword: 'Mot de passe oublié ?',
rememberMe: 'Se souvenir de moi',
welcomeBack: 'Bon retour',
loginToContinue: 'Connectez-vous pour continuer',
noAccount: "Pas encore de compte ?",
hasAccount: 'Déjà un compte ?',
createOrg: 'Créer une organisation',
orgName: "Nom de l'entreprise",
firstName: 'Prénom',
lastName: 'Nom',
},
// Navigation
nav: {
dashboard: 'Tableau de bord',
orders: 'Commandes',
users: 'Employés',
shifts: 'Planification des équipes',
availability: 'Disponibilité',
timesheets: 'Feuilles de temps',
qualifications: 'Qualifications',
objects: 'Objets',
patrols: 'Rondes',
incidents: 'Incidents',
documents: 'Documents',
vehicles: 'Véhicules',
customers: 'Clients',
billing: 'Facturation',
modules: 'Modules',
settings: 'Paramètres',
help: 'Aide',
partnerships: 'Partenariats',
},
// Dashboard
dashboard: {
welcome: 'Bienvenue',
overview: 'Aperçu',
todayOrders: "Commandes d'aujourd'hui",
activeEmployees: 'Employés actifs',
openIncidents: 'Incidents ouverts',
pendingTimesheets: 'Feuilles de temps en attente',
recentActivity: 'Activité récente',
upcomingShifts: 'Équipes à venir',
expiringQualifications: 'Qualifications expirant',
quickActions: 'Actions rapides',
},
// Orders
orders: {
title: 'Commandes',
new: 'Nouvelle commande',
orderNumber: 'Numéro de commande',
client: 'Client',
location: 'Lieu',
startDate: 'Date de début',
endDate: 'Date de fin',
assignedTo: 'Assigné à',
priority: 'Priorité',
priorities: {
low: 'Basse',
medium: 'Moyenne',
high: 'Haute',
urgent: 'Urgente',
},
statuses: {
draft: 'Brouillon',
scheduled: 'Planifié',
active: 'Actif',
completed: 'Terminé',
cancelled: 'Annulé',
},
},
// Users
users: {
title: 'Employés',
new: 'Nouvel employé',
employee: 'Employé',
employees: 'Employés',
role: 'Rôle',
roles: {
chef: 'Responsable',
disponent: 'Répartiteur',
mitarbeiter: 'Employé',
},
phone: 'Téléphone',
address: 'Adresse',
hireDate: "Date d'embauche",
active: 'Actif',
inactive: 'Inactif',
},
// Shifts
shifts: {
title: 'Planification des équipes',
new: 'Nouvelle équipe',
shift: 'Équipe',
shiftPlan: 'Plan des équipes',
morning: 'Équipe du matin',
afternoon: "Équipe de l'après-midi",
night: 'Équipe de nuit',
startTime: 'Heure de début',
endTime: 'Heure de fin',
break: 'Pause',
assigned: 'Assigné',
unassigned: 'Non assigné',
swapRequest: 'Demander un échange',
approve: 'Approuver',
reject: 'Rejeter',
},
// Availability
availability: {
title: 'Disponibilité',
available: 'Disponible',
unavailable: 'Non disponible',
partiallyAvailable: 'Partiellement disponible',
setAvailability: 'Définir la disponibilité',
reason: 'Raison',
vacation: 'Vacances',
sick: 'Maladie',
training: 'Formation',
other: 'Autre',
},
// Timesheets
timesheets: {
title: 'Feuilles de temps',
new: 'Nouvelle entrée',
hours: 'Heures',
totalHours: 'Heures totales',
workDate: 'Jour de travail',
checkIn: 'Pointage entrée',
checkOut: 'Pointage sortie',
breakTime: 'Temps de pause',
overtime: 'Heures supplémentaires',
upload: 'Téléverser la feuille de temps',
statuses: {
pending: 'En attente',
approved: 'Approuvé',
rejected: 'Rejeté',
},
},
// Qualifications
qualifications: {
title: 'Qualifications',
new: 'Nouvelle qualification',
type: 'Type',
types: {
'34a': 'Certificat de sécurité §34a',
'first_aid': 'Formation aux premiers secours',
'fire_safety': 'Sécurité incendie',
'security_check': 'Habilitation sécurité',
'drivers_license': 'Permis de conduire',
'other': 'Autre',
},
issueDate: 'Date de délivrance',
expiryDate: "Date d'expiration",
issuedBy: 'Délivré par',
valid: 'Valide',
expired: 'Expiré',
expiringSoon: 'Expire bientôt',
daysUntilExpiry: "Jours avant l'expiration",
reminder: 'Rappel',
},
// Objects
objects: {
title: 'Objets',
new: 'Nouvel objet',
object: 'Objet',
name: 'Nom',
address: 'Adresse',
contact: 'Personne de contact',
phone: 'Téléphone',
instructions: 'Instructions',
documents: 'Documents',
accessInfo: "Informations d'accès",
},
// Patrols
patrols: {
title: 'Rondes',
new: 'Nouvelle ronde',
checkpoint: 'Point de contrôle',
checkpoints: 'Points de contrôle',
route: 'Itinéraire',
routes: 'Itinéraires',
log: 'Journal',
logs: 'Journaux',
scanned: 'Scanné',
missed: 'Manqué',
scanTime: 'Heure du scan',
expectedTime: 'Heure prévue',
deviation: 'Écart',
},
// Incidents
incidents: {
title: 'Incidents',
new: 'Nouvel incident',
incident: 'Incident',
category: 'Catégorie',
categories: {
theft: 'Vol',
vandalism: 'Vandalisme',
trespassing: 'Intrusion',
fire: 'Incendie',
medical: 'Urgence médicale',
technical: 'Problème technique',
other: 'Autre',
},
severity: 'Gravité',
severities: {
low: 'Basse',
medium: 'Moyenne',
high: 'Haute',
critical: 'Critique',
},
reporter: 'Signalé par',
location: 'Lieu',
witnesses: 'Témoins',
attachments: 'Pièces jointes',
resolved: 'Résolu',
unresolved: 'Non résolu',
},
// Documents
documents: {
title: 'Documents',
new: 'Nouveau document',
document: 'Document',
category: 'Catégorie',
categories: {
contract: 'Contrat',
certificate: 'Certificat',
policy: 'Politique',
manual: 'Manuel',
form: 'Formulaire',
other: 'Autre',
},
uploadDate: 'Date de téléversement',
fileType: 'Type de fichier',
fileSize: 'Taille du fichier',
mandatory: 'Obligatoire',
acknowledged: 'Accusé de réception',
acknowledgement: 'Accusé',
},
// Vehicles
vehicles: {
title: 'Véhicules',
new: 'Nouveau véhicule',
vehicle: 'Véhicule',
licensePlate: "Plaque d'immatriculation",
make: 'Marque',
model: 'Modèle',
year: 'Année',
mileage: 'Kilométrage',
fuelLevel: 'Niveau de carburant',
status: 'Statut',
statuses: {
available: 'Disponible',
inUse: 'En utilisation',
maintenance: 'Maintenance',
outOfService: 'Hors service',
},
booking: 'Réservation',
bookings: 'Réservations',
maintenance: 'Maintenance',
nextService: 'Prochain entretien',
},
// Customers
customers: {
title: 'Clients',
new: 'Nouveau client',
customer: 'Client',
company: 'Entreprise',
contact: 'Personne de contact',
email: 'E-mail',
phone: 'Téléphone',
address: 'Adresse',
contracts: 'Contrats',
communication: 'Communication',
notes: 'Notes',
},
// Billing
billing: {
title: 'Facturation',
invoices: 'Factures',
newInvoice: 'Nouvelle facture',
invoice: 'Facture',
invoiceNumber: 'Numéro de facture',
amount: 'Montant',
tax: 'TVA',
subtotal: 'Sous-total',
total: 'Total',
dueDate: "Date d'échéance",
paidDate: 'Date de paiement',
statuses: {
draft: 'Brouillon',
sent: 'Envoyé',
paid: 'Payé',
overdue: 'En retard',
cancelled: 'Annulé',
},
hourlyRates: 'Tarifs horaires',
rate: 'Tarif',
reminders: 'Rappels',
},
// Modules
modules: {
title: 'Modules',
enabled: 'Activé',
disabled: 'Désactivé',
enable: 'Activer',
disable: 'Désactiver',
configure: 'Configurer',
},
// Settings
settings: {
title: 'Paramètres',
profile: 'Profil',
account: 'Compte',
notifications: 'Notifications',
security: 'Sécurité',
language: 'Langue',
theme: 'Thème',
darkMode: 'Mode sombre',
lightMode: 'Mode clair',
changePassword: 'Changer le mot de passe',
twoFactor: 'Authentification à deux facteurs',
lockScreen: 'Écran de verrouillage',
lockMethod: 'Méthode de verrouillage',
pin: 'PIN',
pattern: 'Motif',
},
// Help
help: {
title: 'Aide et support',
faq: 'FAQ',
contact: 'Contact',
documentation: 'Documentation',
tutorials: 'Tutoriels',
feedback: 'Commentaires',
},
// Messages
messages: {
success: 'Succès',
error: 'Erreur',
warning: 'Avertissement',
info: 'Information',
saved: 'Enregistré',
deleted: 'Supprimé',
updated: 'Mis à jour',
created: 'Créé',
confirmDelete: 'Êtes-vous sûr de vouloir supprimer ceci ?',
noData: 'Aucune donnée disponible',
loading: 'Chargement...',
required: 'Champ obligatoire',
invalid: 'Entrée invalide',
},
// Time
time: {
today: "Aujourd'hui",
yesterday: 'Hier',
tomorrow: 'Demain',
thisWeek: 'Cette semaine',
lastWeek: 'La semaine dernière',
thisMonth: 'Ce mois',
lastMonth: 'Le mois dernier',
days: 'jours',
hours: 'heures',
minutes: 'minutes',
},
}

434
src/locales/pl.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'Zarządzanie pracownikami',
loading: 'Ładowanie...',
save: 'Zapisz',
cancel: 'Anuluj',
delete: 'Usuń',
edit: 'Edytuj',
add: 'Dodaj',
search: 'Szukaj',
filter: 'Filtruj',
actions: 'Akcje',
close: 'Zamknij',
confirm: 'Potwierdź',
yes: 'Tak',
no: 'Nie',
back: 'Wstecz',
next: 'Dalej',
submit: 'Wyślij',
reset: 'Resetuj',
export: 'Eksportuj',
import: 'Importuj',
download: 'Pobierz',
upload: 'Prześlij',
all: 'Wszystkie',
none: 'Brak',
status: 'Status',
date: 'Data',
time: 'Czas',
from: 'Od',
to: 'Do',
total: 'Razem',
details: 'Szczegóły',
description: 'Opis',
notes: 'Notatki',
created: 'Utworzono',
updated: 'Zaktualizowano',
},
// Auth
auth: {
login: 'Zaloguj się',
logout: 'Wyloguj się',
register: 'Zarejestruj się',
email: 'E-mail',
password: 'Hasło',
confirmPassword: 'Potwierdź hasło',
forgotPassword: 'Zapomniałeś hasła?',
rememberMe: 'Zapamiętaj mnie',
welcomeBack: 'Witaj ponownie',
loginToContinue: 'Zaloguj się, aby kontynuować',
noAccount: 'Nie masz jeszcze konta?',
hasAccount: 'Masz już konto?',
createOrg: 'Utwórz organizację',
orgName: 'Nazwa firmy',
firstName: 'Imię',
lastName: 'Nazwisko',
},
// Navigation
nav: {
dashboard: 'Pulpit',
orders: 'Zamówienia',
users: 'Pracownicy',
shifts: 'Planowanie zmian',
availability: 'Dostępność',
timesheets: 'Karty czasu pracy',
qualifications: 'Kwalifikacje',
objects: 'Obiekty',
patrols: 'Patrole',
incidents: 'Incydenty',
documents: 'Dokumenty',
vehicles: 'Pojazdy',
customers: 'Klienci',
billing: 'Rozliczenia',
modules: 'Moduły',
settings: 'Ustawienia',
help: 'Pomoc',
partnerships: 'Partnerstwa',
},
// Dashboard
dashboard: {
welcome: 'Witaj',
overview: 'Przegląd',
todayOrders: 'Dzisiejsze zamówienia',
activeEmployees: 'Aktywni pracownicy',
openIncidents: 'Otwarte incydenty',
pendingTimesheets: 'Oczekujące karty czasu',
recentActivity: 'Ostatnia aktywność',
upcomingShifts: 'Nadchodzące zmiany',
expiringQualifications: 'Wygasające kwalifikacje',
quickActions: 'Szybkie akcje',
},
// Orders
orders: {
title: 'Zamówienia',
new: 'Nowe zamówienie',
orderNumber: 'Numer zamówienia',
client: 'Klient',
location: 'Lokalizacja',
startDate: 'Data rozpoczęcia',
endDate: 'Data zakończenia',
assignedTo: 'Przypisano do',
priority: 'Priorytet',
priorities: {
low: 'Niski',
medium: 'Średni',
high: 'Wysoki',
urgent: 'Pilny',
},
statuses: {
draft: 'Szkic',
scheduled: 'Zaplanowane',
active: 'Aktywne',
completed: 'Zakończone',
cancelled: 'Anulowane',
},
},
// Users
users: {
title: 'Pracownicy',
new: 'Nowy pracownik',
employee: 'Pracownik',
employees: 'Pracownicy',
role: 'Rola',
roles: {
chef: 'Kierownik',
disponent: 'Dyspozytor',
mitarbeiter: 'Pracownik',
},
phone: 'Telefon',
address: 'Adres',
hireDate: 'Data zatrudnienia',
active: 'Aktywny',
inactive: 'Nieaktywny',
},
// Shifts
shifts: {
title: 'Planowanie zmian',
new: 'Nowa zmiana',
shift: 'Zmiana',
shiftPlan: 'Plan zmian',
morning: 'Zmiana poranna',
afternoon: 'Zmiana popołudniowa',
night: 'Zmiana nocna',
startTime: 'Czas rozpoczęcia',
endTime: 'Czas zakończenia',
break: 'Przerwa',
assigned: 'Przypisano',
unassigned: 'Nieprzypisano',
swapRequest: 'Prośba o zamianę',
approve: 'Zatwierdź',
reject: 'Odrzuć',
},
// Availability
availability: {
title: 'Dostępność',
available: 'Dostępny',
unavailable: 'Niedostępny',
partiallyAvailable: 'Częściowo dostępny',
setAvailability: 'Ustaw dostępność',
reason: 'Powód',
vacation: 'Urlop',
sick: 'Choroba',
training: 'Szkolenie',
other: 'Inne',
},
// Timesheets
timesheets: {
title: 'Karty czasu pracy',
new: 'Nowy wpis',
hours: 'Godziny',
totalHours: 'Suma godzin',
workDate: 'Dzień pracy',
checkIn: 'Wejście',
checkOut: 'Wyjście',
breakTime: 'Czas przerwy',
overtime: 'Nadgodziny',
upload: 'Prześlij kartę czasu',
statuses: {
pending: 'Oczekujące',
approved: 'Zatwierdzone',
rejected: 'Odrzucone',
},
},
// Qualifications
qualifications: {
title: 'Kwalifikacje',
new: 'Nowa kwalifikacja',
type: 'Typ',
types: {
'34a': 'Certyfikat ochrony §34a',
'first_aid': 'Kurs pierwszej pomocy',
'fire_safety': 'Bezpieczeństwo pożarowe',
'security_check': 'Poświadczenie bezpieczeństwa',
'drivers_license': 'Prawo jazdy',
'other': 'Inne',
},
issueDate: 'Data wydania',
expiryDate: 'Data ważności',
issuedBy: 'Wydane przez',
valid: 'Ważna',
expired: 'Wygasła',
expiringSoon: 'Wkrótce wygasa',
daysUntilExpiry: 'Dni do wygaśnięcia',
reminder: 'Przypomnienie',
},
// Objects
objects: {
title: 'Obiekty',
new: 'Nowy obiekt',
object: 'Obiekt',
name: 'Nazwa',
address: 'Adres',
contact: 'Osoba kontaktowa',
phone: 'Telefon',
instructions: 'Instrukcje',
documents: 'Dokumenty',
accessInfo: 'Informacje o dostępie',
},
// Patrols
patrols: {
title: 'Patrole',
new: 'Nowy patrol',
checkpoint: 'Punkt kontrolny',
checkpoints: 'Punkty kontrolne',
route: 'Trasa',
routes: 'Trasy',
log: 'Dziennik',
logs: 'Dzienniki',
scanned: 'Zeskanowano',
missed: 'Pominięto',
scanTime: 'Czas skanowania',
expectedTime: 'Oczekiwany czas',
deviation: 'Odchylenie',
},
// Incidents
incidents: {
title: 'Incydenty',
new: 'Nowy incydent',
incident: 'Incydent',
category: 'Kategoria',
categories: {
theft: 'Kradzież',
vandalism: 'Wandalizm',
trespassing: 'Wtargnięcie',
fire: 'Pożar',
medical: 'Nagły przypadek medyczny',
technical: 'Problem techniczny',
other: 'Inne',
},
severity: 'Ważność',
severities: {
low: 'Niska',
medium: 'Średnia',
high: 'Wysoka',
critical: 'Krytyczna',
},
reporter: 'Zgłosił',
location: 'Lokalizacja',
witnesses: 'Świadkowie',
attachments: 'Załączniki',
resolved: 'Rozwiązany',
unresolved: 'Nierozwiązany',
},
// Documents
documents: {
title: 'Dokumenty',
new: 'Nowy dokument',
document: 'Dokument',
category: 'Kategoria',
categories: {
contract: 'Umowa',
certificate: 'Certyfikat',
policy: 'Polityka',
manual: 'Instrukcja',
form: 'Formularz',
other: 'Inne',
},
uploadDate: 'Data przesłania',
fileType: 'Typ pliku',
fileSize: 'Rozmiar pliku',
mandatory: 'Obowiązkowy',
acknowledged: 'Potwierdzono',
acknowledgement: 'Potwierdzenie',
},
// Vehicles
vehicles: {
title: 'Pojazdy',
new: 'Nowy pojazd',
vehicle: 'Pojazd',
licensePlate: 'Numer rejestracyjny',
make: 'Marka',
model: 'Model',
year: 'Rok',
mileage: 'Przebieg',
fuelLevel: 'Poziom paliwa',
status: 'Status',
statuses: {
available: 'Dostępny',
inUse: 'W użyciu',
maintenance: 'W serwisie',
outOfService: 'Wyłączony z użytku',
},
booking: 'Rezerwacja',
bookings: 'Rezerwacje',
maintenance: 'Serwis',
nextService: 'Następny przegląd',
},
// Customers
customers: {
title: 'Klienci',
new: 'Nowy klient',
customer: 'Klient',
company: 'Firma',
contact: 'Osoba kontaktowa',
email: 'E-mail',
phone: 'Telefon',
address: 'Adres',
contracts: 'Umowy',
communication: 'Komunikacja',
notes: 'Notatki',
},
// Billing
billing: {
title: 'Rozliczenia',
invoices: 'Faktury',
newInvoice: 'Nowa faktura',
invoice: 'Faktura',
invoiceNumber: 'Numer faktury',
amount: 'Kwota',
tax: 'VAT',
subtotal: 'Suma częściowa',
total: 'Razem',
dueDate: 'Termin płatności',
paidDate: 'Data płatności',
statuses: {
draft: 'Szkic',
sent: 'Wysłana',
paid: 'Opłacona',
overdue: 'Przeterminowana',
cancelled: 'Anulowana',
},
hourlyRates: 'Stawki godzinowe',
rate: 'Stawka',
reminders: 'Przypomnienia',
},
// Modules
modules: {
title: 'Moduły',
enabled: 'Włączony',
disabled: 'Wyłączony',
enable: 'Włącz',
disable: 'Wyłącz',
configure: 'Konfiguruj',
},
// Settings
settings: {
title: 'Ustawienia',
profile: 'Profil',
account: 'Konto',
notifications: 'Powiadomienia',
security: 'Bezpieczeństwo',
language: 'Język',
theme: 'Motyw',
darkMode: 'Tryb ciemny',
lightMode: 'Tryb jasny',
changePassword: 'Zmień hasło',
twoFactor: 'Uwierzytelnianie dwuskładnikowe',
lockScreen: 'Blokada ekranu',
lockMethod: 'Metoda blokady',
pin: 'PIN',
pattern: 'Wzór',
},
// Help
help: {
title: 'Pomoc i wsparcie',
faq: 'FAQ',
contact: 'Kontakt',
documentation: 'Dokumentacja',
tutorials: 'Samouczki',
feedback: 'Opinie',
},
// Messages
messages: {
success: 'Sukces',
error: 'Błąd',
warning: 'Ostrzeżenie',
info: 'Informacja',
saved: 'Zapisano',
deleted: 'Usunięto',
updated: 'Zaktualizowano',
created: 'Utworzono',
confirmDelete: 'Czy na pewno chcesz to usunąć?',
noData: 'Brak danych',
loading: 'Ładowanie...',
required: 'Pole wymagane',
invalid: 'Nieprawidłowe dane',
},
// Time
time: {
today: 'Dzisiaj',
yesterday: 'Wczoraj',
tomorrow: 'Jutro',
thisWeek: 'Ten tydzień',
lastWeek: 'Ostatni tydzień',
thisMonth: 'Ten miesiąc',
lastMonth: 'Ostatni miesiąc',
days: 'dni',
hours: 'godzin',
minutes: 'minut',
},
}

434
src/locales/ru.ts Normal file
View File

@@ -0,0 +1,434 @@
export default {
// General
app: {
name: 'SeCu',
title: 'Управление персоналом',
loading: 'Загрузка...',
save: 'Сохранить',
cancel: 'Отмена',
delete: 'Удалить',
edit: 'Редактировать',
add: 'Добавить',
search: 'Поиск',
filter: 'Фильтр',
actions: 'Действия',
close: 'Закрыть',
confirm: 'Подтвердить',
yes: 'Да',
no: 'Нет',
back: 'Назад',
next: 'Далее',
submit: 'Отправить',
reset: 'Сбросить',
export: 'Экспорт',
import: 'Импорт',
download: 'Скачать',
upload: 'Загрузить',
all: 'Все',
none: 'Нет',
status: 'Статус',
date: 'Дата',
time: 'Время',
from: 'От',
to: 'До',
total: 'Итого',
details: 'Подробности',
description: 'Описание',
notes: 'Заметки',
created: 'Создано',
updated: 'Обновлено',
},
// Auth
auth: {
login: 'Войти',
logout: 'Выйти',
register: 'Регистрация',
email: 'Эл. почта',
password: 'Пароль',
confirmPassword: 'Подтвердить пароль',
forgotPassword: 'Забыли пароль?',
rememberMe: 'Запомнить меня',
welcomeBack: 'Добро пожаловать',
loginToContinue: 'Войдите для продолжения',
noAccount: 'Нет аккаунта?',
hasAccount: 'Уже есть аккаунт?',
createOrg: 'Создать организацию',
orgName: 'Название компании',
firstName: 'Имя',
lastName: 'Фамилия',
},
// Navigation
nav: {
dashboard: 'Панель управления',
orders: 'Заказы',
users: 'Сотрудники',
shifts: 'Планирование смен',
availability: 'Доступность',
timesheets: 'Табели учёта',
qualifications: 'Квалификации',
objects: 'Объекты',
patrols: 'Патрули',
incidents: 'Инциденты',
documents: 'Документы',
vehicles: 'Транспорт',
customers: 'Клиенты',
billing: 'Выставление счетов',
modules: 'Модули',
settings: 'Настройки',
help: 'Помощь',
partnerships: 'Партнёрства',
},
// Dashboard
dashboard: {
welcome: 'Добро пожаловать',
overview: 'Обзор',
todayOrders: 'Заказы на сегодня',
activeEmployees: 'Активные сотрудники',
openIncidents: 'Открытые инциденты',
pendingTimesheets: 'Ожидающие табели',
recentActivity: 'Последняя активность',
upcomingShifts: 'Предстоящие смены',
expiringQualifications: 'Истекающие квалификации',
quickActions: 'Быстрые действия',
},
// Orders
orders: {
title: 'Заказы',
new: 'Новый заказ',
orderNumber: 'Номер заказа',
client: 'Клиент',
location: 'Местоположение',
startDate: 'Дата начала',
endDate: 'Дата окончания',
assignedTo: 'Назначен',
priority: 'Приоритет',
priorities: {
low: 'Низкий',
medium: 'Средний',
high: 'Высокий',
urgent: 'Срочный',
},
statuses: {
draft: 'Черновик',
scheduled: 'Запланировано',
active: 'Активный',
completed: 'Завершён',
cancelled: 'Отменён',
},
},
// Users
users: {
title: 'Сотрудники',
new: 'Новый сотрудник',
employee: 'Сотрудник',
employees: 'Сотрудники',
role: 'Роль',
roles: {
chef: 'Руководитель',
disponent: 'Диспетчер',
mitarbeiter: 'Сотрудник',
},
phone: 'Телефон',
address: 'Адрес',
hireDate: 'Дата приёма',
active: 'Активен',
inactive: 'Неактивен',
},
// Shifts
shifts: {
title: 'Планирование смен',
new: 'Новая смена',
shift: 'Смена',
shiftPlan: 'План смен',
morning: 'Утренняя смена',
afternoon: 'Дневная смена',
night: 'Ночная смена',
startTime: 'Время начала',
endTime: 'Время окончания',
break: 'Перерыв',
assigned: 'Назначено',
unassigned: 'Не назначено',
swapRequest: 'Запрос на обмен',
approve: 'Одобрить',
reject: 'Отклонить',
},
// Availability
availability: {
title: 'Доступность',
available: 'Доступен',
unavailable: 'Недоступен',
partiallyAvailable: 'Частично доступен',
setAvailability: 'Указать доступность',
reason: 'Причина',
vacation: 'Отпуск',
sick: 'Больничный',
training: 'Обучение',
other: 'Другое',
},
// Timesheets
timesheets: {
title: 'Табели учёта',
new: 'Новая запись',
hours: 'Часы',
totalHours: 'Всего часов',
workDate: 'Рабочий день',
checkIn: 'Приход',
checkOut: 'Уход',
breakTime: 'Время перерыва',
overtime: 'Сверхурочные',
upload: 'Загрузить табель',
statuses: {
pending: 'Ожидает',
approved: 'Одобрено',
rejected: 'Отклонено',
},
},
// Qualifications
qualifications: {
title: 'Квалификации',
new: 'Новая квалификация',
type: 'Тип',
types: {
'34a': 'Сертификат охраны §34a',
'first_aid': 'Курс первой помощи',
'fire_safety': 'Пожарная безопасность',
'security_check': 'Проверка безопасности',
'drivers_license': 'Водительские права',
'other': 'Другое',
},
issueDate: 'Дата выдачи',
expiryDate: 'Дата истечения',
issuedBy: 'Выдано',
valid: 'Действительна',
expired: 'Истекла',
expiringSoon: 'Скоро истекает',
daysUntilExpiry: 'Дней до истечения',
reminder: 'Напоминание',
},
// Objects
objects: {
title: 'Объекты',
new: 'Новый объект',
object: 'Объект',
name: 'Название',
address: 'Адрес',
contact: 'Контактное лицо',
phone: 'Телефон',
instructions: 'Инструкции',
documents: 'Документы',
accessInfo: 'Информация о доступе',
},
// Patrols
patrols: {
title: 'Патрули',
new: 'Новый патруль',
checkpoint: 'Контрольная точка',
checkpoints: 'Контрольные точки',
route: 'Маршрут',
routes: 'Маршруты',
log: 'Журнал',
logs: 'Журналы',
scanned: 'Сканировано',
missed: 'Пропущено',
scanTime: 'Время сканирования',
expectedTime: 'Ожидаемое время',
deviation: 'Отклонение',
},
// Incidents
incidents: {
title: 'Инциденты',
new: 'Новый инцидент',
incident: 'Инцидент',
category: 'Категория',
categories: {
theft: 'Кража',
vandalism: 'Вандализм',
trespassing: 'Незаконное проникновение',
fire: 'Пожар',
medical: 'Медицинская помощь',
technical: 'Техническая проблема',
other: 'Другое',
},
severity: 'Серьёзность',
severities: {
low: 'Низкая',
medium: 'Средняя',
high: 'Высокая',
critical: 'Критическая',
},
reporter: 'Сообщил',
location: 'Место',
witnesses: 'Свидетели',
attachments: 'Вложения',
resolved: 'Решено',
unresolved: 'Не решено',
},
// Documents
documents: {
title: 'Документы',
new: 'Новый документ',
document: 'Документ',
category: 'Категория',
categories: {
contract: 'Контракт',
certificate: 'Сертификат',
policy: 'Политика',
manual: 'Руководство',
form: 'Форма',
other: 'Другое',
},
uploadDate: 'Дата загрузки',
fileType: 'Тип файла',
fileSize: 'Размер файла',
mandatory: 'Обязательный',
acknowledged: 'Подтверждено',
acknowledgement: 'Подтверждение',
},
// Vehicles
vehicles: {
title: 'Транспорт',
new: 'Новое транспортное средство',
vehicle: 'Транспортное средство',
licensePlate: 'Номерной знак',
make: 'Марка',
model: 'Модель',
year: 'Год',
mileage: 'Пробег',
fuelLevel: 'Уровень топлива',
status: 'Статус',
statuses: {
available: 'Доступно',
inUse: 'Используется',
maintenance: 'На обслуживании',
outOfService: 'Не работает',
},
booking: 'Бронирование',
bookings: 'Бронирования',
maintenance: 'Обслуживание',
nextService: 'Следующее ТО',
},
// Customers
customers: {
title: 'Клиенты',
new: 'Новый клиент',
customer: 'Клиент',
company: 'Компания',
contact: 'Контактное лицо',
email: 'Эл. почта',
phone: 'Телефон',
address: 'Адрес',
contracts: 'Контракты',
communication: 'Коммуникация',
notes: 'Заметки',
},
// Billing
billing: {
title: 'Выставление счетов',
invoices: 'Счета',
newInvoice: 'Новый счёт',
invoice: 'Счёт',
invoiceNumber: 'Номер счёта',
amount: 'Сумма',
tax: 'НДС',
subtotal: 'Подытог',
total: 'Итого',
dueDate: 'Срок оплаты',
paidDate: 'Дата оплаты',
statuses: {
draft: 'Черновик',
sent: 'Отправлен',
paid: 'Оплачен',
overdue: 'Просрочен',
cancelled: 'Отменён',
},
hourlyRates: 'Почасовые ставки',
rate: 'Ставка',
reminders: 'Напоминания',
},
// Modules
modules: {
title: 'Модули',
enabled: 'Включен',
disabled: 'Отключен',
enable: 'Включить',
disable: 'Отключить',
configure: 'Настроить',
},
// Settings
settings: {
title: 'Настройки',
profile: 'Профиль',
account: 'Аккаунт',
notifications: 'Уведомления',
security: 'Безопасность',
language: 'Язык',
theme: 'Тема',
darkMode: 'Тёмный режим',
lightMode: 'Светлый режим',
changePassword: 'Изменить пароль',
twoFactor: 'Двухфакторная аутентификация',
lockScreen: 'Экран блокировки',
lockMethod: 'Способ блокировки',
pin: 'PIN-код',
pattern: 'Графический ключ',
},
// Help
help: {
title: 'Помощь и поддержка',
faq: 'Частые вопросы',
contact: 'Контакты',
documentation: 'Документация',
tutorials: 'Обучение',
feedback: 'Обратная связь',
},
// Messages
messages: {
success: 'Успешно',
error: 'Ошибка',
warning: 'Предупреждение',
info: 'Информация',
saved: 'Сохранено',
deleted: 'Удалено',
updated: 'Обновлено',
created: 'Создано',
confirmDelete: 'Вы уверены, что хотите удалить это?',
noData: 'Нет данных',
loading: 'Загрузка...',
required: 'Обязательное поле',
invalid: 'Неверный ввод',
},
// Time
time: {
today: 'Сегодня',
yesterday: 'Вчера',
tomorrow: 'Завтра',
thisWeek: 'На этой неделе',
lastWeek: 'На прошлой неделе',
thisMonth: 'В этом месяце',
lastMonth: 'В прошлом месяце',
days: 'дней',
hours: 'часов',
minutes: 'минут',
},
}

View File

@@ -2,11 +2,13 @@ import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
import i18n from './i18n'
import './assets/main.css'
const app = createApp(App)
app.use(createPinia())
app.use(router)
app.use(i18n)
app.mount('#app')