/**
 * Meeting Attendance translations - English
 */
import { MeetingAttendanceTranslations } from './zh';

export const meetingAttendanceEn: MeetingAttendanceTranslations = {
  nav: {
    dashboard: 'Dashboard',
    meetings: 'Meetings',
    series: 'Series',
    templates: 'Templates',
    users: 'Users',
    reports: 'Reports',
    auditLogs: 'Audit Logs',
    checkin: 'Check-in',
    guestCheckin: 'Guest Check-in',
    changePassword: 'Change Password',
    passwordShort: 'Password',
    signOut: 'Sign out',
    teamsMeetings: 'Teams Meetings',
    teamsReports: 'Teams Reports',
    teamsConfig: 'Teams Config',
    outlookSync: 'Outlook Sync',
    outlookBindings: 'Bound Meetings',
    help: 'User Guide',
    systemLabel: 'Meeting Attendance System',
    systemAdmin: 'System Administrator',
    systemUser: 'System User',
  },
  allowedMode: {
    onSite: 'On-site',
    online: 'Online',
    notSet: 'Not Set ⚠️',
    sourceCityDerived: 'By work city',
    sourceSeriesPreference: 'Series default',
    sourceMeetingOverride: 'Meeting override',
    overrideTooltip: 'Default: {defaultMode} → set to: {newMode}',
    notSetTooltip: 'User work city not configured; cannot derive check-in mode',
    columnLabel: 'Allowed Check-in Mode',
    filterOnSite: 'On-site only',
    filterOnline: 'Online only',
    filterNotSet: 'Not set',
    filterOverridden: 'Adjusted',
    actionChangeToOnSite: 'Change to On-site',
    actionChangeToOnline: 'Change to Online',
    actionRestoreDefault: 'Restore Default',
    actionUpdateSuccess: 'Updated',
    actionUpdateFailed: 'Update failed',
    adjustmentCountLabel: 'Adjustments',
    adjustmentCountInline: '{count} adjustment(s)',
  },
  enforceCheckinMode: {
    label: 'Check-in Mode Validation',
    on: 'Enabled',
    off: 'Disabled',
    guardTip: 'Set the Meeting City before enabling',
    toggleSuccess: 'Check-in mode validation updated',
    toggleFailed: 'Failed to update check-in mode validation',
  },
  common: {
    moduleName: 'Meeting Attendance',
    moduleDescription: 'Meeting attendance management and analytics',
    loading: 'Loading...',
    empty: 'No data',
    back: 'Back',
    actions: 'Actions',
    create: 'Create',
    viewDetails: 'View Details',
    qrCodes: 'QR Codes',
    creator: 'Creator',
    location: 'Location',
    time: 'Time',
    start: 'Start',
    end: 'End',
    required: 'Required',
    present: 'Present',
    late: 'Late',
    absent: 'Absent',
    pending: 'Page is being migrated',
    notAvailable: 'N/A',
    meetingTimezoneTime: 'Meeting timezone time',
    viewerTimezoneTime: 'Current timezone time',
  },
  permissions: {
    noAccessTitle: 'Insufficient Permissions',
    noAccessDescription: 'You do not have permission to perform this action.',
    backToMeetings: 'Back to meetings',
  },
  meetingForm: {
    createTitle: 'Create Meeting',
    createSubtitle: 'Fill in the meeting information to create a new meeting.',
    infoTitle: 'Meeting Information',
    infoDescription: 'Please complete all required meeting information.',
    titleLabel: 'Title',
    titlePlaceholder: 'Enter meeting title',
    descriptionLabel: 'Description',
    descriptionPlaceholder: 'Enter meeting description (optional)',
    timezoneLabel: 'Timezone',
    startTimeLabel: 'Start Time',
    endTimeLabel: 'End Time',
    locationLabel: 'Location',
    locationPlaceholder: 'Enter meeting location (optional)',
    typeLabel: 'Meeting Type',
    typeOffline: 'Offline Meeting',
    typeOnline: 'Online Meeting',
    typeHybrid: 'Hybrid Meeting',
    cancel: 'Cancel',
    saving: 'Saving...',
    createAction: 'Create Meeting',
    editTitle: 'Edit Meeting',
    editAction: 'Save',
    cityLabel: 'Meeting City',
    cityPlaceholder: 'Enter or pick a city, e.g. Beijing / Los Angeles',
    cityHint: 'Compared with user work city to derive on-site/online check-in',
    enforceCheckinModeHint: 'Set the Meeting City before enabling; when bound to a series, this follows the series',
    inheritedFromSeries: 'Follows series',
  },
  meetings: {
    title: 'Meeting Management',
    subtitle: 'Manage and view all meetings',
    create: 'Create Meeting',
    filterAll: 'All',
    filterScheduled: 'Scheduled',
    filterInProgress: 'In Progress',
    filterCompleted: 'Completed',
    emptyTitle: 'No Meetings',
    emptyDescription: 'No meetings have been created yet. Please create one first.',
    pageLabel: 'Page {page} / {totalPages} ({total} total)',
    prevPage: 'Previous',
    nextPage: 'Next',
  },
  series: {
    title: 'Meeting Series',
    subtitle: 'Create and manage recurring meetings',
    createAction: 'Create Meeting Series',
    createFormTitle: 'Create Meeting Series',
    createFormDescription: 'Create a recurring meeting series',
    formTitleLabel: 'Series Title *',
    formTitlePlaceholder: 'e.g. Tech Department Weekly Meeting',
    formLocationLabel: 'Location',
    formLocationPlaceholder: 'Meeting room or link',
    formDescriptionLabel: 'Description',
    formDescriptionPlaceholder: 'Describe the meeting series',
    formPatternLabel: 'Recurrence Pattern *',
    patternDailyOption: 'Daily',
    patternWeeklyOption: 'Weekly',
    patternMonthlyOption: 'Monthly',
    patternYearlyOption: 'Yearly',
    formFrequencyLabel: 'Frequency',
    formDurationLabel: 'Duration (minutes) *',
    formMaxOccurrencesLabel: 'Max Occurrences',
    formTimezoneLabel: 'Timezone *',
    formStartDateTimeLabel: 'Start Date & Time *',
    formEndDateLabel: 'End Date',
    formTypeLabel: 'Meeting Type',
    formAttendeesLabel: 'Default Attendees',
    formAddAttendeesAction: 'Add Attendees',
    formCancelAction: 'Cancel',
    formSubmitAction: 'Create Meeting Series',
    loadFailed: 'Failed to load meeting series',
    createSuccess: 'Meeting series created',
    createFailed: 'Failed to create meeting series. Please try again later.',
    toggleFailed: 'Operation failed. Please try again later.',
    deleteConfirm: 'Are you sure you want to delete this meeting series? This action cannot be undone.',
    deleteSuccess: 'Meeting series deleted',
    deleteFailed: 'Failed to delete meeting series. Please try again later.',
    updateSuccess: 'Meeting series updated',
    updateFailed: 'Failed to update meeting series. Please try again later.',
    historyLoadFailed: 'Failed to load history data',
    scheduleMissingFields: 'Please fill in all required fields',
    scheduleUpdating: 'Updating meeting schedules...',
    scheduleUpdateSuccess: 'Updated {count} meeting(s)',
    scheduleUpdateFailed: 'Failed to update schedules. Please try again later.',
    attendeesLoadFailed: 'Failed to load attendees',
    attendeesAdded: 'Attendees added',
    attendeesAddFailed: 'Failed to add attendees. Please try again later.',
    attendeeRemoved: 'Attendee removed. Deleted {deletedCount} record(s) from {affectedMeetings} meeting(s)',
    attendeeRemoveFailed: 'Failed to remove attendee. Please try again later.',
    attendeeRoleMissing: 'Missing required information',
    attendeeRoleUpdating: 'Updating attendee role...',
    attendeeRoleUpdated: 'Updated {updatedCount} record(s) in {affectedMeetings} meeting(s)',
    attendeeRoleUpdateFailed: 'Failed to update attendee role. Please try again later.',
    patternDaily: 'Every {frequency} day(s)',
    patternWeekly: 'Every {frequency} week(s)',
    patternMonthly: 'Every {frequency} month(s)',
    patternYearly: 'Every {frequency} year(s)',
    recurrenceMaxOccurrences: 'Max {count} occurrences',
    recurrenceEndDate: 'Ends on {date}',
    recurrenceByEndDate: 'By end date',
    recurrenceUnlimited: 'Unlimited / Not set',
    qrRangeEmpty: 'No meetings found in the selected date range',
    qrTypeAll: 'All',
    qrTypeOnlineOnly: 'Online only',
    qrTypeOnsiteOnly: 'On-site only',
    qrPrepare: 'Preparing {type} QR codes for {count} meetings...',
    qrDownloadSuccess: 'QR codes downloaded',
    qrDownloadFailed: 'Failed to download QR codes',
    wordPreparing: 'Generating Word document for {count} meetings{type}...',
    qrRangeStartFallback: 'Start',
    qrRangeEndFallback: 'End',
    qrRangeTo: 'to',
    wordTitle: 'Series QR Codes - {count} Meetings{range}{type}',
    wordDateLabel: 'Date',
    wordLocationLabel: 'Location',
    qrOnlineLabel: 'Online Check-in QR Code',
    qrOnlineMissing: 'Online QR code not available',
    qrOnsiteLabel: 'On-site Check-in QR Code',
    qrOnsiteMissing: 'On-site QR code not available',
    wordGenerateSuccess: 'Word document generated',
    wordGenerateFailed: 'Failed to generate Word document',
    instancesCount: '{count} meeting instance(s)',
    createdByLabel: 'Created by: {name}',
    instancesTitle: 'Meeting Instances',
    instancesShowLess: 'Show Less',
    instancesShowMore: 'View More ({count})',
    emptyTitle: 'No active meeting series',
    emptyDescription: 'Create your first meeting series',
    editFormTitle: 'Edit Meeting Series',
    editFormDescription: 'Modify the settings of the meeting series',
    editFormSubmitAction: 'Save Changes',
    historyTitle: 'Meeting History',
    historySummary: '{totalMeetings} meetings completed, average attendance rate {averageAttendance}%',
    historyEmpty: 'No completed meetings yet',
    historyAttendanceRate: 'Attendance Rate',
    historyRequired: '{count} required',
    historyAttended: '{count} attended',
    historyAbsent: '{count} absent',
    historyAttendeesLabel: 'Attendees:',
    attendeeManageTitle: 'Manage Default Attendees',
    attendeeManageDescription: 'Manage default attendees for the series (applies to scheduled and in-progress meetings)',
    attendeeManageCurrent: 'Current Default Attendees ({count})',
    attendeeAddAction: 'Add Attendee',
    attendeeCompanyLabel: 'Company: {value}',
    attendeeDepartmentLabel: 'Department: {value}',
    attendeeNoneTitle: 'No default attendees',
    attendeeNoneDescription: 'Click "Add Attendee" to start setting up',
    closeAction: 'Close',
    attendeeAddModalTitle: 'Add Attendee',
    attendeeAddModalDescription: 'Select attendees and assign their roles',
    attendeeRoleModalTitle: 'Edit Attendee Role',
    attendeeRoleModalDescription: 'Update roles for current and future meetings',
    attendeeRoleNoticeTitle: 'Important:',
    attendeeRoleNoticeItemCurrent: 'Only scheduled and in-progress meetings will be updated',
    attendeeRoleNoticeItemPast: 'Completed meetings will not be changed',
    attendeeRoleAttendeeLabel: 'Attendee',
    attendeeRoleCurrent: 'Current role: {role}',
    attendeeRoleNewLabel: 'New Role',
    attendeeRoleNewHint: 'Select the new role for this attendee',
    attendeeRoleUpdateAction: 'Update Role',
    createAttendeeModalTitle: 'Add Attendees',
    createAttendeeModalDescription: 'Select attendees and assign their roles',
    scheduleModalTitle: 'Update Meeting Schedule',
    scheduleModalDescription: 'Modify start time and duration for scheduled meetings',
    scheduleNoticeTitle: 'Important Notes:',
    scheduleNoticeItemCurrent: 'Only scheduled and in-progress meetings will be updated',
    scheduleNoticeItemPast: 'Completed and cancelled meetings will not be affected',
    scheduleStartTimeLabel: 'Start Time',
    scheduleStartTimeHint: 'Meeting start time (e.g. 09:00)',
    scheduleDurationLabel: 'Duration (minutes)',
    scheduleDurationHint: 'How long each meeting should last',
    scheduleTimezoneLabel: 'Timezone',
    scheduleTimezoneHint: 'Timezone for the meeting schedule',
    scheduleUpdateAction: 'Update Schedule',
    scheduleUpdateHint: 'Update start time and duration',
    qrDownloadZipHint: 'Download QR codes as ZIP (with date range)',
    qrDownloadWordHint: 'Download QR codes as Word document (with date range)',
    rangeTitle: 'Select Date Range',
    rangeDescription: 'Choose the time period for meetings to include',
    rangeStartLabel: 'Start Date',
    rangeEndLabel: 'End Date',
    qrTypeLabel: 'QR Code Type',
    qrTypeBothOption: 'Both',
    qrTypeOnlineOption: 'Online',
    qrTypeOnsiteOption: 'On-site',
    rangeCountIncluded: '{count} meeting(s) will be included',
    rangeCountEmpty: 'No meetings found in this date range',
    rangeTotalLabel: 'Total meetings in series: {count}',
    rangeDownloadZip: 'Download ZIP',
    rangeDownloadWord: 'Download Word',
    formCityLabel: 'Series City',
    formCityPlaceholder: 'Enter or pick a city, e.g. Beijing',
    formCityHint: 'Used for child meeting check-in mode derivation; saving cascades to all child meetings',
    enforceCheckinModeHint: 'Series City must be set before enabling; saving cascades to all child meetings',
    attendeeSearchPlaceholder: 'Search name or email...',
    attendeeBulkSelectedCount: '{count} selected',
    attendeeBulkSetOnSite: 'Bulk: On-site',
    attendeeBulkSetOnline: 'Bulk: Online',
    attendeeBulkSetFollowWorkCity: 'Bulk: Follow work city',
    attendeeBulkUpdateSuccess: '{count} attendees updated',
    attendeePrefLabel: 'Check-in mode',
    attendeePrefFollow: 'Follow work city',
    attendeePrefOnSite: 'On-site',
    attendeePrefOnline: 'Online',
    attendeePrefUpdateSuccess: 'Preference updated',
    attendeePrefUpdateFailed: 'Failed to update preference',
  },
  meetingDetail: {
    title: 'Meeting Details',
    subtitle: 'Meeting details and attendance stats',
    notFoundTitle: 'Meeting not found',
    notFoundDescription: 'The specified meeting was not found.',
    infoTitle: 'Meeting Information',
    scheduleLabel: 'Schedule',
    descriptionEmpty: 'No description',
    locationEmpty: 'No location specified',
    attendanceRate: 'Attendance Rate',
    optionalLabel: 'Optional',
    attendanceStats: 'Attendance Statistics',
    attendanceStatsHint: 'Click to filter',
    clearFilter: 'Clear filter',
    attendeeTitle: 'Attendees',
    attendeeTitleWithCount: 'Attendees ({current} of {total})',
    attendeeSubtitle: 'Manage attendees and view attendance status',
    addAttendees: 'Add Attendees',
    refresh: 'Refresh attendance status',
    searchPlaceholder: 'Search...',
    filterAll: 'All Statuses',
    filterTitle: 'Filter by status',
    selectAttendanceStatus: 'Select attendance status',
    noAttendees: 'No attendees yet',
    noAttendeesWithStatus: 'No attendees in this filter',
    checkinTime: 'Check-in',
    checkinMethod: 'Method',
    checkinMethodQr: 'QR Code',
    checkinMethodManual: 'Manual',
    checkinMethodOther: 'Other',
    notes: 'Notes',
    deleteMeeting: 'Delete Meeting',
    editMeeting: 'Edit',
    viewAgenda: 'Meeting Agenda',
    viewReports: 'View Reports',
    externalAttendeesTitle: 'Outlook External Attendees',
    externalAttendeesSubtitle: '{count} synced entries (organizer + external attendees)',
    externalAttendeesEmpty: 'No external attendee snapshots',
    externalName: 'Name',
    externalEmail: 'Email',
    externalRole: 'Source Role',
    externalType: 'Attendee Type',
    externalResponse: 'Invitation Response',
    externalOrganizer: 'Organizer',
    externalAttendee: 'Attendee',
    externalAttendeeTypeRequired: 'Required',
    externalAttendeeTypeOptional: 'Optional',
    externalAttendeeTypeResource: 'Resource',
    externalResponseAccepted: 'Accepted',
    externalResponseDeclined: 'Declined',
    externalResponseTentative: 'Tentatively Accepted',
    externalResponseNotResponded: 'Not Responded',
    externalResponseNone: 'No Response',
    syncLockedTitle: 'This meeting is now locally managed',
    syncLockedDescription: 'This meeting has local changes and no longer accepts automatic updates from Outlook.',
    syncLockedMeta: 'Locked at {time}; by {user}; reason: {reason}',
    syncResumeAction: 'Resume Outlook Sync',
    syncResumeLoading: 'Resuming...',
    syncResumeConfirm: 'Resume automatic sync from Outlook? Any local changes will be overwritten by the original Outlook values on the next sync.',
    syncResumeSuccess: 'Outlook sync resumed',
    syncResumeFailed: 'Failed to resume Outlook sync',
    cityLabel: 'Meeting City',
    cityEmpty: 'Not set',
  },
  qrPage: {
    title: 'Meeting Check-in QR Codes',
    subtitle: 'Online/Offline QR codes',
    backToMeeting: 'Back to Meeting Details',
    refresh: 'Refresh QR Codes | 刷新二维码',
    onlineTitle: 'Online Attendance Check QR Code | 线上签到二维码',
    onlineSubtitle: 'For remote participants | 适用于远程参会人员',
    onlineUnavailable: 'Online QR code not available',
    offlineTitle: 'On-site Attendance Check QR Code | 现场签到二维码',
    offlineSubtitle: 'For in-person participants | 适用于现场参会人员',
    offlineUnavailable: 'On-site QR code not available',
    downloadImage: 'Download Image | 下载图片',
    instructionsTitle: 'Instructions | 使用说明',
    onlineInstructionsSubtitle: 'How to use online check-in QR code | 如何使用线上签到二维码',
    offlineInstructionsSubtitle: 'How to use on-site check-in QR code | 如何使用现场签到二维码',
    step1Title: 'Scan with Phone | 打开手机扫描二维码',
    step1DescEn: 'Scan QR code, enter your name, and check in.',
    step1DescZh: '使用手机扫描二维码，输入姓名，完成签到。',
    step2Title: 'Opens 15 Mins Before | 开会前 15 分钟可签到',
    step2DescEn: 'QR code available 15 minutes before meeting starts.',
    step2DescZh: '二维码会在开始前 15 分钟开放签到。',
    step3Title: 'Will be counted as LATE after 8 mins | 开会后 8 分钟记录迟到',
    step3DescEn: 'Check-in after 8 minutes from start will be counted as LATE.',
    step3DescZh: '会议开始 8 分钟后签到将被标记为迟到。',
    tipsTitle: 'Tips | 提示',
    tipsOnline1: 'For remote online attendees | 适用于远程线上参会者',
    tipsOffline1: 'For in-person attendees | 适用于现场参会者',
    tips2: 'One check-in per person | 每人仅可签到一次',
    tips3: 'Please check in on time to avoid being late | 请按时签到避免迟到',
    tips4: 'If you have any questions, please contact the operation team | 如有任何问题，请联系运营团队',
    meetingInfoTitle: 'Meeting Information',
    meetingInfoTitleLabel: 'Title: ',
    meetingInfoDescriptionLabel: 'Description: ',
    meetingInfoStartLabel: 'Start Time: ',
    meetingInfoEndLabel: 'End Time: ',
    meetingInfoLocationLabel: 'Location: ',
    meetingInfoStatusLabel: 'Status: ',
    meetingInfoDescriptionEmpty: 'No description',
    toastGenerating: 'Generating image... | 正在生成图片...',
    toastCanvasFailed: 'Failed to create canvas | 创建画布失败',
    toastGenerateFailed: 'Failed to generate image | 生成图片失败',
    toastTemplateFailed: 'Failed to load template | 模板加载失败',
    toastQrFailed: 'Failed to load QR code | 二维码加载失败',
  },
  checkin: {
    title: 'Meeting Check-in',
    subtitle: 'Please scan the meeting QR code or check in manually',
    loading: 'Checking in...',
    selectType: 'Select attendance type',
    onSiteTitle: 'On Site',
    onSiteDesc: 'Attending in person',
    onlineTitle: 'Online',
    onlineDesc: 'Attending remotely',
    action: 'Check In',
    successTitle: 'Check-in Successful',
    successMessage: 'Check-in completed. Your record has been submitted.',
    failureTitle: 'Check-in Failed',
    lateSuccessMessage: 'Check-in successful, but marked as late.',
    meetingInfoTitle: 'Meeting Information',
    meetingTimeLabel: 'Meeting Time',
    localTimeLabel: 'Local Time',
    availableFrom: 'Check-in available from: {time}',
    notAvailableTitle: 'Check-in not yet available',
    notAvailableDesc: 'You can check in 15 minutes before the meeting starts',
    backHome: 'Back to Home',
    viewMeeting: 'View Meeting',
    backToMeetings: 'View My Meetings',
    scanHint: 'Scan the meeting room QR code to check in',
    contactHint: 'Or contact the meeting manager for a check-in link',
    lateHint: 'You are late, please mind the time',
    recordedHint: 'Your attendance has been recorded. The organizer can see your status.',
    attendeeLabel: 'Attendee',
    meetingLabel: 'Meeting',
    checkinMeetingTz: 'Check-in (Meeting TZ)',
    checkinLocalTz: 'Check-in (Local TZ)',
    invalidInfo: 'Invalid check-in information',
    failed: 'Check-in failed, please try again later',
  },
  guestCheckin: {
    title: 'Guest Check-in',
    subtitle: 'Fill in details to check in',
    invalidLinkTitle: 'Invalid check-in link',
    invalidLinkDesc: 'Please verify the QR code.',
    loadingMeeting: 'Loading meeting information...',
    meetingNotFoundTitle: 'Meeting not found',
    nameLabel: 'Name',
    namePlaceholder: 'Enter your name',
    emailLabel: 'Email',
    emailPlaceholder: 'Enter your email (optional)',
    searchPlaceholder: 'Search attendee',
    scanBadge: 'Scan to check in',
    onlineTitle: 'Online Meeting Check-in',
    offlineTitle: 'Offline Meeting Check-in',
    personalInfoTitle: 'Personal Information',
    checkinAction: 'Submit Check-in',
    checkingIn: 'Checking in...',
    successTitle: 'Check-in Successful',
    successMessage: 'Check-in completed. Your record has been submitted.',
    failureTitle: 'Check-in Failed',
    failureMessage: 'Check-in failed, please try again later.',
    meetingNotFound: 'Meeting not found or unavailable',
    checkinNotAvailable: 'Check-in not yet available',
    notInList: 'Not in attendee list',
    meetingInfoTitle: 'Meeting Information',
    meetingTimeLabel: 'Meeting Time',
    localTimeLabel: 'Local Time',
    availableFrom: 'Check-in available from: {time}',
    lateHint: 'You are late',
    lateSuccessMessage: 'Check-in successful, but marked as late.',
    recordedHint: 'Your check-in has been recorded.',
    meetingCompletedTitle: 'Meeting completed',
    meetingCompletedDesc: 'The meeting has ended; check-in is unavailable.',
    meetingCancelledTitle: 'Meeting cancelled',
    meetingCancelledDesc: 'This meeting has been cancelled.',
    alreadyCheckedIn: 'You have already checked in. Please do not submit again.',
    deviceUsed: 'This device has already checked in for this meeting.',
    wrongCheckinQrCode: 'Please use the designated on-site or online QR code',
    wrongCheckinUseOnSite: 'Please use the "On-site" QR code to check in',
    wrongCheckinUseOnline: 'Please use the "Online" QR code to check in',
    workCityNotConfigured: 'Your work city is not configured. Please contact the administrator.',
    meetingCityNotConfigured: 'Meeting city is not configured',
    footerScanHint: 'Scan to check in',
    footerContactHint: 'If you have questions, contact the meeting operations team',
  },
  attendance: {
    onSite: 'On Site',
    online: 'Online',
    absent: 'Absent',
    pto: 'PTO',
    businessConflict: 'Business Conflict',
    late: 'Late',
    notCheckedIn: 'Not Checked In',
  },
  attendees: {
    roleLabel: 'Attendee Role',
    roleCsuite: 'C-suite attendee',
    roleLevel1: 'Level-1 report attendee',
    roleLevel2: 'Level-2 report attendee',
    roleOperations: 'Meeting operations',
    roleRegular: 'Regular attendee',
    roleOptional: 'Optional attendee',
    searchPlaceholder: 'Search by name or email',
    selected: 'Selected',
    add: 'Add',
    addConfirm: 'Confirm',
    cancel: 'Cancel',
  },
  messages: {
    createFailed: 'Failed to create meeting. Please try again later.',
    updateFailed: 'Failed to update. Please try again later.',
    deleteConfirm: 'Are you sure you want to delete this meeting? This action cannot be undone.',
    removeAttendeeConfirm: 'Are you sure you want to remove this attendee?',
    deleteFailed: 'Failed to delete. Please try again later.',
    updateSuccess: 'Meeting updated successfully',
    attendeesAdded: 'Attendees added successfully',
    attendeeRemoved: 'Attendee removed successfully',
  },
  status: {
    scheduled: 'Scheduled',
    inProgress: 'In Progress',
    completed: 'Completed',
    cancelled: 'Cancelled',
  },
  type: {
    offline: 'Offline',
    online: 'Online',
    hybrid: 'Hybrid',
  },
  dashboard: {
    title: 'Dashboard',
    subtitle: 'Meeting attendance entry',
    welcome: 'Welcome back, {name}',
    defaultUser: 'User',
    todayLabel: '{date}',
    todayMeetings: "Today's Meetings",
    activeMeetings: 'Active Meetings',
    totalUsers: 'Total Users',
    todayAttendance: "Today's Attendance",
    todayMeetingsDesc: 'Number of meetings scheduled today',
    activeMeetingsDesc: 'Scheduled and ongoing meetings',
    totalUsersDesc: 'Total registered users',
    todayAttendanceDesc: 'Number of people checked in today',
    systemStatusTitle: 'System Status',
    systemStatusSubtitle: 'System health overview',
    systemStatusNormal: 'Normal',
    systemStatusOk: 'OK',
    systemStatusMeeting: 'Meeting Service',
    systemStatusCheckin: 'Check-in Service',
    systemStatusReports: 'Reports Service',
    systemStatusDatabase: 'Database Connection',
    systemStatusAuth: 'Authentication Service',
    systemStatusQr: 'QR Code Service',
    quickActions: 'Quick Actions',
    quickActionsHint: 'Shortcuts to common features',
    meetingList: 'Meeting List',
    checkin: 'Check-in',
    reports: 'Reports',
    createMeeting: 'Create Meeting',
  },
  templates: {
    title: 'Meeting Templates',
    subtitle: 'Create and manage meeting templates for quickly creating similar meetings',
    createAction: 'Create Template',
    updateAction: 'Save Changes',
    editAction: 'Edit',
    deleteAction: 'Delete',
    createTitle: 'Create Meeting Template',
    createDescription: 'Configure a template to quickly create similar meetings',
    editTitle: 'Edit Meeting Template',
    editDescription: 'Update template details and default attendees',
    nameLabel: 'Template Name',
    namePlaceholder: 'e.g. Weekly Meeting Template',
    meetingTitleLabel: 'Meeting Title',
    meetingTitlePlaceholder: 'e.g. Engineering Weekly Meeting',
    descriptionLabel: 'Meeting Description',
    descriptionPlaceholder: 'Enter meeting description (optional)',
    durationLabel: 'Duration (minutes)',
    typeLabel: 'Meeting Type',
    locationLabel: 'Location',
    locationPlaceholder: 'Meeting room or link',
    publicLabel: 'Public template (available to others)',
    attendeesLabel: 'Default Attendees',
    loadFailed: 'Failed to load templates',
    createSuccess: 'Template created successfully',
    createFailed: 'Failed to create template, please try again later',
    updateSuccess: 'Template updated successfully',
    updateFailed: 'Failed to update template, please try again later',
    deleteConfirm: 'Delete template \"{name}\"? This action cannot be undone.',
    deleteSuccess: 'Template deleted',
    deleteFailed: 'Failed to delete template, please try again later',
    startTimePrompt: 'Enter meeting start time (YYYY-MM-DD HH:MM)',
    endTimePrompt: 'Enter meeting end time (YYYY-MM-DD HH:MM)',
    createMeetingSuccess: 'Meeting created successfully',
    createMeetingFailed: 'Failed to create meeting, please try again later',
    publicTag: 'Public',
    durationValue: '{minutes} min',
    attendeeCount: '{count} default attendees',
    creatorLabel: 'Creator: {name}',
    createMeetingAction: 'Create Meeting',
    emptyTitle: 'No templates yet',
    emptyDescription: 'Create your first meeting template',
  },
  changePassword: {
    title: 'Change Password',
    subtitle: 'Update your password to keep your account secure.',
    formTitle: 'Change Your Password',
    formDescription: 'Enter your current password and choose a new one.',
    currentPassword: 'Current Password',
    currentPasswordPlaceholder: 'Enter your current password',
    newPassword: 'New Password',
    newPasswordPlaceholder: 'Enter new password (min 6 characters)',
    confirmPassword: 'Confirm New Password',
    confirmPasswordPlaceholder: 'Confirm your new password',
    updateAction: 'Change Password',
    cancelAction: 'Cancel',
    updating: 'Changing...',
    passwordHint: 'Password must be at least 6 characters long',
    passwordTooShort: 'Password must be at least 6 characters long',
    passwordMismatch: 'Passwords do not match',
    userNotFound: 'User not found',
    updateSuccess: 'Password updated successfully!',
    updateSuccessDesc: 'Your password has been changed. You can now use your new password to log in.',
    updateFailed: 'Failed to change password',
    updateFailedDesc: 'Please check your current password and try again.',
  },
  users: {
    title: 'User Management',
    subtitle: 'Manage system users and permissions',
    openOrgMembers: 'Go to Organization Members',
    loadFailed: 'Failed to load users',
    createAction: 'Create User',
    updateAction: 'Save Changes',
    createTitle: 'Create User',
    editTitle: 'Edit User',
    createSuccess: 'User created successfully',
    createSuccessWithPassword: 'User created successfully. Default password: {password}',
    updateSuccess: 'User updated successfully',
    saveFailed: 'Failed to save user',
    nameLabel: 'Name',
    emailLabel: 'Email',
    roleLabel: 'Role',
    departmentLabel: 'Department',
    companyLabel: 'Company',
    positionLabel: 'Position',
    statusLabel: 'Status',
    createdMeetingsLabel: 'Created Meetings',
    attendanceRecordsLabel: 'Attended Meetings',
    registrationDateLabel: 'Registration Date',
    active: 'Active',
    inactive: 'Inactive',
    activeLabel: 'Active account',
    searchLabel: 'Search Users',
    searchPlaceholder: 'Name, email, department...',
    roleFilterLabel: 'Role Filter',
    allRoles: 'All Roles',
    departmentFilterLabel: 'Department Filter',
    allDepartments: 'All Departments',
    applyFilters: 'Filter',
    listTitle: 'User List',
    pageLabel: 'Showing {start} - {end} of {total} entries',
    prevPage: 'Previous',
    nextPage: 'Next',
    importAction: 'Batch Import',
    importTitle: 'Import Users',
    importHint: 'Upload a CSV or Excel file with email and name columns.',
    importFileRequired: 'Please select a file to import',
    importSuccess: 'Import completed',
    importFailed: 'Import failed, please try again later',
    importing: 'Importing...',
    downloadTemplate: 'Download Template',
    downloadTemplateFailed: 'Failed to download template',
    disableConfirm: 'Disable {name}?',
    disableSuccess: 'User disabled',
    disableFailed: 'Failed to disable user',
    deleteSuccess: 'User permanently deleted',
    deleteFailed: 'Failed to delete user',
    forceDeleteConfirm: 'Force delete this user and related data?',
    resetTitle: 'Reset password for {name}',
    resetAction: 'Reset Password',
    resetting: 'Resetting...',
    resetSuccess: 'Password reset successfully',
    resetFailed: 'Failed to reset password',
    newPasswordLabel: 'New Password',
    confirmPasswordLabel: 'Confirm New Password',
    requirePasswordChangeLabel: 'Require password change on first login',
    roles: {
      admin: 'Admin',
      manager: 'Meeting Attendance Admin',
      leader: 'Leader',
      employee: 'Employee',
    },
    roleDisplay: {
      admin: 'System Administrator',
      manager: 'Meeting Attendance Admin',
      leader: 'Team Leader',
      employee: 'General User',
    },
  },
  auditLogs: {
    title: 'Audit Logs',
    subtitle: 'Monitor administrator and system operations',
    refresh: 'Refresh',
    loadFailed: 'Failed to load audit logs',
    statsFailed: 'Failed to load audit stats',
    filtersTitle: 'Filter Options',
    filtersDescription: 'Filter audit logs by criteria',
    filtersToggle: 'Filters',
    userEmailLabel: 'User Email',
    userEmailPlaceholder: 'Filter by email',
    actionLabel: 'Action Type',
    actionPlaceholder: 'e.g., USER_CREATE',
    resourceLabel: 'Resource Type',
    resourcePlaceholder: 'e.g., USER',
    startDateLabel: 'Start Date',
    endDateLabel: 'End Date',
    clearFilters: 'Clear Filters',
    totalLogsCard: 'Total Logs',
    topActionCard: 'Top Action',
    topResourceCard: 'Top Resource',
    mostActiveUserCard: 'Most Active User',
    topActionCount: '{count} times',
    topResourceCount: '{count} operations',
    mostActiveUserCount: '{count} operations',
    noDataLabel: 'No Data',
    listTitle: 'Audit Log Entries ({total})',
    listDescription: 'Detailed record of all administrative operations',
    emptyTitle: 'No audit logs found',
    emptyDescription: 'Logs will appear here when administrators perform operations',
    timeLabel: 'Time',
    userLabel: 'User',
    statusLabel: 'Status Code',
    methodLabel: 'Method',
    endpointLabel: 'Endpoint',
    ipLabel: 'IP',
    errorLabel: 'Error',
    pageLabel: 'Page {page} of {totalPages}',
    prevPage: 'Previous',
    nextPage: 'Next',
    accessDeniedTitle: 'Access Denied',
    accessDeniedDescription: 'Only meeting attendance administrators can view audit logs.',
    changeDetailsTitle: '📝 Change Details',
    subjectLabel: 'Subject:',
    meetingLabel: 'Meeting:',
    attendanceLabel: 'Attendance:',
    notRecorded: 'Not Recorded',
    checkinTimeLabel: 'Check-in Time:',
    lateLabel: 'Late:',
    yes: 'Yes',
    no: 'No',
    nameLabel: 'Name',
    emailLabel: 'Email',
    roleLabel: 'Role',
    departmentLabel: 'Department',
    positionLabel: 'Position',
    statusLabelText: 'Status:',
    statusActive: 'Active',
    statusDisabled: 'Disabled',
    userLabelText: 'User:',
    titleLabel: 'Title',
    locationLabel: 'Location',
    startTimeLabel: 'Start Time',
    reasonLabel: 'Reason:',
    newContentTitle: '✨ New Content',
    seriesTitleLabel: 'Series Title:',
    patternLabel: 'Pattern:',
    meetingCountLabel: 'Meeting Count:',
    meetingCountValue: '{count} sessions',
    firstMeetingLabel: 'First Meeting:',
    lastMeetingLabel: 'Last Meeting:',
    meetingTitleLabel: 'Meeting Title:',
    moreFields: '... {count} more fields',
    emptyValue: '(empty)',
    methodLabelText: 'Method:',
    endpointLabelText: 'API Endpoint:',
    resourceIdLabel: 'Resource ID:',
    ipLabelText: 'IP Address:',
    rawChangesLabel: 'Raw Changes:',
    errorMessageLabel: 'Error Message:',
    actionLabels: {
      LOGIN: 'User Login',
      LOGIN_FAILED: 'Login Failed',
      LOGOUT: 'User Logout',
      USER_CREATE: 'Create User',
      USER_UPDATE: 'Update User',
      USER_DELETE: 'Delete User',
      USER_DISABLE: 'Disable User',
      USER_ENABLE: 'Enable User',
      USER_IMPORT: 'Batch Import Users',
      MEETING_CREATE: 'Create Meeting',
      MEETING_UPDATE: 'Update Meeting',
      MEETING_DELETE: 'Delete Meeting',
      MEETING_CANCEL: 'Cancel Meeting',
      SERIES_CREATE: 'Create Meeting Series',
      SERIES_UPDATE: 'Update Meeting Series',
      SERIES_DELETE: 'Delete Meeting Series',
      TEMPLATE_CREATE: 'Create Meeting Template',
      TEMPLATE_UPDATE: 'Update Meeting Template',
      TEMPLATE_DELETE: 'Delete Meeting Template',
      ATTENDANCE_UPDATE: 'Update Attendance',
      ATTENDANCE_MANUAL: 'Manual Check-in',
      ATTENDANCE_IMPORT: 'Batch Import Attendees',
      REPORT_GENERATE: 'Generate Report',
      SYSTEM_SETTING_UPDATE: 'Update System Settings',
    },
    roleLabels: {
      ADMIN: 'System Administrator',
      MeetingManager: 'Meeting Attendance Admin',
      MANAGER: 'Meeting Attendance Admin',
      LEADER: 'Team Leader',
      EMPLOYEE: 'Employee',
      GUEST: 'Guest',
    },
    attendanceStatusLabels: {
      ON_SITE: 'On-site',
      ONLINE: 'Online',
      ABSENT: 'Absent',
      LATE: 'Late',
      PTO: 'PTO',
      BUSINESS_CONFLICT: 'Business Conflict',
      MEETING: 'Meeting Conflict',
      NOT_CHECKED_IN: 'Not Checked In',
    },
    patternLabels: {
      DAILY: 'Daily',
      WEEKLY: 'Weekly',
      BIWEEKLY: 'Biweekly',
      MONTHLY: 'Monthly',
    },
  },
  teamsMeetings: {
    title: 'My Meetings',
    subtitle: 'Manage your meeting attendance in Teams',
    loading: 'Loading meeting information...',
    emptyTitle: 'No meetings',
    emptyDescription: 'There are currently no scheduled meetings',
    viewQr: 'QR Codes',
    checkinAction: 'Online Check-in',
    checkinSuccess: 'Check-in successful!',
    checkinFailed: 'Check-in failed, please try again later',
    qrTabName: 'Check-in QR Code',
    attendanceCount: '{count} participants',
    currentTeam: 'Current team: {team}',
    personalTeam: 'Personal',
    statusLabel: 'Status: {status}',
    statusCheckedIn: 'Checked in',
    statusNotCheckedIn: 'Not checked in',
  },
  teamsReports: {
    title: 'Attendance Report',
    subtitle: 'Data statistics and analysis in Teams',
    loading: 'Loading report data...',
    noAccessTitle: 'Insufficient Permissions',
    noAccessDesc: 'You do not have permission to view report data.',
    noDataTitle: 'No Data',
    noDataDesc: 'No report data available at the moment.',
    seriesSelectTitle: 'Select Meeting Series',
    totalAttendanceRecords: 'Total Attendance Records',
    checkedIn: 'Checked In',
    late: 'Late',
    absent: 'Absent',
    totalRequired: 'Total Required',
    totalAttended: 'Total Attended',
    attendanceRate: 'Attendance Rate',
    departmentCount: 'Departments',
    departmentStatsTitle: 'Department Attendance Statistics',
    departmentStatsDesc: 'Comparison of attendance across departments',
    statusDistributionTitle: 'Attendance Status Distribution',
    statusDistributionDesc: 'Distribution of overall attendance status',
    departmentDetailsTitle: 'Department Attendance Details',
    departmentDetailsDesc: 'Detailed attendance data for each department',
    departmentCheckinCount: '{attended}/{total} checked in',
  },
  teamsConfig: {
    title: 'Configure Meeting Attendance App',
    subtitle: 'Configure meeting attendance management for your Teams team.',
    appName: 'Meeting Attendance',
    saveSuccess: 'Configuration saved successfully',
    featuresTitle: 'App Features',
    featuresMeetings: '• View and manage meetings',
    featuresCheckin: '• QR code check-in',
    featuresStats: '• Real-time attendance statistics',
    featuresReports: '• Data report analysis',
    permissionTitle: 'Permission Information',
    permissionDesc: 'This app requires access to your identity information to provide a personalized meeting management experience.',
    saveAction: 'Save Configuration',
  },
  outlookSync: {
    title: 'Outlook Sync',
    subtitle: 'Auto-detect current admin mailbox and manually manage meeting sync to attendance',
    candidates: 'Candidate Meetings',
    managedMeetings: 'Managed Meetings',
    settings: 'Sync Settings',
    mailboxEmail: 'Mailbox',
    displayTimezone: 'Display Timezone',
    actions: 'Actions',
    shared: 'Shared',
    personal: 'Personal',
    manage: 'Manage',
    manageSuccess: 'Managed successfully',
    managed: 'Managed',
    managedByOther: 'Bound by another admin',
    managedBySeries: 'Series managed',
    takeover: 'Take over',
    unmanage: 'Unmanage',
    unmanageSuccess: 'Unmanaged (future sync stopped, history retained)',
    takeoverSuccess: 'Take over succeeded',
    ownerNotInParticipants: 'Owner is not in participants; take over is recommended',
    excludeOccurrence: 'Exclude occurrence',
    excludedOccurrence: 'Occurrence excluded',
    refresh: 'Refresh',
    triggerReconcile: 'Trigger Sync',
    reconcileTriggered: 'Sync triggered and data refreshed',
    snapshotInitializing: 'Outlook data is initializing. This page will refresh automatically...',
    save: 'Save',
    cancel: 'Cancel',
    loading: 'Loading...',
    noData: 'No data',
    statusActive: 'Active',
    statusExpired: 'Expired',
    statusError: 'Error',
    statusDisabled: 'Disabled',
    columnTitle: 'Title',
    columnSelect: 'Select',
    columnStart: 'Start',
    columnType: 'Type',
    columnOwner: 'Owner',
    columnBindingNotice: 'Binding Notice',
    columnStatus: 'Status',
    columnSyncMode: 'Sync Mode',
    columnSubscription: 'Subscription',
    columnHealth: 'Sync Health',
    columnLastSyncedAt: 'Last Sync',
    columnLastReconciledAt: 'Last Sync',
    columnLastError: 'Last Error',
    candidateKeywordPlaceholder: 'Search title/type/event id',
    allCandidateTypes: 'All candidate types',
    candidateTypeSingle: 'Single',
    candidateTypeSeriesMaster: 'Series Master',
    candidateTypeOccurrence: 'Occurrence',
    candidateTypeException: 'Exception',
    managedKeywordPlaceholder: 'Search title/event id/iCalUId',
    managedTypeAll: 'All types',
    managedStatusAll: 'All statuses',
    includeCancelled: 'Include cancelled',
    includePast: 'Include past meetings',
    onlyUnmanaged: 'Only unmanaged',
    cancelledTag: 'Cancelled',
    batchManage: 'Batch Manage',
    batchManaging: 'Managing...',
    batchManageSuccess: 'Batch managed',
    batchManagePartial: 'Partially managed',
    batchManageStarted: 'Batch manage started',
    managing: 'Managing...',
    managingBySeries: 'Managing... (series)',
    childManageViaSeries: 'Manage via series only',
    unmanaging: 'Unmanaging...',
    takingOver: 'Taking over...',
    excluding: 'Excluding...',
    removingExclusion: 'Removing exclusion...',
    noSelectedCandidates: 'Select meetings to manage first',
    selectAllUnmanaged: 'Select unmanaged',
    clearSelection: 'Clear selection',
    search: 'Search',
    prevPage: 'Prev',
    nextPage: 'Next',
    pageLabel: 'Page {page}/{total}',
    pageSizeLabel: '{size}/page',
    details: 'Details',
    managedBindingDetailTitle: 'Managed Binding Detail',
    detailGraphEventId: 'Graph Event ID',
    detailICalUId: 'iCalUId',
    detailCancellationSource: 'Cancellation Source',
    detailPrimaryMailbox: 'Primary Mailbox',
    detailEffectiveMailbox: 'Effective Mailbox',
    detailMeetingId: 'Local Meeting ID',
    detailMeetingSeriesId: 'Local Series ID',
    detailOwnerEmail: 'Owner Email',
    detailSyncFrom: 'Sync From',
    detailSyncMode: 'Sync Mode',
    detailSyncModeAuto: 'Auto Sync',
    detailSyncModeLocked: 'Locally Managed',
    detailLocalOverrideAt: 'Local Override At',
    detailLocalOverrideBy: 'Local Override By',
    detailLocalOverrideReason: 'Local Override Reason',
    detailOccurrenceExclusions: 'Excluded Occurrences',
    detailSyncHistory: 'Sync History',
    detailHistoryTime: 'Time',
    detailHistoryEventType: 'Event',
    detailHistoryResult: 'Result',
    detailHistoryErrorCode: 'Error Code',
    detailHistoryMessage: 'Message',
    detailOnlyErrorHistory: 'Only error events',
    detailExportCsv: 'Export CSV',
    detailAllEventTypes: 'All event types',
    detailAllStages: 'All stages',
    detailNoStage: 'No stage',
    detailStartDate: 'Start time',
    detailEndDate: 'End time',
    detailHistoryTotal: 'Total {total}',
    removeExclusion: 'Remove exclusion',
    reconcileNow: 'Sync now',
    reconciling: 'Syncing...',
    healthHealthy: 'Healthy',
    healthError: 'Error',
    healthNeverSynced: 'Never synced',
    enable: 'Enable',
    disable: 'Disable',
    reconcileCron: 'Sync Cron',
    deltaBatchSize: 'Delta Batch Size',
    lookaheadDays: 'Lookahead Days',
    lookbackDays: 'Lookback Days',
    renewBeforeMinutes: 'Renew Before (minutes)',
    includeOrganizerAsAttendee: 'Include organizer as attendee (optional)',
    saveSuccess: 'Saved successfully',
    saveFailed: 'Failed to save',
    operationFailed: 'Operation failed',
    cutoverChecklistTitle: 'Cutover Manual Checklist',
    cutoverChecklistDescription: 'Historical series are handled manually; this panel provides stats and steps.',
    checklistLegacySeriesTotal: 'Legacy series candidates',
    checklistImpactedSeriesTotal: 'Series to handle',
    checklistImpactedFutureMeetingsTotal: 'Future meetings to handle',
    operationChecklist: 'Operation checklist',
    checklistCurrentEndDate: 'Current end date',
    checklistFutureMeetings: 'Future meetings',
  },
  reports: {
    title: 'Meeting Reports',
    subtitle: 'View attendance statistics for individual meetings or meeting series',
    refresh: 'Refresh',
    exportCsv: 'Export CSV',
    singleReportTab: 'Single Meeting Report',
    seriesReportTab: 'Series Report',
    selectMeetingLabel: 'Select Meeting',
    selectMeetingPlaceholder: 'Select a meeting...',
    selectSeriesLabel: 'Select Series',
    selectSeriesPlaceholder: 'Select a series...',
    startDateLabel: 'Start Date',
    endDateLabel: 'End Date',
    dateHint: 'Leave dates empty to include all meetings (auto generated).',
    includeLegacyLabel: 'Include legacy series data (pre-migration)',
    legacyMergedBanner: 'This report includes data from legacy series (pre-migration period; historical attendance sourced from legacy series).',
    loading: 'Generating report...',
    requiredAttendees: 'Required Attendees',
    attendedLabel: 'Attended',
    attendanceRateLabel: 'Attendance Rate',
    optionalLabel: 'Optional',
    statusDistributionTitle: 'Attendance Status Distribution',
    statusDistributionAll: 'Distribution of attendee counts by status',
    statusDistributionSeriesAll: 'Distribution of attendances by status (series)',
    statusDistributionFiltered: 'Status distribution for {count} filtered roles',
    filterRolesTitle: 'Filter Roles',
    selectAll: 'Select All',
    totalAttendees: 'Total {count} attendees',
    personalDetailsTitle: 'Personal Attendance Details',
    personalDetailsAll: 'Attendance status for all attendees ({count} people)',
    personalDetailsFiltered: 'Attendance status for {roles} filtered roles ({count} people)',
    seriesDetailsAll: 'Detailed attendance statistics for all attendees ({count} people, sorted by rate)',
    seriesDetailsFiltered: 'Detailed attendance statistics for {roles} filtered roles ({count} people, sorted by rate)',
    totalMeetingsLabel: 'Total Meetings',
    totalRequiredAttendees: 'Total Required Attendees',
    totalAttendedLabel: 'Total Attended',
    overallAttendanceRate: 'Overall Attendance Rate',
    lowAttendanceTitle: 'Low Attendance Ranking',
    lowAttendanceAll: 'List of people with low attendance rates',
    lowAttendanceFiltered: 'Low attendance people in {count} filtered roles',
    rankLabel: 'Rank',
    nameLabel: 'Name',
    emailLabel: 'Email',
    departmentLabel: 'Department',
    roleLabel: 'Role',
    statusLabel: 'Status',
    expectedLabel: 'Expected',
    presentLabel: 'Present',
    onSiteLabel: 'On Site',
    onlineLabel: 'Online',
    lateLabel: 'Late',
    absentLabel: 'Absent',
    ptoLabel: 'PTO',
    conflictLabel: 'Conflict',
    notCheckedInLabel: 'Not Checked In',
    cityLabel: 'City',
    singleReportTitle: 'Single Meeting Report',
    seriesReportTitle: 'Series Report',
    personalStatsTitle: 'Personal Statistics',
    dateRangeLabel: 'Date Range',
    dateRangeBeginning: 'Beginning',
    dateRangeNow: 'Now',
    dateRangeTo: 'to',
    dateRangeAll: 'All meetings',
    meetingsAnalyzedLabel: 'Total Meetings Analyzed',
    actualPeriodLabel: 'Actual Period',
    singleReportFileName: 'single-meeting-report',
    seriesReportFileName: 'series-report',
  },

  help: {
    title: 'User Guide',
    subtitle: 'Quick overview of the Meeting Attendance system',
    intro: {
      title: 'What is this',
      paragraph:
        'The Meeting Attendance system was migrated from the legacy on-prem product, preserving all functionality and adding FF AI Workspace SSO + RBAC. v1.2 introduced one-way Outlook sync and check-in mode validation (online vs on-site). Guest scan-and-check-in is preserved but requires inclusion in the attendee list.',
      highlights: [
        { title: 'Check-in opens 15 min early', desc: 'Late after start + 8 min; absent flag can be batch-applied after the meeting' },
        { title: 'One-way Outlook sync', desc: 'Webhook + Delta + scheduled reconciliation; locally-edited meetings stop syncing' },
        { title: 'Check-in mode validation', desc: 'Derived from work city vs meeting location; wrong QR or missing city → rejected' },
      ],
    },
    concepts: {
      title: 'Core Concepts',
      description: 'Know these terms before using the system',
      items: [
        { term: 'Meeting', desc: 'A single meeting instance. 4 states: SCHEDULED / IN_PROGRESS / COMPLETED / CANCELLED, transitioned automatically by time' },
        { term: 'MeetingSeries', desc: 'Recurring meetings; one configuration auto-generates many Meetings; single instances can be excluded' },
        { term: 'QR codes', desc: 'Each meeting generates an on-site QR and an online QR, used to drive the check-in mode validation' },
        { term: 'Attendance', desc: 'Attendance record. States: NOT_CHECKED_IN / ON_SITE / ONLINE / LATE / ABSENT' },
        { term: 'OutlookBinding', desc: 'Link between a managed local meeting and an Outlook event; unique by graphEventId' },
        { term: 'Local-maintenance flag', desc: 'Once title / time / location / attendees are edited locally, the meeting stops accepting Outlook overwrites' },
        { term: 'Check-in mode validation', desc: 'Toggle at meeting or series level; derives allowed mode from user work city vs meeting location' },
        { term: 'city (work / meeting location)', desc: 'Autocomplete via GET /cities/suggestions; required for check-in mode validation' },
      ],
    },
    roles: {
      title: 'Roles & Responsibilities',
      description: 'Five roles, distinct duties',
      columnHeaders: { role: 'Role', scope: 'Responsibility', desc: 'Typical operations' },
      items: [
        { code: 'Administrator', name: 'System Admin', scope: 'Global management', desc: 'Cross-mailbox view of all bindings, permission management' },
        { code: 'MeetingManager', name: 'Meeting Manager', scope: 'Meetings & attendees', desc: 'Create meetings, import attendees, view full reports, manage Outlook bindings' },
        { code: 'Leader', name: 'Leader', scope: 'Attendance oversight', desc: 'Read attendance reports and rankings' },
        { code: 'Employee', name: 'Employee', scope: 'Attending meetings', desc: 'Scan-to-check-in, view personal meetings' },
        { code: 'Guest', name: 'Guest', scope: 'No-login check-in', desc: 'Scan-to-check-in (must be in the attendee list)' },
      ],
    },
    tasks: {
      title: 'Common Tasks',
      description: 'Click a card to jump in',
      cards: [
        { id: 'dashboard', name: 'Dashboard', desc: 'Meeting overview, upcoming meetings, personal check-in status' },
        { id: 'meetings', name: 'Meetings', desc: 'Create / edit / cancel meetings, generate dual QR codes' },
        { id: 'series', name: 'Series', desc: 'Create series, batch reschedule, configure default attendees' },
        { id: 'templates', name: 'Templates', desc: 'Reusable meeting configurations' },
        { id: 'reports', name: 'Reports', desc: 'Single / series attendance rates, override counts, bilingual export' },
        { id: 'users', name: 'Users', desc: 'View users (management redirects to organization module)' },
        { id: 'auditLogs', name: 'Audit Logs', desc: 'Audit trail for create / edit / cancel / bind / takeover' },
        { id: 'outlookSync', name: 'Outlook Sync', desc: 'Candidate selection, binding, takeover, sync history with diff audit' },
      ],
    },
  },
  agenda: {
    pageTitle: 'Agenda Editor',
    pageSubtitle: 'Manage agenda sections and items',
    saveSuccess: 'Saved',
    saveFailed: 'Save failed',
    saveButton: 'Save',
    backToMeeting: 'Back to Meeting',
    leftColumnTitle: 'Agenda Structure',
    rightColumnTitle: 'Item Details',
    rightColumnEmpty: 'Select an agenda item on the left to edit',
    emptyTree: 'No agenda yet. Click below to add the first section.',
    addFirstSection: 'Add Section',
    reorderSuccess: 'Order updated',
    reorderFailed: 'Failed to update order',
    meetingTitleLabel: 'Meeting',
    editAfterEndWarning: 'This meeting has ended/cancelled. Are you sure you want to modify the agenda?',
    editAfterEndConfirm: 'Continue Editing',
    editAfterEndCancel: 'Cancel',
    detailHeaderEditAgenda: 'Edit Agenda',
    detailHeaderUploadMeetingFile: 'Upload Meeting Files',
    detailEmptyAgenda: 'No agenda yet',
    detailEmptyAgendaCta: 'Add Agenda',
    viewPage: {
      pageTitle: 'Meeting Agenda',
      backToMeeting: 'Back to Meeting',
      meetingNotFound: 'Meeting not found',
    },
    table: {
      no: '#',
      topic: 'Topic',
      code: 'Code',
      description: 'Description',
      time: 'Time',
      presenter: 'Presenter',
      files: 'Files / Tasks',
    },
    section: {
      title: 'Section',
      titlePlaceholder: 'Enter section title (≤200 chars)',
      newPlaceholder: 'New Section',
      addSection: 'Add Section',
      editSection: 'Edit Section',
      deleteSection: 'Delete Section',
      configureColumns: 'Column Config',
      columnsBadge: '{n} cols',
      deleteConfirmTitle: 'Delete Section',
      deleteConfirmBody: 'This will cascade-delete all items, upload tasks, and attachments. Restorable within 30 days via admin.',
      itemsCount: '{n} items',
      reorderHint: 'Drag to reorder',
      sectionMenu: 'Section actions',
      saveFailedTitleEmpty: 'Section title is required',
      saveFailedTitleTooLong: 'Section title cannot exceed 200 chars',
    },
    columnConfig: {
      dialogTitle: 'Section Column Config',
      dialogDescription: 'Configure how item descriptions are split for this section. Single = one block of text; multi = split by column (e.g., FFAI/EAI-EV vs EAI-Robotics side by side)',
      presetLabel: 'Quick Presets',
      presetSingle: 'Single',
      presetFfaiRobotics: 'FFAI vs Robotics',
      presetThree: 'Three (blank)',
      presetCustom: 'Custom',
      columnsListLabel: 'Column Labels (in order)',
      columnNamePlaceholder: 'Column label (≤100 chars)',
      addColumn: 'Add Column',
      removeColumn: 'Remove',
      singleColumnHint: 'Single-column mode: items use a single description field.',
      errorEmptyLabel: 'Column label cannot be empty',
    },
    item: {
      title: 'Agenda Item',
      addItem: 'Add Item',
      newPlaceholder: 'New Item',
      editItem: 'Edit',
      deleteItem: 'Delete',
      deleteConfirmTitle: 'Delete Agenda Item',
      deleteConfirmBody: 'This will permanently delete {n} attachments and {m} pending tasks of this item. Restorable within 30 days via admin.',
      assignTask: 'Assign Task',
      titleLabel: 'Title',
      titlePlaceholder: 'Enter agenda item title (≤200 chars)',
      descriptionLabel: 'Description',
      descriptionPlaceholder: 'Item description (optional, ≤2000 chars)',
      codeLabel: 'Code',
      codePlaceholder: 'Optional business code (≤64 chars)',
      timeMinutesLabel: 'Duration (min)',
      timeMinutesPlaceholder: 'Estimated duration',
      presenterLabel: 'Presenter',
      presenterPlaceholder: 'Search user',
      presenterClear: 'Clear',
      saveButton: 'Save',
      saveFailedTitleEmpty: 'Item title is required',
      saveFailedTitleTooLong: 'Item title cannot exceed 200 chars',
      saveFailedDescriptionTooLong: 'Description cannot exceed 2000 chars',
      saveFailedCodeTooLong: 'Code cannot exceed 64 chars',
      saveFailedTimeInvalid: 'Duration must be > 0',
      attachmentsBadge: 'Attachments {n}',
      uploadFile: 'Upload File',
    },
    uploadTask: {
      sectionTitle: 'Upload Tasks',
      assignTitle: 'Assign Upload Task',
      assignDescription: 'Pick one or more attendees to upload files for this item',
      assigneesLabel: 'Assignees',
      dueAtLabel: 'Due At (optional)',
      dueAtPlaceholder: 'Pick due date',
      assignButton: 'Assign',
      cancelTaskButton: 'Cancel Task',
      cancelTaskConfirm: 'Cancel this task? The assignee will no longer be reminded.',
      assignSuccess: 'Assigned {count} task(s)',
      assignFailed: 'Assign failed',
      cancelSuccess: 'Cancelled',
      cancelFailed: 'Cancel failed',
      skippedExisting: '{count} user(s) already assigned, skipped',
      status: {
        pending: 'Pending',
        uploaded: 'Uploaded',
        cancelled: 'Cancelled',
      },
      statusBadgePending: 'Pending {n}',
      statusBadgeUploaded: 'Uploaded {n}',
      pendingCount: 'Pending {n}',
      uploadedCount: 'Uploaded {n}',
      dueAt: 'Due At',
      noDueAt: 'No due date',
      assignedBy: 'Assigned by',
      assignedAt: 'Assigned at',
      empty: 'No upload tasks yet',
    },
  },
  attachment: {
    sectionTitle: 'Files',
    upload: 'Upload Files',
    uploadMeetingFile: 'Upload Meeting Files',
    download: 'Download',
    delete: 'Delete',
    deleteConfirm: 'Delete this file?',
    deleteSuccess: 'Deleted',
    deleteFailed: 'Delete failed',
    uploadDialogTitle: 'Upload Files',
    uploadDialogDescription: 'Supports PDF / Word / PowerPoint / Excel / image / video. Max 200MB per file.',
    dropzoneIdle: 'Drop files here, or click to select',
    dropzoneActive: 'Release to upload',
    dropzoneClickHint: 'Click to select files',
    dropzoneSupported: 'Supported: PDF / DOCX / PPTX / XLSX / JPG / PNG / MP4 / MOV',
    queueTitle: 'Upload Queue',
    queueEmpty: 'No files',
    queueRemove: 'Remove',
    queueRetry: 'Retry',
    queueCancel: 'Cancel',
    queueStatusQueued: 'Queued',
    queueStatusUploading: 'Uploading {percent}%',
    queueStatusSuccess: 'Uploaded',
    queueStatusFailed: 'Failed',
    queueStatusCancelled: 'Cancelled',
    queueTotalProgress: 'Total: {loaded} / {total}',
    confirmCloseWhileUploading: 'Uploads are in progress. Close anyway?',
    closeButton: 'Close',
    uploadAllDone: 'All uploads completed',
    folderNotSupported: 'Folder upload is not supported. Please select files individually.',
    tooManyFiles: 'Up to 10 files per upload',
    tooLarge: 'File exceeds 200MB. Please compress and retry.',
    mimeNotAllowed: 'Unsupported file type.',
    mimeMismatch: 'File content does not match its declared type.',
    notOwned: 'This upload task is not assigned to you.',
    deleteForbidden: 'Only the uploader or a manager can delete.',
    notFound: 'Attachment not found or has been deleted.',
    netError: 'Network error. Please retry.',
    uploadedBy: 'Uploaded by',
    uploadedAt: 'Uploaded at',
    sizeColumn: 'Size',
    listEmpty: 'No files yet',
    categoryLabel: 'Category',
    categoryMinutes: 'Minutes',
    categoryMaterial: 'Material',
    categoryPresentation: 'Presentation',
    categoryOther: 'Other',
    categoryAll: 'All',
  },
  myTasks: {
    pageTitle: 'My Tasks',
    pageSubtitle: 'Upload tasks assigned to you for agenda items',
    empty: 'No pending upload tasks.',
    cardTitle: 'Upload material for "{item}" in "{meeting}"',
    cardSection: 'Section',
    cardDueAt: 'Due: {date}',
    cardNoDueAt: 'No due date',
    cardAssignedBy: 'Assigned by: {name}',
    cardGoUpload: 'Go upload',
    filterStatusLabel: 'Status',
    filterStatusAll: 'All',
    filterStatusPending: 'Pending',
    filterStatusUploaded: 'Uploaded',
    filterStatusCancelled: 'Cancelled',
    sortLabel: 'Sort',
    sortDueAtAsc: 'Due date ascending',
    sortAssignedAtDesc: 'Assigned date descending',
    loadMore: 'Load more',
    loadFailed: 'Failed to load',
    loadRetry: 'Retry',
    itemDeleted: 'Agenda item has been deleted',
  },
};
