diff --git a/lang/en/parametres.php b/lang/en/parametres.php index c79e6570..672e0ad8 100644 --- a/lang/en/parametres.php +++ b/lang/en/parametres.php @@ -248,4 +248,845 @@ 'mention_label_ph' => 'Label (e.g. Congratulations)', 'mentions_hint' => 'The honor applied is the one with the highest threshold less than or equal to the average.', ], + + 'subjects' => [ + 'head' => 'Subjects', + 'title' => 'Subjects', + 'subtitle' => 'Manage the subjects taught', + 'new' => 'New subject', + 'stat_total' => 'Total subjects', + 'stat_shown' => 'Results shown', + 'stat_page' => 'Page', + 'search_ph' => 'Search a subject by name or code...', + 'search_results' => 'Results for:', + 'th_code' => 'Code', + 'th_name' => 'Name', + 'th_description' => 'Description', + 'no_description' => 'No description', + 'empty' => 'No subject found', + 'page_showing' => 'Showing', + 'page_to' => 'to', + 'page_of' => 'of', + 'page_unit' => 'subjects', + 'page_label' => 'Page', + 'delete_title' => 'Delete subject', + 'delete_desc' => 'Are you sure you want to delete this subject? This action is irreversible.', + 'deleting' => 'Deleting...', + + 'create_head' => 'Create a subject', + 'create_title' => 'Create a subject', + 'create_subtitle' => 'Enter the subject information.', + 'edit_head' => 'Edit :name', + 'edit_title' => 'Edit a subject', + 'edit_subtitle' => 'Update the information for :name.', + + 'show_subtitle' => 'Subject detail and tracking.', + 'info_section' => 'Subject information', + 'description' => 'Description', + 'show_no_description' => 'No description provided for this subject.', + 'history' => 'History', + 'created_on' => 'Created on', + 'updated_on' => 'Last updated', + 'summary' => 'Summary', + 'summary_before' => 'The subject', + 'summary_middle' => 'is identified by the code', + 'summary_stats' => 'Usage statistics will be shown here as soon as they are available.', + 'edit_this' => 'Edit this subject', + + 'form_section' => 'Subject information', + 'code_label' => 'Code *', + 'code_ph' => 'e.g. MATH101', + 'code_hint' => 'Unique code used to identify the subject.', + 'name_label' => 'Name *', + 'name_ph' => 'e.g. Mathematics', + 'parent_label' => 'Parent subject (sub-subject)', + 'no_parent' => 'None (main subject)', + 'parent_hint' => 'Attach this subject to a main subject to make it a sub-subject (e.g. "Dictation" under "French").', + 'description_label' => 'Description', + 'description_ph' => 'Briefly describe the content and objectives of the subject...', + 'description_hint' => 'Optional, maximum 1000 characters.', + 'preview' => 'Preview', + 'preview_code' => 'CODE', + 'preview_name' => 'Subject name', + 'submit_create' => 'Create subject', + ], + + 'fee_categories' => [ + 'head' => 'Fee categories', + 'title' => 'Fee categories', + 'subtitle' => 'Manage school fee categories', + 'new' => 'New category', + 'stat_total' => 'Total categories', + 'search_ph' => 'Search by name or description...', + 'th_name' => 'Name', + 'th_description' => 'Description', + 'th_created' => 'Created date', + 'empty' => 'No category found', + 'delete_title' => 'Delete category', + 'delete_desc' => 'This action cannot be undone. Are you sure you want to delete this category?', + 'deleting' => 'Deleting...', + + 'create_head' => 'New fee category', + 'create_title' => 'Create a fee category', + 'edit_head' => 'Edit fee category', + 'edit_title' => 'Edit fee category', + 'identity' => 'Category identity', + 'name_label' => 'Name *', + 'name_ph' => 'e.g. Tuition fees, Canteen fees...', + 'description' => 'Description', + 'description_ph' => 'Describe this fee category...', + 'create' => 'Create', + + 'show_head' => 'Category: :name', + 'show_title' => 'Category detail', + 'name' => 'Name', + 'created_on' => 'Created on', + 'show_no_description' => 'No description provided', + 'updated_on' => 'Last updated', + 'id' => 'ID', + 'delete_desc_show' => 'This action cannot be undone. Are you sure you want to delete this fee category?', + ], + + 'classroom_types' => [ + 'head' => 'Class types', + 'title' => 'Class types', + 'subtitle' => 'Manage the available class types', + 'new' => 'New type', + 'stat_total' => 'Total types', + 'stat_active' => 'Active types', + 'stat_page' => 'Page', + 'search_ph' => 'Search a type...', + 'reset' => 'Reset', + 'th_name' => 'Name', + 'th_description' => 'Description', + 'th_status' => 'Status', + 'empty' => 'No type found', + 'active' => '✓ Active', + 'inactive' => 'Inactive', + 'page_showing_before' => 'Showing', + 'page_showing_to' => 'to', + 'page_showing_on' => 'of', + 'page_unit' => 'types', + 'page_label' => 'Page', + 'page_of' => 'of', + 'delete_title' => 'Delete type', + 'delete_desc' => 'Are you sure you want to delete this class type? This action is irreversible.', + 'deleting' => 'Deleting...', + + 'create_head' => 'New class type', + 'create_title' => 'Create a class type', + 'create_subtitle' => 'Enter the type information.', + 'edit_head' => 'Edit :name', + 'edit_title' => 'Edit a class type', + 'edit_subtitle' => 'Update the information for :name.', + + 'show_status' => 'Status', + 'show_active' => '✓ Active', + 'show_inactive' => 'Inactive', + 'linked_classrooms' => 'Linked classrooms', + 'created_on' => 'Created on', + 'updated_on' => 'Last updated', + 'classes_using' => 'Classrooms using this type', + 'classes_using_sub' => 'Showing all classrooms assigned to this type', + 'no_classroom' => 'No classroom uses this type yet', + 'create_classroom' => 'Create a classroom', + 'cr_name' => 'Name', + 'cr_code' => 'Code', + 'cr_capacity' => 'Capacity', + 'cr_status' => 'Status', + 'cr_action' => 'Action', + 'cr_places' => ':n seats', + 'cr_active' => '✓ Active', + 'cr_inactive' => 'Inactive', + 'cr_view' => 'View', + + 'form_section' => 'Type information', + 'name_label' => 'Name *', + 'name_ph' => 'e.g. General class', + 'description_label' => 'Description', + 'description_ph' => 'Class type description...', + 'period_label' => 'Period system *', + 'period_trimestre' => 'Trimester (3 periods)', + 'period_semestre' => 'Semester (2 periods)', + 'period_hint' => 'Determines how the year is split (report cards, assessments) for this class type.', + 'status_section' => 'Status', + 'active_label' => 'Active type', + 'submit_create' => 'Create type', + ], + + 'scholarships' => [ + 'head' => 'Scholarships', + 'title' => 'Scholarships', + 'subtitle' => 'Manage tuition fee reductions', + 'new' => 'New scholarship', + 'stat_total' => 'Total scholarships', + 'stat_percentage' => 'Percentage scholarships', + 'stat_fixed' => 'Fixed amounts', + 'search_ph' => 'Search a scholarship...', + 'search_results' => 'Results for:', + 'th_name' => 'Name', + 'th_type' => 'Type', + 'th_value' => 'Value', + 'th_created' => 'Created date', + 'empty' => 'No scholarship found', + 'type_percentage' => 'Percentage', + 'type_fixed' => 'Fixed amount', + 'page_showing' => 'Showing', + 'page_to' => 'to', + 'page_of' => 'of', + 'page_unit' => 'scholarships', + 'page_label' => 'Page', + 'delete_title' => 'Delete scholarship', + 'delete_desc' => 'Are you sure you want to delete this scholarship? This action is irreversible.', + 'deleting' => 'Deleting...', + + 'create_head' => 'Create a scholarship', + 'create_title' => 'Create a new scholarship', + 'edit_head' => 'Edit :name', + 'edit_title' => 'Edit :name', + 'form_section' => 'Scholarship information', + 'name_label' => 'Name *', + 'name_ph' => 'e.g. Excellence scholarship', + 'type_label' => 'Type *', + 'type_ph' => 'Select a type', + 'value_label_pct' => 'Value (%) *', + 'value_label_fixed' => 'Value (amount) *', + 'value_ph_pct' => 'e.g. 15', + 'value_ph_fixed' => 'e.g. 100.00', + 'description' => 'Description', + 'description_ph' => 'Describe the scholarship...', + 'submit_create' => 'Create scholarship', + + 'show_value' => 'Value', + 'show_description' => 'Description', + 'show_no_description' => 'No description available', + 'history' => 'History', + 'created_on' => 'Created on', + 'updated_on' => 'Last updated', + 'summary' => 'Summary', + 'current_value' => 'Current value', + ], + + 'bulletin_templates' => [ + 'head' => 'Report card template', + 'title' => 'Report card template', + 'subtitle_before' => 'Build the report card columns for :name. The', + 'subtitle_after' => 'token becomes "Term." or "Sem." depending on the class type.', + 'load_preset' => 'Load a preset…', + 'saving' => 'Saving…', + 'columns' => 'Columns (:n)', + 'total_width' => 'Total width: :w%', + 'default_column' => 'Column', + 'label_ph' => 'Label', + 'type_prefix' => 'Type: :name', + 'add_column' => 'Add a column', + 'footer' => 'Report card footer', + 'opt_class_stats' => 'Show class statistics (highest / lowest / overall average)', + 'opt_period_recap' => 'Show inter-period recap + annual average', + 'opt_discipline' => 'Show the discipline block (lateness, absences, board decision)', + 'signatory_left' => 'Signatory (left)', + 'signatory_right' => 'Signatory (right)', + 'legal_note' => 'Legal notice (N.B.)', + ], + + 'file_storage' => [ + 'head' => 'Files & Storage', + 'title' => 'Files & Storage', + 'subtitle' => 'Configure where uploaded files (logos, documents) will be stored.', + 'toast_saved_title' => 'Configuration saved', + 'toast_saved_desc' => 'Storage settings have been updated.', + 'toast_error_title' => 'Error', + 'toast_error_desc' => 'Check the fields and try again.', + 'toast_test_ok_title' => 'Connection successful', + 'toast_test_ok_desc' => 'The ":driver" disk is accessible and working.', + 'toast_test_fail_title' => 'Connection failed', + 'toast_unknown_error' => 'Unknown error.', + 'toast_unreachable' => 'Unable to reach the storage.', + 'driver_local' => 'Local storage', + 'driver_local_desc' => 'Files on the Laravel server (public/storage)', + 'driver_s3' => 'S3 cloud storage', + 'driver_s3_desc' => 'AWS S3, Cloudflare R2, MinIO or S3-compatible', + 's3_section' => 'S3 / Cloudflare R2 configuration', + 'access_key' => 'Access Key', + 'secret_key' => 'Secret Key', + 'keep_hint' => '(leave empty to keep)', + 'bucket' => 'Bucket *', + 'region' => 'Region *', + 'region_ph' => 'auto (R2) or eu-west-1 (AWS)', + 'endpoint' => 'Endpoint', + 'endpoint_hint' => '(R2/MinIO — leave empty for AWS)', + 'public_url' => 'Public URL', + 'public_url_hint' => '(CDN or custom domain)', + 'r2_title' => 'Cloudflare R2 (recommended)', + 'r2_region' => '• Region:', + 'r2_endpoint' => '• Endpoint:', + 'r2_bandwidth' => '• No egress bandwidth fees (ideal for Africa)', + 'local_active' => 'Local storage active', + 'local_active_before' => 'Files are stored in', + 'local_active_middle' => 'and served via', + 'test_connection' => 'Test connection', + 'save' => 'Save', + ], + + 'backups' => [ + 'head' => 'Backups', + 'title' => 'Backups', + 'subtitle' => 'Back up the database (JSON / SQL) and schedule automatic backups.', + 'size_mb' => ':n MB', + 'size_kb' => ':n KB', + 'day_1' => 'Monday', + 'day_2' => 'Tuesday', + 'day_3' => 'Wednesday', + 'day_4' => 'Thursday', + 'day_5' => 'Friday', + 'day_6' => 'Saturday', + 'day_7' => 'Sunday', + 'dest_label' => 'Destination:', + 'dest_remote' => 'Remote repository (S3 / R2)', + 'dest_local' => 'Local server storage', + 'dest_remote_desc' => 'Backups are sent to your configured cloud storage.', + 'dest_local_desc' => 'Configure S3/R2 storage in "Files & Storage" to externalize backups.', + 'manual_title' => 'Back up now', + 'include_media' => 'Include media (documents, photos)', + 'running' => 'Backing up…', + 'run_backup' => 'Run backup', + 'manual_hint_before' => 'With media, the backup is produced in', + 'manual_hint_after' => 'format (database + uploaded files). Otherwise, only the database is backed up.', + 'archive_title' => 'Archive a school year', + 'archive_desc_before' => 'Generates a complete', + 'archive_desc_locked' => 'locked', + 'archive_desc_after' => 'snapshot kept long-term (excluded from automatic retention). The archive is also created automatically when a year is closed.', + 'academic_year' => 'School year', + 'choose_year' => 'Choose a year…', + 'already_archived' => ' — already archived', + 'archiving' => 'Archiving…', + 'archive_year' => 'Archive the year', + 'schedule_title' => 'Automatic scheduling', + 'frequency' => 'Frequency', + 'freq_none' => 'Disabled', + 'freq_daily' => 'Daily', + 'freq_weekly' => 'Weekly', + 'time' => 'Time', + 'day' => 'Day', + 'retention' => 'Retention (number kept)', + 'formats_generated' => 'Generated formats', + 'schedule_hint_before' => 'Scheduling requires the Laravel scheduler to run on the server', + 'schedule_hint_after' => 'via cron, every minute).', + 'save_schedule' => 'Save schedule', + 'restore_title' => 'Restore the database', + 'restore_warn_before' => 'Restoring', + 'restore_warn_bold' => 'overwrites current data', + 'restore_warn_after' => 'with the file content. A safety backup (JSON) is created automatically before the operation.', + 'restoring' => 'Restoring…', + 'restore' => 'Restore', + 'restore_one_table' => 'Restore a single table (optional)', + 'all_tables' => 'Whole database', + 'restore_table_hint_before' => 'Table-targeted restore is only available with', + 'restore_table_hint_after' => '(or .json.gz) files and only overwrites the chosen table.', + 'accepted_formats' => 'Accepted formats: .json, .sql, .gz (compressed), .dump (PostgreSQL) or .zip (database + media) from this application — max 200 MB.', + 'history_title' => 'Backup history', + 'th_file' => 'File', + 'th_format' => 'Format', + 'th_size' => 'Size', + 'th_origin' => 'Origin', + 'th_status' => 'Status', + 'th_date' => 'Date', + 'empty' => 'No backup yet.', + 'badge_archive' => 'Archive', + 'badge_media' => '+ media', + 'origin_scheduled' => 'Scheduled', + 'origin_manual' => 'Manual', + 'status_ok' => 'OK', + 'status_fail' => 'Failed', + 'verify_integrity' => 'Verify integrity', + 'restore_confirm_title' => 'Confirm restore?', + 'restore_confirm_desc' => 'All current data will be replaced by the content of ":name". A safety backup is created first. This action is irreversible.', + 'restore_now' => 'Restore now', + 'delete_title' => 'Delete this backup?', + 'delete_desc' => 'The file will be permanently deleted from storage.', + ], + + 'academic_years' => [ + 'head' => 'Academic years', + 'title' => 'Academic years', + 'subtitle' => 'Manage academic years', + 'new' => 'New year', + 'stat_total' => 'Total years', + 'stat_active' => 'Active years', + 'stat_page' => 'Page', + 'search_ph' => 'Search for a year...', + 'th_year' => 'Year', + 'th_start' => 'Start date', + 'th_end' => 'End date', + 'th_status' => 'Status', + 'status_active' => 'Active', + 'status_inactive' => 'Inactive', + 'empty' => 'No academic year found', + 'delete_title' => 'Confirm deletion', + 'delete_desc' => 'Are you sure you want to delete this academic year? This action is irreversible.', + 'deleting' => 'Deleting...', + 'create_head' => 'Create an academic year', + 'create_title' => 'Create a new academic year', + 'edit_head' => 'Edit :year', + 'edit_title' => 'Edit :year', + 'section_period' => 'Academic period', + 'label_year' => 'Year', + 'year_ph' => 'e.g. 2025-2026', + 'label_start' => 'Start date', + 'label_end' => 'End date', + 'section_activation' => 'Activation', + 'active_label' => 'Active year', + 'active_hint' => 'Check this box if it is the current academic year', + 'submit_create' => 'Create academic year', + 'info_title' => 'Academic year information', + 'field_status' => 'Status', + 'field_status_active' => 'Active', + 'field_status_inactive' => 'Inactive', + 'period_title' => 'Period', + 'period_from' => 'From', + 'period_to' => 'To', + 'history_title' => 'History', + 'stats_title' => 'Statistics', + 'stats_classes' => 'Classes', + 'stats_students' => 'Enrolled students', + 'stats_teachers' => 'Teachers', + 'state_title' => 'State', + 'state_active_title' => 'Current year', + 'state_active_desc' => 'This year is currently active', + 'state_inactive_title' => 'Inactive year', + 'state_inactive_desc' => 'This year is not active', + ], + + 'academic_periods' => [ + 'head' => 'Academic periods', + 'title' => 'Academic periods', + 'subtitle' => 'Manage academic periods (terms and semesters)', + 'new' => 'New period', + 'stat_total' => 'Total periods', + 'stat_active' => 'Active periods', + 'stat_page' => 'Page', + 'search_ph' => 'Search for a period...', + 'th_name' => 'Name', + 'th_year' => 'Year', + 'th_type' => 'Type', + 'th_order' => 'Order', + 'th_period' => 'Period', + 'th_status' => 'Status', + 'type_trimester' => 'Term', + 'type_semester' => 'Semester', + 'status_active' => 'Active', + 'status_inactive' => 'Inactive', + 'empty' => 'No academic period found', + 'delete_title' => 'Confirm deletion', + 'delete_desc' => 'Are you sure you want to delete this academic period? This action is irreversible.', + 'deleting' => 'Deleting...', + 'create_head' => 'Create an academic period', + 'create_title' => 'Create an academic period', + 'create_subtitle' => 'Set the information for the new period.', + 'edit_head' => 'Edit :name', + 'edit_title' => 'Edit period', + 'section_identification' => 'Identification', + 'label_name' => 'Name', + 'name_ph' => 'e.g. Term 1, Semester 1...', + 'label_year' => 'Academic year', + 'year_ph' => 'Select a year', + 'section_classification' => 'Classification', + 'label_type' => 'Type', + 'label_order' => 'Order', + 'order_ph' => '1, 2, 3...', + 'label_class_type' => 'Class type', + 'class_type_all' => 'All classes (global)', + 'class_type_hint' => 'Leave "global" to apply to all class types.', + 'label_weight' => 'Weight (annual average)', + 'section_calendar' => 'Calendar', + 'label_start' => 'Start date', + 'label_end' => 'End date', + 'section_details' => 'Details & Status', + 'label_description' => 'Description', + 'description_ph' => 'Period description...', + 'active_label' => 'Active period (current)', + 'submit_create' => 'Create period', + 'saving' => 'Saving...', + 'submit_update' => 'Save changes', + 'info_title' => 'Period information', + 'system_title' => 'System information', + 'label_id' => 'Identifier', + 'about_title' => 'About', + 'about_desc' => 'Academic periods divide the school year into terms or semesters to organize assessment and student tracking.', + ], + + 'classrooms' => [ + 'head' => 'Classes', + 'title' => 'Classes', + 'subtitle' => 'Manage your school\'s classes', + 'new' => 'New class', + 'stat_total' => 'Total classes', + 'stat_active' => 'Active classes', + 'stat_page' => 'Page', + 'search_ph' => 'Search for a class...', + 'reset' => 'Reset', + 'th_name' => 'Name', + 'th_code' => 'Code', + 'th_type' => 'Type', + 'th_capacity' => 'Capacity', + 'empty' => 'No class found', + 'assign_subjects' => 'Assign subjects', + 'showing_sep' => 'of', + 'showing_unit' => 'classes', + 'delete_title' => 'Delete class', + 'delete_desc' => 'Are you sure you want to delete this class? This action is irreversible.', + 'deleting' => 'Deleting...', + 'create_head' => 'New class', + 'create_title' => 'Create a class', + 'create_subtitle' => 'Enter the class information.', + 'edit_head' => 'Edit :name', + 'edit_title' => 'Edit a class', + 'edit_subtitle' => 'Update the information for :name.', + 'form_info' => 'Class information', + 'label_name' => 'Name', + 'name_ph' => 'e.g. 6th A', + 'label_code' => 'Code', + 'code_ph' => 'e.g. 6A-2026', + 'label_capacity' => 'Capacity', + 'label_expected_age' => 'Expected age', + 'expected_age_ph' => 'e.g. 12', + 'expected_age_hint' => 'Official expected age (basis for over-age calculation).', + 'label_type' => 'Class type', + 'type_none' => 'No type', + 'preview' => 'Preview', + 'preview_text_before' => 'This class will accommodate up to', + 'preview_text_after' => 'students.', + 'submit_create' => 'Create class', + 'creating' => 'Creating...', + 'show_code' => 'Code', + 'show_capacity' => 'Capacity', + 'show_capacity_hint' => 'available seats', + 'show_type' => 'Class type', + 'show_created_on' => 'Created on', + 'show_updated_on' => 'Updated on', + 'subjects_title' => 'Subjects and Coefficients', + 'subjects_summary' => ':n subject(s) • Total coefficients: :total', + 'select_year_ph' => 'Select a year', + 'coef' => 'Coef.', + 'no_assignments' => 'No subject assigned for this academic year', + // Assignments + 'assign_head' => 'Assignments - :name', + 'assign_title' => 'Assign subjects', + 'assign_class_before' => 'Class:', + 'assign_year_section' => 'Academic year', + 'assign_year_ph' => 'Select an academic year', + 'assign_subjects_section' => 'Subjects and coefficients', + 'assign_search_ph' => 'Search for a subject...', + 'assign_coef_ph' => 'Coef', + 'assign_selected_count' => ':n subject(s) selected', + 'assign_submit' => 'Save assignments', + 'assign_saving' => 'Saving...', + 'err_year_required' => 'The academic year is required.', + 'err_subjects_required' => 'Please select at least one subject.', + 'err_coef_invalid' => 'Invalid coefficient (must be > 0).', + ], + + 'documents' => [ + // Index + 'head' => 'Document templates', + 'title' => 'Document templates', + 'subtitle' => 'Manage certificate, attestation and report card templates exportable to PDF.', + 'btn_header' => 'Header', + 'btn_registry' => 'Registry', + 'btn_new' => 'New template', + 'cat_empty' => 'No template in this category.', + 'badge_default' => 'Default', + 'status_active' => '● Active', + 'status_inactive' => '● Inactive', + 'delete_title' => 'Delete this template?', + 'delete_desc' => 'This action is irreversible. Documents already issued are not affected.', + // Registry + 'registry_head' => 'Document registry', + 'registry_title' => 'Document registry', + 'registry_subtitle' => 'Traceability of all issued documents (:n).', + 'registry_search_ph' => 'Reference no., student name or ID...', + 'registry_th_ref' => 'Reference', + 'registry_th_doc' => 'Document', + 'registry_th_student' => 'Student', + 'registry_th_issuer' => 'Issued by', + 'registry_th_date' => 'Date', + 'registry_empty' => 'No document issued.', + // Show + 'cat_certificat' => 'Certificate', + 'cat_attestation' => 'Attestation', + 'cat_bulletin' => 'Report card', + 'show_features' => 'Characteristics', + 'show_type' => 'Type', + 'show_orientation' => 'Orientation', + 'show_signatory' => 'Signatory', + 'orientation_portrait' => 'Portrait', + 'orientation_landscape' => 'Landscape', + 'flag_header' => 'Official header', + 'flag_signature' => 'Signature block', + 'show_default' => 'Default template', + 'show_active' => 'Active', + 'show_inactive' => 'Inactive', + 'show_sample_note' => 'The preview uses sample data. Variables will be replaced with the student\'s real information at generation.', + 'show_preview' => 'Document preview', + // Edit + 'edit_head' => 'Edit template', + 'create_head' => 'New template', + 'edit_title' => 'Edit template', + 'create_title' => 'New document template', + 'edit_subtitle' => 'Configure the document and its content with dynamic variables.', + 'toast_saved_title' => 'Saved', + 'toast_saved_desc' => 'Template saved.', + 'toast_error_title' => 'Error', + 'toast_error_desc' => 'Check the fields.', + 'toast_preview_error' => 'Preview failed.', + 'label_category' => 'Category', + 'label_type' => 'Type', + 'type_ph' => 'Choose a type', + 'label_name' => 'Template name', + 'name_ph' => 'e.g. Standard enrollment certificate', + 'label_description' => 'Description', + 'description_ph' => 'Template usage (optional)', + 'label_source' => 'Body source', + 'label_layout' => 'Predefined layout', + 'layout_ph' => 'Choose a layout', + 'layout_hint' => 'Layout provided by the application (logic, tables). The school header, signature and watermark still apply.', + 'label_content' => 'Document content', + 'content_tip' => 'Tip: place the cursor then click a variable on the right to insert it.', + 'variables_title' => 'Available variables', + 'insert_var' => 'Insert :var', + 'options_title' => 'Layout', + 'label_orientation' => 'Orientation', + 'label_signatory' => 'Signatory title', + 'signatory_ph' => 'The Principal', + 'opt_header' => 'Official header (logo, term, motto)', + 'opt_signature' => 'Signature block', + 'opt_default' => 'Default template for this type', + 'opt_active' => 'Active', + 'btn_preview' => 'Preview', + 'preview_sample_title' => 'Preview (sample data)', + // HeaderDesigner + 'hd_head' => 'Document header', + 'hd_title' => 'Document header', + 'hd_subtitle' => 'Compose the header used for certificates, attestations and report cards. Drag the blocks to position them.', + 'hd_reset' => 'Reset', + 'hd_saving' => 'Saving…', + 'hd_preset_label' => 'Header template', + 'hd_watermark_both' => 'The watermark applies to both templates.', + 'hd_ministerial_title' => 'Ministerial header (official)', + 'hd_ministerial_p1' => 'The three-column header (Ministry & school · logo · Republic & motto) is generated automatically from the school information. Drag-and-drop is disabled for this template.', + 'hd_ministerial_p2' => 'To change the ministry, name, logo or motto, go to the school settings.', + 'hd_add_block' => 'Add a block', + 'hd_block_logo' => 'Logo', + 'hd_block_name' => 'Name', + 'hd_block_motto' => 'Motto', + 'hd_block_term' => 'Term', + 'hd_block_contact' => 'Contact details', + 'hd_block_text' => 'Text', + 'hd_default_text' => 'Free text', + 'hd_canvas_title' => 'Preview (A4 width)', + 'hd_height' => 'Height', + 'hd_canvas_hint' => 'Click a block to edit it, drag it to move it.', + 'hd_block_props' => 'Block properties', + 'hd_select_block' => 'Select a block in the preview.', + 'hd_size_px' => 'Size (px)', + 'hd_delete' => 'Delete', + 'hd_content' => 'Content', + 'hd_insert_var_ph' => 'Insert a variable…', + 'hd_size' => 'Size', + 'hd_width' => 'Width', + 'hd_delete_block' => 'Delete block', + 'hd_color' => 'Color', + 'hd_watermark' => 'Watermark', + 'hd_enable' => 'Enable', + 'hd_wm_text' => 'Text', + 'hd_wm_image' => 'Image / logo', + 'hd_wm_text_ph' => 'Watermark text', + 'hd_opacity' => 'Opacity: :n%', + 'hd_wm_size' => 'Size: :n', + 'hd_rotation' => 'Rotation: :n°', + 'hd_var_note_before' => 'Variables like', + 'hd_var_note_after' => 'are replaced when each document is generated.', + ], + + 'class_subjects' => [ + // Index + 'head' => 'Subject assignment to classes', + 'title' => 'Subject assignment to classes', + 'subtitle' => 'Manage the assignment of subjects to each class', + 'new' => 'Add an assignment', + 'stat_assignments' => 'Assignments', + 'stat_classes' => 'Classes covered', + 'search_ph' => 'Search for a class or subject...', + 'search_results' => 'Results for:', + 'th_class' => 'Class', + 'th_subjects' => 'Assigned subjects', + 'th_year' => 'Academic year', + 'coef' => 'Coef', + 'empty' => 'No assignment found', + 'showing' => 'Showing :from to :to of :total assignments', + 'page_of' => 'Page :current of :last', + 'delete_title' => 'Confirm deletion', + 'delete_desc' => 'Are you sure you want to delete this assignment? This action is irreversible.', + 'deleting' => 'Deleting...', + // Create / Edit shared + 'create_head' => 'Assign subjects to a class', + 'create_title' => 'Assign subjects to a class', + 'create_subtitle' => 'Select a class, an academic year and the subjects to teach', + 'edit_head' => 'Edit assigned subjects', + 'edit_title' => 'Edit assigned subjects', + 'edit_subtitle' => 'Update the subjects assigned to this class', + 'section_base' => 'Basic selection', + 'label_class' => 'Class', + 'class_ph' => 'Select a class', + 'label_year' => 'Academic year', + 'year_ph' => 'Select an academic year', + 'section_subjects' => 'Subject and coefficient selection', + 'search_subjects' => 'Search subjects', + 'search_subjects_ph' => 'Search by name or code...', + 'code' => 'Code', + 'coef_ph' => 'Coef', + 'group_required' => 'Required', + 'group_optional' => 'Optional', + 'no_subjects' => 'No subject found', + 'selected_count' => ':n subject(s) selected with coefficient', + 'submit_create' => 'Assign subjects', + 'creating' => 'Assigning...', + 'submit_update' => 'Update', + 'updating' => 'Updating...', + 'err_class_required' => 'The class is required.', + 'err_year_required' => 'The academic year is required.', + 'err_subjects_required' => 'Please select at least one subject.', + 'err_coef_invalid' => 'Invalid coefficient (must be > 0).', + // Show + 'show_head' => 'Assignment details', + 'show_title' => 'Assignment details', + 'show_subtitle' => 'Information about the subject assignment to the class', + 'show_class' => 'Class', + 'show_subject' => 'Subject', + 'show_name' => 'Name', + 'show_coef' => 'Coefficient', + 'show_year' => 'Academic year', + 'show_year_label' => 'Year', + 'show_start' => 'Start date', + 'show_end' => 'End date', + 'show_tracking' => 'Tracking information', + 'show_created_on' => 'Created on', + 'show_updated_on' => 'Updated on', + ], + + 'fee_structures' => [ + // Index + 'head' => 'Fee structures', + 'title' => 'Fee structures', + 'subtitle' => 'Manage fee amounts by category, class and academic year', + 'replicate_year' => 'Replicate a year', + 'new' => 'New structure', + 'stat_total' => 'Total amount', + 'stat_average' => 'Average amount', + 'stat_classes' => 'Classes covered', + 'stat_categories' => 'Categories covered', + 'stat_gap' => 'Min/max gap', + 'stat_gap_detail' => 'Min :min | Max :max', + 'search_ph' => 'Search by category, class or year...', + 'filter_year' => 'Academic year', + 'filter_all_years' => 'All years', + 'active_suffix' => ' (active)', + 'filter_category' => 'Category', + 'filter_all_categories' => 'All categories', + 'filter_class' => 'Class', + 'filter_all_classes' => 'All classes', + 'filter_amount_min' => 'Min amount', + 'filter_amount_max' => 'Max amount', + 'search' => 'Search', + 'reset' => 'Reset', + 'filtered_count' => ':count filtered structure(s) | Max: :max', + 'col_year' => 'Academic year', + 'col_category' => 'Category', + 'col_class' => 'Class', + 'col_amount' => 'Amount', + 'col_actions' => 'Actions', + 'empty' => 'No fee structure found', + 'pagination' => 'Showing :from to :to of :total results', + // Delete dialog + 'delete_title' => 'Confirm deletion', + 'delete_desc' => 'Are you sure you want to delete this fee structure? This action is irreversible.', + 'cancel' => 'Cancel', + 'deleting' => 'Deleting...', + 'delete' => 'Delete', + // Replicate dialog + 'replicate_title' => 'Replicate fee structures', + 'replicate_desc' => 'Copies all structures (and their installments) from one year to the active year. Category / class combinations already present are ignored.', + 'replicate_target' => 'Target year (active):', + 'replicate_source' => 'Source year *', + 'replicate_source_ph' => 'Choose the year to copy', + 'replicating' => 'Replicating...', + 'replicate' => 'Replicate', + 'replicate_no_active' => 'No active academic year. Activate a year before replicating.', + // Create / Edit + 'create_head' => 'New fee structure', + 'create_title' => 'New fee structure', + 'create_subtitle' => 'Create a new fee structure for an academic year, category and class', + 'edit_head' => 'Edit fee structure', + 'edit_title' => 'Edit fee structure', + 'edit_subtitle' => 'Edit the information for this fee structure', + 'back' => 'Back', + 'section_academic' => 'Academic context', + 'active_year' => 'Active academic year', + 'active_badge' => 'Active', + 'no_active_year' => 'No active academic year. Activate one first.', + 'auto_attach' => 'The structure is automatically attached to the active year.', + 'field_year' => 'Academic year', + 'field_year_ph' => 'Select an academic year', + 'field_category' => 'Fee category', + 'field_category_ph' => 'Select a category', + 'field_class_section' => 'Class concerned', + 'field_class' => 'Class', + 'field_class_ph' => 'Select a class', + 'field_amount' => 'Amount', + 'field_amount_currency' => 'Amount (:currency)', + 'field_amount_ph' => 'Ex: 50000', + 'saving' => 'Saving...', + 'save' => 'Save', + 'updating' => 'Updating...', + 'update' => 'Update', + // Show + 'show_head' => 'Fee structure details', + 'manage_installments' => 'Manage installments', + 'edit' => 'Edit', + 'show_heading' => 'Fee structure', + 'show_amount_total' => 'Total amount', + 'installments_count' => ':count installment(s)', + 'show_general' => 'General information', + 'show_year' => 'Academic year', + 'show_category' => 'Fee category', + 'show_class' => 'Class concerned', + 'show_code' => 'Code', + 'show_amount_section' => 'Amount and installments', + 'installments' => 'Installments', + 'manage' => 'Manage', + 'installment_num' => 'Installment :num', + 'no_installments' => 'No installment defined', + 'show_system' => 'System information', + 'show_created_on' => 'Created on', + 'show_updated_on' => 'Last modified', + 'show_uid' => 'Unique identifier', + // Installments modal + 'modal_title' => 'Manage installments', + 'modal_desc' => 'Add or edit the installments for this fee structure.', + 'current_structure' => 'Current structure', + 'current_total' => 'Total amount:', + 'current_installments' => 'Current installments:', + 'configured_total' => 'Total of configured installments', + 'installments_total_label' => 'Total installment amount:', + 'installment_name' => 'Installment name', + 'installment_name_ph' => 'Ex: First installment', + 'installment_number_label' => 'No.', + 'installment_amount' => 'Amount', + 'add_installment' => 'Add an installment', + 'save_installments' => 'Save installments', + 'total_exceeds' => 'The installment total (:total) exceeds the structure amount (:amount)', + 'err_valid_installment' => 'Please add at least one valid installment.', + 'err_total_exceeds' => 'The installment total cannot exceed the fee structure amount.', + 'err_saving' => 'Error while saving the installments.', + ], ]; diff --git a/lang/fr/parametres.php b/lang/fr/parametres.php index 521ca92e..3d865e95 100644 --- a/lang/fr/parametres.php +++ b/lang/fr/parametres.php @@ -248,4 +248,845 @@ 'mention_label_ph' => 'Libellé (ex : Félicitations)', 'mentions_hint' => 'La mention retenue est celle dont le seuil est le plus élevé et inférieur ou égal à la moyenne.', ], + + 'subjects' => [ + 'head' => 'Matières', + 'title' => 'Matières', + 'subtitle' => 'Gérez les matières enseignées', + 'new' => 'Nouvelle matière', + 'stat_total' => 'Matières totales', + 'stat_shown' => 'Résultats affichés', + 'stat_page' => 'Page', + 'search_ph' => 'Rechercher une matière par nom ou code...', + 'search_results' => 'Résultats pour :', + 'th_code' => 'Code', + 'th_name' => 'Nom', + 'th_description' => 'Description', + 'no_description' => 'Aucune description', + 'empty' => 'Aucune matière trouvée', + 'page_showing' => 'Affichage', + 'page_to' => 'à', + 'page_of' => 'sur', + 'page_unit' => 'matières', + 'page_label' => 'Page', + 'delete_title' => 'Supprimer la matière', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette matière ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + + 'create_head' => 'Créer une matière', + 'create_title' => 'Créer une matière', + 'create_subtitle' => 'Renseignez les informations de la matière.', + 'edit_head' => 'Éditer :name', + 'edit_title' => 'Éditer une matière', + 'edit_subtitle' => 'Mettez à jour les informations de :name.', + + 'show_subtitle' => 'Détail et suivi de la matière.', + 'info_section' => 'Informations de la matière', + 'description' => 'Description', + 'show_no_description' => 'Aucune description renseignée pour cette matière.', + 'history' => 'Historique', + 'created_on' => 'Créée le', + 'updated_on' => 'Dernière modification', + 'summary' => 'Résumé', + 'summary_before' => 'La matière', + 'summary_middle' => 'est identifiée par le code', + 'summary_stats' => 'Les statistiques d\'utilisation seront affichées ici dès qu\'elles seront disponibles.', + 'edit_this' => 'Modifier cette matière', + + 'form_section' => 'Informations de la matière', + 'code_label' => 'Code *', + 'code_ph' => 'Ex: MATH101', + 'code_hint' => 'Code unique utilisé pour identifier la matière.', + 'name_label' => 'Nom *', + 'name_ph' => 'Ex: Mathématiques', + 'parent_label' => 'Matière parente (sous-matière)', + 'no_parent' => 'Aucune (matière principale)', + 'parent_hint' => 'Rattachez cette matière à une matière principale pour en faire une sous-matière (ex. « Dictée » sous « Français »).', + 'description_label' => 'Description', + 'description_ph' => 'Décrivez brièvement le contenu et les objectifs de la matière...', + 'description_hint' => 'Optionnel, maximum 1000 caractères.', + 'preview' => 'Aperçu', + 'preview_code' => 'CODE', + 'preview_name' => 'Nom de la matière', + 'submit_create' => 'Créer la matière', + ], + + 'fee_categories' => [ + 'head' => 'Catégories de frais', + 'title' => 'Catégories de frais', + 'subtitle' => 'Gérez les catégories de frais scolaires', + 'new' => 'Nouvelle catégorie', + 'stat_total' => 'Catégories totales', + 'search_ph' => 'Rechercher par nom ou description...', + 'th_name' => 'Nom', + 'th_description' => 'Description', + 'th_created' => 'Date de création', + 'empty' => 'Aucune catégorie trouvée', + 'delete_title' => 'Supprimer la catégorie', + 'delete_desc' => 'Cette action ne peut pas être annulée. Êtes-vous sûr de vouloir supprimer cette catégorie ?', + 'deleting' => 'Suppression...', + + 'create_head' => 'Nouvelle catégorie de frais', + 'create_title' => 'Créer une catégorie de frais', + 'edit_head' => 'Modifier la catégorie de frais', + 'edit_title' => 'Modifier la catégorie de frais', + 'identity' => 'Identité de la catégorie', + 'name_label' => 'Nom *', + 'name_ph' => 'Ex: Frais de scolarité, Frais de cantine...', + 'description' => 'Description', + 'description_ph' => 'Décrivez cette catégorie de frais...', + 'create' => 'Créer', + + 'show_head' => 'Catégorie : :name', + 'show_title' => 'Détail de la catégorie', + 'name' => 'Nom', + 'created_on' => 'Créée le', + 'show_no_description' => 'Aucune description fournie', + 'updated_on' => 'Dernière modification', + 'id' => 'ID', + 'delete_desc_show' => 'Cette action ne peut pas être annulée. Êtes-vous sûr de vouloir supprimer cette catégorie de frais ?', + ], + + 'classroom_types' => [ + 'head' => 'Types de classes', + 'title' => 'Types de classes', + 'subtitle' => 'Gérez les types de classes disponibles', + 'new' => 'Nouveau type', + 'stat_total' => 'Total des types', + 'stat_active' => 'Types actifs', + 'stat_page' => 'Page', + 'search_ph' => 'Rechercher un type...', + 'reset' => 'Réinitialiser', + 'th_name' => 'Nom', + 'th_description' => 'Description', + 'th_status' => 'État', + 'empty' => 'Aucun type trouvé', + 'active' => '✓ Actif', + 'inactive' => 'Inactif', + 'page_showing_before' => 'Affichage de', + 'page_showing_to' => 'à', + 'page_showing_on' => 'sur', + 'page_unit' => 'types', + 'page_label' => 'Page', + 'page_of' => 'sur', + 'delete_title' => 'Supprimer le type', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer ce type de classe ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + + 'create_head' => 'Nouveau type de classe', + 'create_title' => 'Créer un type de classe', + 'create_subtitle' => 'Renseignez les informations du type.', + 'edit_head' => 'Éditer :name', + 'edit_title' => 'Éditer un type de classe', + 'edit_subtitle' => 'Mettez à jour les informations de :name.', + + 'show_status' => 'État', + 'show_active' => '✓ Actif', + 'show_inactive' => 'Inactif', + 'linked_classrooms' => 'Classes associées', + 'created_on' => 'Créé le', + 'updated_on' => 'Dernière modification', + 'classes_using' => 'Classes utilisant ce type', + 'classes_using_sub' => 'Affichage de toutes les classes assignées à ce type', + 'no_classroom' => 'Aucune classe n\'utilise ce type pour le moment', + 'create_classroom' => 'Créer une classe', + 'cr_name' => 'Nom', + 'cr_code' => 'Code', + 'cr_capacity' => 'Capacité', + 'cr_status' => 'État', + 'cr_action' => 'Action', + 'cr_places' => ':n places', + 'cr_active' => '✓ Active', + 'cr_inactive' => 'Inactive', + 'cr_view' => 'Voir', + + 'form_section' => 'Informations du type', + 'name_label' => 'Nom *', + 'name_ph' => 'Ex: Classe générale', + 'description_label' => 'Description', + 'description_ph' => 'Description du type de classe...', + 'period_label' => 'Système de périodes *', + 'period_trimestre' => 'Trimestre (3 périodes)', + 'period_semestre' => 'Semestre (2 périodes)', + 'period_hint' => 'Détermine le découpage de l\'année (bulletins, évaluations) pour ce type de classe.', + 'status_section' => 'Statut', + 'active_label' => 'Type actif', + 'submit_create' => 'Créer le type', + ], + + 'scholarships' => [ + 'head' => 'Bourses', + 'title' => 'Bourses', + 'subtitle' => 'Gérez les réductions de frais de scolarité', + 'new' => 'Nouvelle bourse', + 'stat_total' => 'Bourses totales', + 'stat_percentage' => 'Bourses en %', + 'stat_fixed' => 'Montants fixes', + 'search_ph' => 'Rechercher une bourse...', + 'search_results' => 'Résultats pour :', + 'th_name' => 'Nom', + 'th_type' => 'Type', + 'th_value' => 'Valeur', + 'th_created' => 'Date de création', + 'empty' => 'Aucune bourse trouvée', + 'type_percentage' => 'Pourcentage', + 'type_fixed' => 'Montant fixe', + 'page_showing' => 'Affichage', + 'page_to' => 'à', + 'page_of' => 'sur', + 'page_unit' => 'bourses', + 'page_label' => 'Page', + 'delete_title' => 'Supprimer la bourse', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette bourse ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + + 'create_head' => 'Créer une bourse', + 'create_title' => 'Créer une nouvelle bourse', + 'edit_head' => 'Modifier :name', + 'edit_title' => 'Modifier :name', + 'form_section' => 'Informations de la bourse', + 'name_label' => 'Nom *', + 'name_ph' => 'Ex: Bourse d\'excellence', + 'type_label' => 'Type *', + 'type_ph' => 'Sélectionner un type', + 'value_label_pct' => 'Valeur (%) *', + 'value_label_fixed' => 'Valeur (montant) *', + 'value_ph_pct' => 'Ex: 15', + 'value_ph_fixed' => 'Ex: 100.00', + 'description' => 'Description', + 'description_ph' => 'Décrivez la bourse...', + 'submit_create' => 'Créer la bourse', + + 'show_value' => 'Valeur', + 'show_description' => 'Description', + 'show_no_description' => 'Aucune description disponible', + 'history' => 'Historique', + 'created_on' => 'Créée le', + 'updated_on' => 'Dernière modification', + 'summary' => 'Résumé', + 'current_value' => 'Valeur actuelle', + ], + + 'bulletin_templates' => [ + 'head' => 'Modèle de bulletin', + 'title' => 'Modèle de bulletin', + 'subtitle_before' => 'Composez les colonnes du bulletin de :name. Le jeton', + 'subtitle_after' => 'devient « Trim. » ou « Sem. » selon le type de classe.', + 'load_preset' => 'Charger un preset…', + 'saving' => 'Enregistrement…', + 'columns' => 'Colonnes (:n)', + 'total_width' => 'Largeur totale : :w%', + 'default_column' => 'Colonne', + 'label_ph' => 'Libellé', + 'type_prefix' => 'Type : :name', + 'add_column' => 'Ajouter une colonne', + 'footer' => 'Pied de bulletin', + 'opt_class_stats' => 'Afficher les statistiques de la classe (moyenne la plus forte / faible / générale)', + 'opt_period_recap' => 'Afficher le récapitulatif inter-périodes + moyenne annuelle', + 'opt_discipline' => 'Afficher le bloc discipline (retards, absences, décision du conseil)', + 'signatory_left' => 'Signataire (gauche)', + 'signatory_right' => 'Signataire (droite)', + 'legal_note' => 'Mention légale (N.B.)', + ], + + 'file_storage' => [ + 'head' => 'Fichiers & Stockage', + 'title' => 'Fichiers & Stockage', + 'subtitle' => 'Configurez où les fichiers uploadés (logos, documents) seront stockés.', + 'toast_saved_title' => 'Configuration sauvegardée', + 'toast_saved_desc' => 'Les paramètres de stockage ont été mis à jour.', + 'toast_error_title' => 'Erreur', + 'toast_error_desc' => 'Vérifiez les champs et réessayez.', + 'toast_test_ok_title' => 'Connexion réussie', + 'toast_test_ok_desc' => 'Le disque ":driver" est accessible et fonctionnel.', + 'toast_test_fail_title' => 'Connexion échouée', + 'toast_unknown_error' => 'Erreur inconnue.', + 'toast_unreachable' => 'Impossible de joindre le stockage.', + 'driver_local' => 'Stockage local', + 'driver_local_desc' => 'Fichiers sur le serveur Laravel (public/storage)', + 'driver_s3' => 'Stockage cloud S3', + 'driver_s3_desc' => 'AWS S3, Cloudflare R2, MinIO ou compatible S3', + 's3_section' => 'Configuration S3 / Cloudflare R2', + 'access_key' => 'Access Key', + 'secret_key' => 'Secret Key', + 'keep_hint' => '(laisser vide pour conserver)', + 'bucket' => 'Bucket *', + 'region' => 'Région *', + 'region_ph' => 'auto (R2) ou eu-west-1 (AWS)', + 'endpoint' => 'Endpoint', + 'endpoint_hint' => '(R2/MinIO — laisser vide pour AWS)', + 'public_url' => 'URL publique', + 'public_url_hint' => '(CDN ou domaine custom)', + 'r2_title' => 'Cloudflare R2 (recommandé)', + 'r2_region' => '• Région :', + 'r2_endpoint' => '• Endpoint :', + 'r2_bandwidth' => '• Aucun frais de bande passante sortante (idéal Afrique)', + 'local_active' => 'Stockage local actif', + 'local_active_before' => 'Les fichiers sont stockés dans', + 'local_active_middle' => 'et servis via', + 'test_connection' => 'Tester la connexion', + 'save' => 'Enregistrer', + ], + + 'backups' => [ + 'head' => 'Sauvegardes', + 'title' => 'Sauvegardes', + 'subtitle' => 'Sauvegardez la base de données (JSON / SQL) et planifiez des sauvegardes automatiques.', + 'size_mb' => ':n Mo', + 'size_kb' => ':n Ko', + 'day_1' => 'Lundi', + 'day_2' => 'Mardi', + 'day_3' => 'Mercredi', + 'day_4' => 'Jeudi', + 'day_5' => 'Vendredi', + 'day_6' => 'Samedi', + 'day_7' => 'Dimanche', + 'dest_label' => 'Destination :', + 'dest_remote' => 'Dépôt distant (S3 / R2)', + 'dest_local' => 'Stockage local du serveur', + 'dest_remote_desc' => 'Les sauvegardes sont envoyées sur votre stockage cloud configuré.', + 'dest_local_desc' => 'Configurez un stockage S3/R2 dans « Fichiers & Stockage » pour externaliser les sauvegardes.', + 'manual_title' => 'Sauvegarder maintenant', + 'include_media' => 'Inclure les médias (documents, photos)', + 'running' => 'Sauvegarde…', + 'run_backup' => 'Lancer la sauvegarde', + 'manual_hint_before' => 'Avec les médias, la sauvegarde est produite au format', + 'manual_hint_after' => '(base + fichiers uploadés). Sinon, seule la base est sauvegardée.', + 'archive_title' => 'Archiver une année scolaire', + 'archive_desc_before' => 'Génère un instantané complet', + 'archive_desc_locked' => 'verrouillé', + 'archive_desc_after' => 'et conservé à long terme (exclu de la rétention automatique). L\'archive est aussi créée automatiquement à la clôture d\'une année.', + 'academic_year' => 'Année scolaire', + 'choose_year' => 'Choisir une année…', + 'already_archived' => ' — déjà archivée', + 'archiving' => 'Archivage…', + 'archive_year' => 'Archiver l\'année', + 'schedule_title' => 'Planification automatique', + 'frequency' => 'Fréquence', + 'freq_none' => 'Désactivée', + 'freq_daily' => 'Quotidienne', + 'freq_weekly' => 'Hebdomadaire', + 'time' => 'Heure', + 'day' => 'Jour', + 'retention' => 'Rétention (nb conservés)', + 'formats_generated' => 'Formats générés', + 'schedule_hint_before' => 'La planification nécessite que le planificateur Laravel tourne sur le serveur', + 'schedule_hint_after' => 'via cron, chaque minute).', + 'save_schedule' => 'Enregistrer la planification', + 'restore_title' => 'Restaurer la base de données', + 'restore_warn_before' => 'La restauration', + 'restore_warn_bold' => 'écrase les données actuelles', + 'restore_warn_after' => 'avec le contenu du fichier. Une sauvegarde de sécurité (JSON) est créée automatiquement avant l\'opération.', + 'restoring' => 'Restauration…', + 'restore' => 'Restaurer', + 'restore_one_table' => 'Restaurer une seule table (optionnel)', + 'all_tables' => 'Toute la base', + 'restore_table_hint_before' => 'La restauration ciblée par table n\'est disponible qu\'avec les fichiers', + 'restore_table_hint_after' => '(ou .json.gz) et n\'écrase que la table choisie.', + 'accepted_formats' => 'Formats acceptés : .json, .sql, .gz (compressé), .dump (PostgreSQL) ou .zip (base + médias) issus de cette application — max 200 Mo.', + 'history_title' => 'Historique des sauvegardes', + 'th_file' => 'Fichier', + 'th_format' => 'Format', + 'th_size' => 'Taille', + 'th_origin' => 'Origine', + 'th_status' => 'Statut', + 'th_date' => 'Date', + 'empty' => 'Aucune sauvegarde pour le moment.', + 'badge_archive' => 'Archive', + 'badge_media' => '+ médias', + 'origin_scheduled' => 'Planifiée', + 'origin_manual' => 'Manuelle', + 'status_ok' => 'OK', + 'status_fail' => 'Échec', + 'verify_integrity' => 'Vérifier l\'intégrité', + 'restore_confirm_title' => 'Confirmer la restauration ?', + 'restore_confirm_desc' => 'Toutes les données actuelles seront remplacées par le contenu de « :name ». Une sauvegarde de sécurité est créée avant. Cette action est irréversible.', + 'restore_now' => 'Restaurer maintenant', + 'delete_title' => 'Supprimer cette sauvegarde ?', + 'delete_desc' => 'Le fichier sera définitivement supprimé du stockage.', + ], + + 'academic_years' => [ + 'head' => 'Années académiques', + 'title' => 'Années académiques', + 'subtitle' => 'Gérez les années académiques', + 'new' => 'Nouvelle année', + 'stat_total' => 'Années totales', + 'stat_active' => 'Années actives', + 'stat_page' => 'Page', + 'search_ph' => 'Rechercher une année...', + 'th_year' => 'Année', + 'th_start' => 'Date de début', + 'th_end' => 'Date de fin', + 'th_status' => 'Statut', + 'status_active' => 'Active', + 'status_inactive' => 'Inactive', + 'empty' => 'Aucune année académique trouvée', + 'delete_title' => 'Confirmer la suppression', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette année académique ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + 'create_head' => 'Créer une année académique', + 'create_title' => 'Créer une nouvelle année académique', + 'edit_head' => 'Modifier :year', + 'edit_title' => 'Modifier :year', + 'section_period' => 'Période académique', + 'label_year' => 'Année', + 'year_ph' => 'Ex: 2025-2026', + 'label_start' => 'Date de début', + 'label_end' => 'Date de fin', + 'section_activation' => 'Activation', + 'active_label' => 'Année active', + 'active_hint' => 'Cochez cette case si c\'est l\'année académique en cours', + 'submit_create' => 'Créer l\'année académique', + 'info_title' => 'Informations de l\'année académique', + 'field_status' => 'Statut', + 'field_status_active' => 'Active', + 'field_status_inactive' => 'Inactive', + 'period_title' => 'Période', + 'period_from' => 'Du', + 'period_to' => 'Au', + 'history_title' => 'Historique', + 'stats_title' => 'Statistiques', + 'stats_classes' => 'Classes', + 'stats_students' => 'Étudiants inscrits', + 'stats_teachers' => 'Enseignants', + 'state_title' => 'État', + 'state_active_title' => 'Année en cours', + 'state_active_desc' => 'Cette année est actuellement active', + 'state_inactive_title' => 'Année inactive', + 'state_inactive_desc' => 'Cette année n\'est pas active', + ], + + 'academic_periods' => [ + 'head' => 'Périodes académiques', + 'title' => 'Périodes académiques', + 'subtitle' => 'Gérez les périodes académiques (trimestres et semestres)', + 'new' => 'Nouvelle période', + 'stat_total' => 'Périodes totales', + 'stat_active' => 'Périodes actives', + 'stat_page' => 'Page', + 'search_ph' => 'Rechercher une période...', + 'th_name' => 'Nom', + 'th_year' => 'Année', + 'th_type' => 'Type', + 'th_order' => 'Ordre', + 'th_period' => 'Période', + 'th_status' => 'Statut', + 'type_trimester' => 'Trimestre', + 'type_semester' => 'Semestre', + 'status_active' => 'Active', + 'status_inactive' => 'Inactive', + 'empty' => 'Aucune période académique trouvée', + 'delete_title' => 'Confirmer la suppression', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette période académique ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + 'create_head' => 'Créer une période académique', + 'create_title' => 'Créer une période académique', + 'create_subtitle' => 'Définissez les informations de la nouvelle période.', + 'edit_head' => 'Modifier :name', + 'edit_title' => 'Modifier la période', + 'section_identification' => 'Identification', + 'label_name' => 'Nom', + 'name_ph' => 'Ex: Trimestre 1, Semestre 1...', + 'label_year' => 'Année académique', + 'year_ph' => 'Sélectionner une année', + 'section_classification' => 'Classification', + 'label_type' => 'Type', + 'label_order' => 'Ordre', + 'order_ph' => '1, 2, 3...', + 'label_class_type' => 'Type de classe', + 'class_type_all' => 'Toutes les classes (global)', + 'class_type_hint' => 'Laisser « global » pour appliquer à tous les types de classe.', + 'label_weight' => 'Poids (moyenne annuelle)', + 'section_calendar' => 'Calendrier', + 'label_start' => 'Date de début', + 'label_end' => 'Date de fin', + 'section_details' => 'Détails & Statut', + 'label_description' => 'Description', + 'description_ph' => 'Description de la période...', + 'active_label' => 'Période active (en cours)', + 'submit_create' => 'Créer la période', + 'saving' => 'Enregistrement...', + 'submit_update' => 'Enregistrer les modifications', + 'info_title' => 'Informations de la période', + 'system_title' => 'Informations système', + 'label_id' => 'Identifiant', + 'about_title' => 'À propos', + 'about_desc' => 'Les périodes académiques permettent de diviser l\'année scolaire en trimestres ou semestres pour organiser l\'évaluation et le suivi des élèves.', + ], + + 'classrooms' => [ + 'head' => 'Classes', + 'title' => 'Classes', + 'subtitle' => 'Gérez les classes de votre établissement', + 'new' => 'Nouvelle classe', + 'stat_total' => 'Total des classes', + 'stat_active' => 'Classes actives', + 'stat_page' => 'Page', + 'search_ph' => 'Rechercher une classe...', + 'reset' => 'Réinitialiser', + 'th_name' => 'Nom', + 'th_code' => 'Code', + 'th_type' => 'Type', + 'th_capacity' => 'Capacité', + 'empty' => 'Aucune classe trouvée', + 'assign_subjects' => 'Attribuer des matières', + 'showing_sep' => 'sur', + 'showing_unit' => 'classes', + 'delete_title' => 'Supprimer la classe', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette classe ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + 'create_head' => 'Nouvelle classe', + 'create_title' => 'Créer une classe', + 'create_subtitle' => 'Renseignez les informations de la classe.', + 'edit_head' => 'Éditer :name', + 'edit_title' => 'Éditer une classe', + 'edit_subtitle' => 'Mettez à jour les informations de :name.', + 'form_info' => 'Informations de la classe', + 'label_name' => 'Nom', + 'name_ph' => 'Ex: 6e A', + 'label_code' => 'Code', + 'code_ph' => 'Ex: 6A-2026', + 'label_capacity' => 'Capacité', + 'label_expected_age' => 'Âge attendu', + 'expected_age_ph' => 'Ex. 12', + 'expected_age_hint' => 'Âge officiel attendu (base du calcul de sur-âge).', + 'label_type' => 'Type de classe', + 'type_none' => 'Aucun type', + 'preview' => 'Aperçu', + 'preview_text_before' => 'Cette classe accueillera jusqu\'à', + 'preview_text_after' => 'élèves.', + 'submit_create' => 'Créer la classe', + 'creating' => 'Création...', + 'show_code' => 'Code', + 'show_capacity' => 'Capacité', + 'show_capacity_hint' => 'places disponibles', + 'show_type' => 'Type de classe', + 'show_created_on' => 'Créée le', + 'show_updated_on' => 'Modifiée le', + 'subjects_title' => 'Matières et Coefficients', + 'subjects_summary' => ':n matière(s) • Total des coefficients : :total', + 'select_year_ph' => 'Sélectionner une année', + 'coef' => 'Coef.', + 'no_assignments' => 'Aucune matière assignée pour cette année académique', + // Attributions + 'assign_head' => 'Attributions - :name', + 'assign_title' => 'Attribuer des matières', + 'assign_class_before' => 'Classe :', + 'assign_year_section' => 'Année académique', + 'assign_year_ph' => 'Sélectionnez une année académique', + 'assign_subjects_section' => 'Matières et coefficients', + 'assign_search_ph' => 'Rechercher une matière...', + 'assign_coef_ph' => 'Coef', + 'assign_selected_count' => ':n matière(s) sélectionnée(s)', + 'assign_submit' => 'Enregistrer les attributions', + 'assign_saving' => 'Enregistrement...', + 'err_year_required' => 'L\'année académique est requise.', + 'err_subjects_required' => 'Veuillez sélectionner au moins une matière.', + 'err_coef_invalid' => 'Coefficient invalide (doit être > 0).', + ], + + 'documents' => [ + // Index + 'head' => 'Modèles de documents', + 'title' => 'Modèles de documents', + 'subtitle' => 'Gérez les modèles de certificats, attestations et bulletins exportables en PDF.', + 'btn_header' => 'En-tête', + 'btn_registry' => 'Registre', + 'btn_new' => 'Nouveau modèle', + 'cat_empty' => 'Aucun modèle dans cette catégorie.', + 'badge_default' => 'Défaut', + 'status_active' => '● Actif', + 'status_inactive' => '● Inactif', + 'delete_title' => 'Supprimer ce modèle ?', + 'delete_desc' => 'Cette action est irréversible. Les documents déjà émis ne sont pas affectés.', + // Registry + 'registry_head' => 'Registre des documents', + 'registry_title' => 'Registre des documents', + 'registry_subtitle' => 'Traçabilité de tous les documents délivrés (:n).', + 'registry_search_ph' => 'N° de référence, nom ou matricule de l\'élève...', + 'registry_th_ref' => 'Référence', + 'registry_th_doc' => 'Document', + 'registry_th_student' => 'Élève', + 'registry_th_issuer' => 'Délivré par', + 'registry_th_date' => 'Date', + 'registry_empty' => 'Aucun document délivré.', + // Show + 'cat_certificat' => 'Certificat', + 'cat_attestation' => 'Attestation', + 'cat_bulletin' => 'Bulletin', + 'show_features' => 'Caractéristiques', + 'show_type' => 'Type', + 'show_orientation' => 'Orientation', + 'show_signatory' => 'Signataire', + 'orientation_portrait' => 'Portrait', + 'orientation_landscape' => 'Paysage', + 'flag_header' => 'En-tête officiel', + 'flag_signature' => 'Bloc signature', + 'show_default' => 'Modèle par défaut', + 'show_active' => 'Actif', + 'show_inactive' => 'Inactif', + 'show_sample_note' => 'L\'aperçu utilise des données d\'exemple. Les variables seront remplacées par les informations réelles de l\'élève à la génération.', + 'show_preview' => 'Aperçu du document', + // Edit + 'edit_head' => 'Modifier le modèle', + 'create_head' => 'Nouveau modèle', + 'edit_title' => 'Modifier le modèle', + 'create_title' => 'Nouveau modèle de document', + 'edit_subtitle' => 'Configurez le document et son contenu avec variables dynamiques.', + 'toast_saved_title' => 'Enregistré', + 'toast_saved_desc' => 'Modèle sauvegardé.', + 'toast_error_title' => 'Erreur', + 'toast_error_desc' => 'Vérifiez les champs.', + 'toast_preview_error' => 'Prévisualisation impossible.', + 'label_category' => 'Catégorie', + 'label_type' => 'Type', + 'type_ph' => 'Choisir un type', + 'label_name' => 'Nom du modèle', + 'name_ph' => 'Ex: Certificat de scolarité standard', + 'label_description' => 'Description', + 'description_ph' => 'Usage du modèle (optionnel)', + 'label_source' => 'Source du corps', + 'label_layout' => 'Mise en page prédéfinie', + 'layout_ph' => 'Choisir une mise en page', + 'layout_hint' => 'Mise en page fournie par l\'application (logique, tableaux). En-tête, signature et filigrane de l\'école restent appliqués.', + 'label_content' => 'Contenu du document', + 'content_tip' => 'Astuce : placez le curseur puis cliquez une variable à droite pour l\'insérer.', + 'variables_title' => 'Variables disponibles', + 'insert_var' => 'Insérer :var', + 'options_title' => 'Mise en page', + 'label_orientation' => 'Orientation', + 'label_signatory' => 'Titre du signataire', + 'signatory_ph' => 'Le Directeur', + 'opt_header' => 'En-tête officiel (logo, terme, devise)', + 'opt_signature' => 'Bloc signature', + 'opt_default' => 'Modèle par défaut pour ce type', + 'opt_active' => 'Actif', + 'btn_preview' => 'Prévisualiser', + 'preview_sample_title' => 'Aperçu (données d\'exemple)', + // HeaderDesigner + 'hd_head' => 'En-tête des documents', + 'hd_title' => 'En-tête des documents', + 'hd_subtitle' => 'Composez l\'en-tête utilisé pour les certificats, attestations et bulletins. Glissez les blocs pour les positionner.', + 'hd_reset' => 'Réinitialiser', + 'hd_saving' => 'Enregistrement…', + 'hd_preset_label' => 'Modèle d\'en-tête', + 'hd_watermark_both' => 'Le filigrane s\'applique aux deux modèles.', + 'hd_ministerial_title' => 'En-tête ministériel (officiel)', + 'hd_ministerial_p1' => 'L\'en-tête à trois colonnes (Ministère & établissement · logo · République & devise) est généré automatiquement à partir des informations de l\'école. Le glisser-déposer est désactivé pour ce modèle.', + 'hd_ministerial_p2' => 'Pour modifier le ministère, le nom, le logo ou la devise, rendez-vous dans les réglages de l\'école.', + 'hd_add_block' => 'Ajouter un bloc', + 'hd_block_logo' => 'Logo', + 'hd_block_name' => 'Nom', + 'hd_block_motto' => 'Devise', + 'hd_block_term' => 'Terme', + 'hd_block_contact' => 'Coordonnées', + 'hd_block_text' => 'Texte', + 'hd_default_text' => 'Texte libre', + 'hd_canvas_title' => 'Aperçu (largeur A4)', + 'hd_height' => 'Hauteur', + 'hd_canvas_hint' => 'Cliquez un bloc pour le modifier, glissez-le pour le déplacer.', + 'hd_block_props' => 'Propriétés du bloc', + 'hd_select_block' => 'Sélectionnez un bloc dans l\'aperçu.', + 'hd_size_px' => 'Taille (px)', + 'hd_delete' => 'Supprimer', + 'hd_content' => 'Contenu', + 'hd_insert_var_ph' => 'Insérer une variable…', + 'hd_size' => 'Taille', + 'hd_width' => 'Largeur', + 'hd_delete_block' => 'Supprimer le bloc', + 'hd_color' => 'Couleur', + 'hd_watermark' => 'Filigrane', + 'hd_enable' => 'Activer', + 'hd_wm_text' => 'Texte', + 'hd_wm_image' => 'Image / logo', + 'hd_wm_text_ph' => 'Texte du filigrane', + 'hd_opacity' => 'Opacité : :n%', + 'hd_wm_size' => 'Taille : :n', + 'hd_rotation' => 'Rotation : :n°', + 'hd_var_note_before' => 'Les variables comme', + 'hd_var_note_after' => 'sont remplacées à la génération de chaque document.', + ], + + 'class_subjects' => [ + // Index + 'head' => 'Attribution des matières aux classes', + 'title' => 'Attribution des matières aux classes', + 'subtitle' => 'Gérez l\'attribution des matières à chaque classe', + 'new' => 'Ajouter une attribution', + 'stat_assignments' => 'Attributions', + 'stat_classes' => 'Classes couvertes', + 'search_ph' => 'Rechercher une classe ou matière...', + 'search_results' => 'Résultats pour :', + 'th_class' => 'Classe', + 'th_subjects' => 'Matières attribuées', + 'th_year' => 'Année académique', + 'coef' => 'Coef', + 'empty' => 'Aucune attribution trouvée', + 'showing' => 'Affichage :from à :to sur :total attributions', + 'page_of' => 'Page :current sur :last', + 'delete_title' => 'Confirmer la suppression', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette attribution ? Cette action est irréversible.', + 'deleting' => 'Suppression...', + // Create / Edit shared + 'create_head' => 'Assigner des matières à une classe', + 'create_title' => 'Assigner des matières à une classe', + 'create_subtitle' => 'Sélectionnez une classe, une année académique et les matières à enseigner', + 'edit_head' => 'Modifier les matières attribuées', + 'edit_title' => 'Modifier les matières attribuées', + 'edit_subtitle' => 'Mettez à jour les matières assignées à cette classe', + 'section_base' => 'Sélection de base', + 'label_class' => 'Classe', + 'class_ph' => 'Sélectionnez une classe', + 'label_year' => 'Année académique', + 'year_ph' => 'Sélectionnez une année académique', + 'section_subjects' => 'Sélection des matières et coefficients', + 'search_subjects' => 'Rechercher les matières', + 'search_subjects_ph' => 'Rechercher par nom ou code...', + 'code' => 'Code', + 'coef_ph' => 'Coef', + 'group_required' => 'Obligatoire', + 'group_optional' => 'Facultatif', + 'no_subjects' => 'Aucune matière trouvée', + 'selected_count' => ':n matière(s) sélectionnée(s) avec coefficient', + 'submit_create' => 'Attribuer les matières', + 'creating' => 'Attribution en cours...', + 'submit_update' => 'Mettre à jour', + 'updating' => 'Mise à jour en cours...', + 'err_class_required' => 'La classe est requise.', + 'err_year_required' => 'L\'année académique est requise.', + 'err_subjects_required' => 'Veuillez sélectionner au moins une matière.', + 'err_coef_invalid' => 'Coefficient invalide (doit être > 0).', + // Show + 'show_head' => 'Détails de l\'attribution', + 'show_title' => 'Détails de l\'attribution', + 'show_subtitle' => 'Informations sur l\'attribution de matière à la classe', + 'show_class' => 'Classe', + 'show_subject' => 'Matière', + 'show_name' => 'Nom', + 'show_coef' => 'Coefficient', + 'show_year' => 'Année académique', + 'show_year_label' => 'Année', + 'show_start' => 'Date de début', + 'show_end' => 'Date de fin', + 'show_tracking' => 'Informations de suivi', + 'show_created_on' => 'Créé le', + 'show_updated_on' => 'Modifié le', + ], + + 'fee_structures' => [ + // Index + 'head' => 'Structures de frais', + 'title' => 'Structures de frais', + 'subtitle' => 'Gérez les montants des frais par catégorie, classe et année académique', + 'replicate_year' => 'Répliquer une année', + 'new' => 'Nouvelle structure', + 'stat_total' => 'Montant total', + 'stat_average' => 'Montant moyen', + 'stat_classes' => 'Classes couvertes', + 'stat_categories' => 'Catégories couvertes', + 'stat_gap' => 'Écart min/max', + 'stat_gap_detail' => 'Min :min | Max :max', + 'search_ph' => 'Rechercher par catégorie, classe ou année...', + 'filter_year' => 'Année académique', + 'filter_all_years' => 'Toutes les années', + 'active_suffix' => ' (active)', + 'filter_category' => 'Catégorie', + 'filter_all_categories' => 'Toutes les catégories', + 'filter_class' => 'Classe', + 'filter_all_classes' => 'Toutes les classes', + 'filter_amount_min' => 'Montant min', + 'filter_amount_max' => 'Montant max', + 'search' => 'Rechercher', + 'reset' => 'Réinitialiser', + 'filtered_count' => ':count structure(s) filtrée(s) | Max : :max', + 'col_year' => 'Année académique', + 'col_category' => 'Catégorie', + 'col_class' => 'Classe', + 'col_amount' => 'Montant', + 'col_actions' => 'Actions', + 'empty' => 'Aucune structure de frais trouvée', + 'pagination' => 'Affichage de :from à :to sur :total résultats', + // Delete dialog + 'delete_title' => 'Confirmer la suppression', + 'delete_desc' => 'Êtes-vous sûr de vouloir supprimer cette structure de frais ? Cette action est irréversible.', + 'cancel' => 'Annuler', + 'deleting' => 'Suppression...', + 'delete' => 'Supprimer', + // Replicate dialog + 'replicate_title' => 'Répliquer les structures de frais', + 'replicate_desc' => 'Copie toutes les structures (et leurs tranches) d\'une année vers l\'année active. Les combinaisons catégorie / classe déjà présentes sont ignorées.', + 'replicate_target' => 'Année cible (active) :', + 'replicate_source' => 'Année source *', + 'replicate_source_ph' => 'Choisir l\'année à copier', + 'replicating' => 'Réplication...', + 'replicate' => 'Répliquer', + 'replicate_no_active' => 'Aucune année académique active. Activez une année avant de répliquer.', + // Create / Edit + 'create_head' => 'Nouvelle structure de frais', + 'create_title' => 'Nouvelle structure de frais', + 'create_subtitle' => 'Créez une nouvelle structure de frais pour une année académique, catégorie et classe', + 'edit_head' => 'Modifier la structure de frais', + 'edit_title' => 'Modifier la structure de frais', + 'edit_subtitle' => 'Modifiez les informations de cette structure de frais', + 'back' => 'Retour', + 'section_academic' => 'Contexte académique', + 'active_year' => 'Année académique active', + 'active_badge' => 'Active', + 'no_active_year' => 'Aucune année académique active. Activez-en une d\'abord.', + 'auto_attach' => 'La structure est automatiquement rattachée à l\'année active.', + 'field_year' => 'Année académique', + 'field_year_ph' => 'Sélectionner une année académique', + 'field_category' => 'Catégorie de frais', + 'field_category_ph' => 'Sélectionner une catégorie', + 'field_class_section' => 'Classe concernée', + 'field_class' => 'Classe', + 'field_class_ph' => 'Sélectionner une classe', + 'field_amount' => 'Montant', + 'field_amount_currency' => 'Montant (:currency)', + 'field_amount_ph' => 'Ex: 50000', + 'saving' => 'Enregistrement...', + 'save' => 'Enregistrer', + 'updating' => 'Mise à jour...', + 'update' => 'Mettre à jour', + // Show + 'show_head' => 'Détails de la structure de frais', + 'manage_installments' => 'Gérer les tranches', + 'edit' => 'Modifier', + 'show_heading' => 'Structure de frais', + 'show_amount_total' => 'Montant total', + 'installments_count' => ':count tranche(s)', + 'show_general' => 'Informations générales', + 'show_year' => 'Année académique', + 'show_category' => 'Catégorie de frais', + 'show_class' => 'Classe concernée', + 'show_code' => 'Code', + 'show_amount_section' => 'Montant et tranches', + 'installments' => 'Tranches', + 'manage' => 'Gérer', + 'installment_num' => 'Tranche :num', + 'no_installments' => 'Aucune tranche définie', + 'show_system' => 'Informations système', + 'show_created_on' => 'Créée le', + 'show_updated_on' => 'Dernière modification', + 'show_uid' => 'Identifiant unique', + // Installments modal + 'modal_title' => 'Gérer les tranches', + 'modal_desc' => 'Ajoutez ou modifiez les tranches pour cette structure de frais.', + 'current_structure' => 'Structure actuelle', + 'current_total' => 'Montant total:', + 'current_installments' => 'Tranches actuelles:', + 'configured_total' => 'Total des tranches configurées', + 'installments_total_label' => 'Montant total des tranches:', + 'installment_name' => 'Nom de la tranche', + 'installment_name_ph' => 'Ex: Première tranche', + 'installment_number_label' => 'N°', + 'installment_amount' => 'Montant', + 'add_installment' => 'Ajouter une tranche', + 'save_installments' => 'Enregistrer les tranches', + 'total_exceeds' => 'Le total des tranches (:total) dépasse le montant de la structure (:amount)', + 'err_valid_installment' => 'Veuillez ajouter au moins une tranche valide.', + 'err_total_exceeds' => 'Le total des tranches ne peut pas dépasser le montant de la structure de frais.', + 'err_saving' => 'Erreur lors de l\'enregistrement des tranches.', + ], ]; diff --git a/resources/js/components/ClassroomTypes/classroom-type-form.tsx b/resources/js/components/ClassroomTypes/classroom-type-form.tsx index a17317f9..b67801d2 100644 --- a/resources/js/components/ClassroomTypes/classroom-type-form.tsx +++ b/resources/js/components/ClassroomTypes/classroom-type-form.tsx @@ -4,6 +4,7 @@ import { Checkbox } from '@/components/ui/checkbox'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; +import { useTranslation } from '@/helpers/i18n'; export interface ClassroomTypeFormData { name: string; @@ -31,14 +32,15 @@ export function ClassroomTypeForm({ onSubmit, setData, }: Readonly) { - let submitLabel = 'Mettre à jour'; + const { t } = useTranslation(); + let submitLabel = t('parametres.common.update'); if (processing && mode === 'create') { - submitLabel = 'Création...'; + submitLabel = t('parametres.common.creating'); } else if (processing) { - submitLabel = 'Mise à jour...'; + submitLabel = t('parametres.common.updating'); } else if (mode === 'create') { - submitLabel = 'Créer le type'; + submitLabel = t('parametres.classroom_types.submit_create'); } return ( @@ -48,25 +50,25 @@ export function ClassroomTypeForm({
-

Informations du type

+

{t('parametres.classroom_types.form_section')}

- + setData('name', event.target.value)} disabled={processing} className={errors.name ? 'border-red-500 bg-red-50/40' : 'border-gray-200 bg-white focus-visible:ring-blue-500'} - placeholder="Ex: Classe générale" + placeholder={t('parametres.classroom_types.name_ph')} /> {errors.name &&

{errors.name}

}
- +