فهرست منبع

refactor(更新)
- 多语言使用json

周文健 2 ماه پیش
والد
کامیت
525a189740

+ 0 - 764
app/src/main/assets/i18n/en-US.csv

@@ -1,764 +0,0 @@
-key,type,value,
-i18n.language_name,text,English,
-abnormal,text,Abnormal,
-account_login,text,Username Login,
-action_confirm,text,Action Confirmation,
-action_confirm_content,text,Are you sure you want to perform {0}?,
-action_failed,text,Action Failed,
-action_hint,text,Action Notification,
-action_succeed,text,Action Successful,
-add_card_failed,text,Failed to Add Card,
-add_card_succeed,text,Card Added Successfully,
-add_colocker,text,Add Co-lock User ({0}),
-add_group,text,Add Group,
-add_key_failed,text,Failed to Add Key,
-add_key_succeed,text,Key Added Successfully,
-add_lock_failed,text,Failed to Add Padlock,
-add_lock_succeed,text,Padlock Added Successfully,
-add_point_failed,text,Failed to Add Isolation Point,
-add_point_succeed,text,Isolation Point Added Successfully,
-add_rfid_token_failed,text,Failed to Add RFID Tag,
-add_rfid_token_succeed,text,RFID Tag Added Successfully,
-add_role_failed,text,Failed to Add Role,
-add_role_succeed,text,Role Added Successfully,
-add_user_succeed,text,User Added Successfully,
-add_workstation_failed,text,Failed to Add Workstation,
-add_workstation_succeed,text,Workstation Added Successfully,
-admin_role_can_not_edit,text,Administrator Role Cannot Be Edited,
-admin_username,text,"Admin Account: (Numbers, Letters, 6–20 characters)",
-all,text,All,
-all_hardware_tv,text,All Hardware,
-all_job_tv,text,All Jobs,
-all_points_tv,text,All Points,
-all_quick_entrance,text,All Shortcuts,
-all_select_not_all_select,text,Select All / Deselect All,
-already_colock,text,Co-locked ({0}),
-already_uncolock,text,Co-lock Released ({0}),
-back,text,Back,
-base_info_title,text,Basic Information,
-ble_connect_fail,text,"Connection Failed, Please Retry!",
-ble_connecting,text,"Connecting, Please Wait...",
-can_not_remove_current_colocker,text,Cannot Remove Current Co-lock User,
-can_not_remove_current_locker,text,Cannot Remove Current Locker,
-cancel,text,Cancel,
-cancel_countdown,text,Cancel ({0}s),
-cancel_exception,text,Cancel Exception,
-cancel_exception_failed,text,Failed to Cancel Exception,
-cancel_exception_success,text,Exception Cancelled Successfully,
-cancel_job,text,Cancel Job,
-cancel_job_tip,text,Are you sure you want to cancel the current job?,
-capture_tip_content,text,1. The system will automatically take a photo. During the process, please ensure:
-       · Face is facing the camera
-       · Maintain an appropriate distance so the entire face fits within the left frame
-       · Adequate lighting
-       · Natural expression 
- 2. After the photo is taken, you can click the Confirm button to submit, or click the Retake button to take the photo again. 
- 3. To cancel enrollment, please click the Cancel button.,
-capture_tip_title,text,Capture Prompt,
-card_already_registration,text,Card Already Registered,
-card_code,text,Card Name,
-card_login,text,Card Login,
-card_manage_card_detail_title,text,Card Details,
-card_manage_delete_failed,text,Failed to Delete Card,
-card_manage_delete_succeed,text,Card Deleted Successfully,
-card_manage_new_card_title,text,Add New Card,
-card_manage_title,text,Card Management,
-card_nfc,text,Card NFC,
-change_to_standard,text,Switch to Standard Version,
-check_before_unlocking,text,Pre-Unlocking Check,
-check_delete_card,text,Are you sure you want to delete the selected card?,
-check_delete_job,text,Are you sure you want to delete the job?,
-check_delete_key,text,Are you sure you want to delete the selected key?,
-check_delete_lock,text,Are you sure you want to delete the selected padlock?,
-check_delete_point,text,Are you sure you want to delete the isolation point?,
-check_delete_rfid_token,text,Are you sure you want to delete the selected RFID tag?,
-check_delete_role,text,Are you sure you want to delete the role?,
-check_delete_sop,text,Are you sure you want to delete the selected SOP?,
-check_delete_user,text,Are you sure you want to delete the user?,
-check_delete_workflow_mode,text,Are you sure you want to delete the selected workflow mode?,
-check_delete_workstation,text,"Are you sure you want to delete the area ""{0}""?",
-check_device_info,text,"Detected {0} unregistered keys, {1} unregistered padlocks",
-check_key_and_lock,text,Checking Keys and Padlocks,
-check_lock_is_new_device,text,Checking if Padlock is New Device,
-check_new_key_need_register,text,New Key Detected. Register Now?,
-check_new_lock_need_register,text,New Padlock Detected. Register Now?,
-close,text,Close,
-colock,text,Co-lock,
-colock_complete,text,Co-lock Added Successfully,
-colock_failed,text,Failed to Add Co-lock,
-colocker,text,Co-lock User,
-confirm,text,Confirm,
-confirm_cancel_exception,text,Are you sure you want to cancel the exception?,
-confirm_create_lock_job,text,Confirm Creating Locking Job?,
-confirm_create_unlock_job,text,Confirm Creating Unlocking Job?,
-confirm_handle_exception,text,Are you sure you want to handle the exception?,
-confirm_to_colock,text,Should {0} confirm co-locking?,
-confirm_to_uncolock,text,Should {0} confirm releasing co-lock?,
-continue_the_ticket,text,Please Continue Completing the Work Permit,
-create_job_failed,text,Failed to Create Job,
-create_job_name,text,Job Name,
-create_job_title,text,Create New Job,
-create_sop_job_sop,text,SOP,
-create_sop_job_tip,text,"Are you sure you want to execute job ""{0}""?",
-create_sop_job_title,text,Create New SOP Job,
-create_sop_name,text,SOP Name,
-create_sop_title,text,Create New SOP,
-current_job_has_cross_job,text,Warning! Current job overlaps with another. Continue handling exception?,
-current_role_no_user,text,No Users Assigned to Current Role,
-current_slot_has_no_key,text,No Key in Current Slot,
-current_slot_has_no_lock,text,No Padlock in Current Slot,
-current_sop_has_job_in_progress,text,Current SOP Has Ongoing Job,
-current_ticket_report_lock_take_exception_tip,text,Padlock Exception Reported in Current Job. Please Return Padlock,
-current_user_has_not_face_data,text,Current User Has No Face Data,
-current_workflow_mode_error,text,Current Workflow Mode Error,
-currently_no_hardware_can_be_report,text,No Hardware Available for Reporting,
-currently_no_job_can_be_report,text,No Job Available for Reporting,
-currently_unable_to_lock_together,text,Unable to Co-lock at Current Stage,
-data_content_error,text,Data Content Error,
-data_decrypt_failed,text,Data Decryption Failed,
-data_file_is_corrupted,text,Data File Corrupted,
-data_file_not_exists,text,Data File Does Not Exist,
-date,text,{0}-{1}-{2},
-delete,text,Delete,
-delete_group,text,Delete Group,
-delete_success,text,Deleted Successfully,
-detail,text,Details,
-detect_face_tip,text,Face Detected. Capturing Soon,
-detect_port,text,Scanning Devices...,
-detect_slot,text,Detecting Slot,
-device_in_detect,text,Device Recognition in Progress,
-do_you_want_to_remove_exception,text,Are you sure you want to remove this exception?,
-doing_checking,text,Verifying...,
-doing_login,text,Logging In...,
-done_header,text,Processed,
-edit,text,Edit,
-edit_job_title,text,Job Details,
-edit_sop_job_title,text,SOP Job Details,
-edit_sop_title,text,SOP Details,
-end,text,End,
-end_job,text,End Job,
-end_time,text,End Time,
-ensure_power_isolation,text,Energy Isolation Confirmation,
-error_date_range_invalid,text,Start Time Cannot Be Later Than End Time,
-exception_data_not_exists,text,Exception Data Not Found,
-exception_description,text,Exception Description:,
-exception_description_tv,text,Exception Description,
-exception_detail_title,text,Exception Details,
-exception_info,text,Exception Information,
-exception_job,text,Exception Job:,
-exception_job_title,text,Exception Job,
-exception_lost,text,Exception Lost,
-exception_manage_title,text,Exception Management,
-exception_occurrence_time,text,Exception Occurrence Time:,
-exception_occurrence_time_header,text,Occurrence Time,
-exception_reason,text,Exception Reason,
-exception_release_time,text,Exception Release Time:,
-exception_report,text,Exception Report,
-exception_report_success,text,Exception Report Successful,
-exception_reporter,text,Reporter:,
-exception_source,text,Exception Source:,
-exception_source_tv,text,Exception Source,
-exception_status,text,Status:,
-exception_status_header,text,Exception Status,
-exception_type,text,Exception Type:,
-exception_type_header,text,Exception Type,
-exception_type_tv,text,Exception Type,
-expand_collapse,text,Expand/Collapse,
-face_can_not_process,text,"Face Recognition Engine Activation Failed, Recognition Unavailable",
-face_detected_do_login,text,"Face Detected, Logging In...",
-face_login,text,Face Login,
-face_login_failed,text,"Face Match Failed, Please Retry",
-face_login_success,text,Face Authentication Successful,
-face_not_set_tip,text,Face Data Not Set,
-face_set_tip,text,Face Data Configured,
-file_not_exists,text,File Does Not Exist,
-filter,text,Filter,
-fingerprint_add_success_tip,text,Fingerprint Data Added Successfully,
-fingerprint_code,text,Fingerprint ID,
-fingerprint_code_str,text,Fingerprint_{0},
-fingerprint_delete_confirm_tip,text,Are you sure you want to delete {0}?,
-fingerprint_delete_selected_confirm_tip,text,Are you sure you want to delete the selected fingerprint(s)?,
-fingerprint_login,text,Fingerprint Login,
-fingerprint_login_failed,text,"Fingerprint Recognition Failed, Please Retry",
-fingerprint_login_success,text,Fingerprint Authentication Successful,
-fingerprint_scan_tip,text,Please Press Fingerprint Sensor {0} Times,
-finish_job_tip,text,Are you sure you want to end the current job?,
-finish_the_job,text,End Job,
-get_key_info_fail,text,Failed to Retrieve Key Information,
-go_locking,text,Proceed to Lock,
-go_unlocking,text,Proceed to Unlock,
-group_at_least_has_one_point,text,Each Group Must Contain at Least One Point,
-group_job_in_progress,text,Group Job in Progress,
-group_name_must_not_empty,text,Group Name Cannot Be Empty,
-handle,text,Handle,
-handle_colock,text,Please Confirm to Add Co-lock,
-handle_exception,text,Handle Exception,
-handle_exception_success,text,Exception Handled Successfully,
-handle_exception_will_release_all_colock,text,Warning! Handling Exception Will Remove All Co-locks. Continue?,
-handle_failed,text,Handling Failed,
-handle_lock_take_key,text,Confirm to Take Key for Locking?,
-handle_release_colock,text,Please Confirm to Release Co-lock,
-handle_step_confirm,text,Please Confirm Completion of [{0}],
-handle_time,text,Handling Time:,
-handle_time_custom_time_range,text,Custom Range,
-handle_time_last_30_days,text,Last 30 Days,
-handle_time_last_7_days,text,Last 7 Days,
-handle_unknown,text,"Unknown Handling Type, Unable to Process",
-handle_unlock_take_key,text,Confirm to Take Key for Unlocking?,
-hardware_in_use_tv,text,Hardware In Use,
-hardware_info,text,Hardware Info: {0},
-hardware_key,text,Key,
-hardware_lock,text,Padlock,
-hardware_unknown,text,Unknown,
-has_job_in_progress,text,Job in Progress Exists,
-has_locked,text,Locked,
-has_user_in_progress_job,text,User(s) Currently in Job,
-home_overview_data_title,text,Overview Data,
-home_realtime_data_title,text,Real-time Data,
-import_str,text,Import,
-import_success,text,Import Successful,
-in_progress_job_manage_title,text,Jobs in Progress,
-init_card_registration_step_hint,text,Please Swipe Card on Reader,
-init_card_registration_step_tip,text,Identify and Register Card,
-init_device_registration_key_and_lock_complete_step_hint,text,Scan Complete,
-init_device_registration_key_and_lock_step_hint,text,Please Wait for System to Identify Keys and Padlocks,
-init_device_registration_key_and_lock_step_tip,text,Identify Keys and Padlocks,
-init_point_rfid_registration_step_hint,text,Please Scan Point RFID Tag on Reader,
-init_point_rfid_registration_step_tip,text,Identify and Register Point RFID Tag,
-init_set_admin_account_step,text,1,
-init_set_admin_account_step_hint,text,Please Set Admin Username and Password,
-init_set_admin_account_step_tip,text,Configure Admin Account,
-init_set_remote_server_step_hint,text,Please Set Server Address and Port,
-init_set_remote_server_step_tip,text,Configure Server,
-insert,text,Add,
-invalid_card,text,Invalid Card,
-invalid_user,text,User Does Not Exist,
-item_my_todo_complete_time_title,text,Completion Time:,
-item_my_todo_current_operation_title,text,Current Operation:,
-item_my_todo_current_step_title,text,Current Step:,
-item_my_todo_job_name_title,text,Related Job:,
-job_already_finished,text,This job has already been completed,
-job_canceled,text,Job canceled,
-job_card_login_failed,text,Invalid work card,
-job_card_login_success,text,Work card recognized successfully,
-job_card_not_set_tip,text,You have not set up a work card,
-job_card_scan_tip,text,Please scan your card on the reader,
-job_card_set_tip,text,Work card data has been set,
-job_create_and_execute_failed,text,Job execution failed,
-job_create_and_execute_succeed,text,Job started successfully,
-job_create_failed,text,Job save failed,
-job_create_succeed,text,Job saved successfully,
-job_execute_colocker_colock_status_title,text,Co-lock personnel status,
-job_execute_lock_status_title,text,Isolation point lock status,
-job_execute_step_description,text,Operation instructions ({0}),
-job_execute_tab_title_colock,text,Co-lock,
-job_execute_tab_title_lock,text,Lock,
-job_execute_title,text,Job Execution,
-job_finished,text,Job completed,
-job_lost,text,Job lost,
-job_manage_delete_failed,text,Failed to delete selected job,
-job_manage_delete_succeed,text,Selected job deleted successfully,
-job_manage_title,text,Job Management,
-job_name,text,Job Name,
-job_save_and_execute_tip,text,"Are you sure you want to execute job ""{0}""?",
-job_save_tip,text,"Are you sure you want to save job ""{0}""?",
-job_status,text,Job Status,
-job_workstation,text,Job Area,
-key_exception_tag,text,This key has been flagged as abnormal,
-key_in_use,text,Key is in use,
-key_info_already_exists,text,Key information already exists,
-key_is_in_failure_mode,text,Key is in failure mode,
-key_mac,text,Key MAC,
-key_manage_delete_failed,text,Failed to delete key,
-key_manage_delete_succeed,text,Key deleted successfully,
-key_manage_key_detail_title,text,Key Details,
-key_manage_new_key_title,text,Add New Key,
-key_manage_title,text,Key Management,
-key_name,text,Key Name,
-key_nfc,text,Key NFC,
-key_not_exists,text,Key does not exist,
-key_return_success,text,Key returned successfully,
-key_return_tip,text,Job ticket not completed; returning key is prohibited,
-key_take_error_tip,text,Key allocation failed; please check hardware status,
-loading_data,text,Loading data,
-loading_device,text,Loading hardware...,
-loading_msg_get_ticket_status_start,text,Reading key job ticket,
-loading_msg_return_key_start,text,"Connecting to key, please wait...",
-lock,text,Lock,
-lock_already_exists,text,Lock information already exists,
-lock_code,text,Lock Number,
-lock_exception_tag,text,This lock has been flagged as abnormal,
-lock_in_use,text,Lock is currently in use,
-lock_is_not_enough,text,Insufficient lock quantity,
-lock_key_return_tip,text,Job ticket not completed; force upload data?,
-lock_manage_delete_failed,text,Failed to delete lock,
-lock_manage_delete_succeed,text,Lock deleted successfully,
-lock_manage_lock_detail_title,text,Lock Details,
-lock_manage_new_lock_title,text,Add New Lock,
-lock_manage_title,text,Lock Management,
-lock_name,text,Lock Name,
-lock_nfc,text,Lock NFC,
-lock_status,text,Lock Status,
-lock_take_report_fail,text,Lock removal reporting failed,
-locked_points_title,text,Locked Points,
-locked_points_tv,text,Locked Points,
-locker,text,Locker,
-login,text,Login,
-login_tip,text,Please enter username and password or swipe card to login,
-loto,text,Intelligent Lock Control System,
-loto_en,text,Intelligent Lock Control System,
-manage_filter_status,text,Status,
-manage_role_function_permission,text,Function Permissions,
-member_info_title,text,Personnel Information,
-move_down,text,Move Down,
-move_up,text,Move Up,
-my_todo_title,text,My To-Do,
-navigate_to_step,text,Navigate to Step {0},
-new_device,text,New Device,
-new_group,text,New Group {0},
-new_password,text,"New Password (6-20 characters: letters, numbers, special symbols)",
-new_password_and_repeat_new_password_not_same,text,New password and repeated password do not match,
-new_password_cannot_be_the_same_as_the_old_password,text,New password cannot be the same as the old password,
-next,text,Next,
-nickname,text,Name,
-no_available_key,text,No available keys,
-no_data,text,No data,
-no_goto_step,text,No jump step,
-no_permission_to_handle,text,You do not have permission to operate the current job ticket,
-no_response_board_exists,text,Unresponsive main board exists,
-normal,text,Normal,
-not_group_can_lock,text,No group available for locking,
-not_group_can_unlock,text,No group available for unlocking,
-not_in_slot,text,Not in slot,
-not_save_tip,text,Data not saved yet. Are you sure you want to discard changes and leave this page?,
-number,text,Number:,
-old_password,text,Old Password,
-old_password_error,text,Incorrect old password,
-one_key_cancel,text,One-Click Cancel,
-one_key_handle,text,One-Click Handle,
-ongoing_job_tv,text,Ongoing Jobs,
-only_one_person_allowed,text,Only one person allowed in view,
-operation,text,Operation,
-password_and_repeat_password_not_same,text,Password and repeated password do not match,
-password_regex_tip,text,Password does not meet requirements,
-phone,text,Phone,
-please_do_colock,text,Please complete co-locking,
-please_do_uncolock,text,Please release co-locking,
-please_done_operation,text,Please complete {0} first,
-please_go_locking,text,Please proceed to locking operation,
-please_go_unlocking,text,Please proceed to unlocking operation,
-please_input_account,text,Please enter username,
-please_input_admin_username,text,Please enter admin account,
-please_input_area,text,Please enter area,
-please_input_card_code,text,Please enter work card number,
-please_input_card_nfc,text,Please enter card NFC,
-please_input_correct_phone,text,Please enter a valid phone number,
-please_input_exception_reason,text,Please enter exception reason,
-please_input_job_name,text,Please enter job name,
-please_input_key_mac,text,Please enter key MAC,
-please_input_key_name,text,Please enter key name,
-please_input_key_nfc,text,Please enter key NFC,
-please_input_key_word,text,Please enter keyword,
-please_input_lock_code,text,Please enter lock number,
-please_input_lock_nfc,text,Please enter lock NFC,
-please_input_new_password,text,Please enter new password,
-please_input_nickname,text,Please enter name,
-please_input_old_password,text,Please enter old password,
-please_input_password,text,Please enter password,
-please_input_permission_characters,text,Please enter permission characters,
-please_input_phone,text,Please enter phone number,
-please_input_point_function,text,Please enter isolation point function,
-please_input_point_name,text,Please enter isolation point name,
-please_input_remark,text,Please enter remark,
-please_input_remote_server_address,text,Please enter server address,
-please_input_repeat_new_password,text,Please repeat new password,
-please_input_repeat_password,text,Please enter repeated password,
-please_input_rfid,text,Please enter RFID tag,
-please_input_rfid_code,text,Please enter RFID code,
-please_input_rfid_tag,text,Please enter RFID tag,
-please_input_role_name,text,Please enter role name,
-please_input_sop_name,text,Please enter SOP name,
-please_input_step_description,text,Please enter step operation instructions,
-please_input_step_title,text,Please enter step title,
-please_input_step_title_short,text,Please enter step title abbreviation,
-please_input_username,text,Please enter login name,
-please_input_workstation_name,text,Please enter area name,
-please_must_select_at_least_one_point,text,You must add at least one point,
-please_press_fingerprint_again,text,Please press fingerprint again,
-please_re_press_fingerprint_again,text,Please press fingerprint again,
-please_return_key_after_locking,text,Please return key after locking operation,
-please_return_key_after_unlocking,text,Please return key after unlocking operation,
-please_scan_face,text,Please scan face,
-please_scan_fingerprint,text,Please scan fingerprint,
-please_select_area,text,Please select area,
-please_select_card,text,Please select card,
-please_select_card_username,text,Please select user name,
-please_select_colocker,text,Please select co-locker,
-please_select_exception_description,text,Please select exception description,
-please_select_exception_source,text,Please select exception source,
-please_select_exception_type,text,Please select exception type,
-please_select_flow_mode,text,Please select workflow mode,
-please_select_group,text,Please select group,
-please_select_handle_time,text,Please select handling time,
-please_select_job,text,Please select job,
-please_select_job_workstation,text,Please select job area,
-please_select_key,text,Please select key,
-please_select_lock,text,Please select lock,
-please_select_locker,text,Please select locker,
-please_select_member,text,You can select personnel to add,
-please_select_point,text,Please select isolation point,
-please_select_power_type,text,Please select power source,
-please_select_process_application,text,Please select process application,
-please_select_rfid_token,text,Please select RFID tag,
-please_select_role,text,Please select role,
-please_select_sop,text,Please select SOP,
-please_select_sop_workstation,text,Please select SOP area,
-please_select_start_time,text,Please select start time first,
-please_select_status,text,Please select status,
-please_select_step_confirm_member,text,Please select execution confirmation personnel,
-please_select_step_confirm_role,text,Please select execution confirmation role,
-please_select_step_confirm_type,text,Please select execution confirmation method,
-please_select_user,text,Please select user,
-please_select_workflow_mode,text,Please select workflow mode,
-please_select_workstation,text,Please select area,
-please_swipe_card,text,Please swipe card,
-please_take_out_ready_device_first,text,Please remove devices with activated card locks first,
-please_wait_ticket_name_lock_complete,text,Please wait for [{0}] to complete locking,
-point_detail,text,Point Details,
-point_in_use,text,Point is in use and cannot be modified,
-point_info_title,text,Point Information,
-point_list_title,text,Point List,
-point_manage_add_title,text,Add Point,
-point_manage_delete_failed,text,Unable to delete isolation point,
-point_manage_delete_succeed,text,Isolation point deleted successfully,
-point_manage_point_function,text,Isolation Point Function,
-point_manage_point_group,text,Group Name,
-point_manage_point_name,text,Isolation Point Name,
-point_manage_point_power_type,text,Power Source,
-point_manage_rfid,text,RFID,
-point_manage_rfid_tag,text,RFID Tag,
-point_manage_title,text,Point Management,
-point_manage_update_title,text,Edit Point,
-point_manage_workstation,text,Area,
-point_name_tv,text,Isolation Point,
-power_isolation_way,text,Confirm Isolation Method,
-preset_workflow_can_not_delete,text,Preset workflow mode cannot be deleted,
-previous,text,Previous,
-process_application_tv,text,Process Application,
-quick_entrance_most_set_tip,text,A maximum of 8 shortcuts can be set,
-quick_entrance_title,text,Shortcut Configuration,
-re_recognize,text,Re-recognize,
-real_person_verification_required,text,Please ensure real-person operation,
-recapture,text,Retake,
-recognize_work_content,text,Recognize Work Content,
-recognized_card_rfid,text,Recognized Card RFID,
-recognized_point_rfid,text,Recognized Point RFID,
-reduce_colocker,text,Reduce co-locker ({0}),
-register_failed,text,Registration failed,
-register_success,text,Registration succeeded,
-release_colocker,text,Release Co-locking,
-remark,text,Remark,
-repeat_new_password,text,"Repeat New Password (6-20 characters: letters, numbers, special symbols)",
-repeat_password,text,"Repeat Password (6-20 characters: letters, numbers, special symbols)",
-reset,text,Reset,
-reset_data_tv,text,Click to reset,
-reset_password_title,text,Reset Password,
-reset_user_password_failed,text,User password reset failed,
-reset_user_password_succeed,text,User password reset succeeded,
-restart_app_after_set,text,App will restart after settings are applied,
-rfid,text,RFID Tag,
-rfid_already_bind,text,This RFID tag is already bound,
-rfid_already_registration,text,RFID tag already registered,
-rfid_code,text,RFID Code,
-rfid_in_use,text,"RFID tag in use, cannot modify",
-rfid_name,text,RFID Number,
-rfid_token_manage_delete_failed,text,RFID tag deletion failed,
-rfid_token_manage_delete_succeed,text,RFID tag deleted successfully,
-rfid_token_manage_new_rfid_token_title,text,Add RFID Tag,
-rfid_token_manage_rfid_token_detail_title,text,RFID Tag Details,
-rfid_token_manage_title,text,RFID Management,
-role_in_preset_tip,text,Preset roles cannot be deleted,
-role_in_use,text,Role is in use in current jobs,
-role_key_already_exists,text,Role permission characters already exist,
-role_manage_add_title,text,Add Role,
-role_manage_delete_failed,text,Unable to delete role,
-role_manage_delete_succeed,text,Role deleted successfully,
-role_manage_permission_string,text,Permission Characters,
-role_manage_role_name,text,Role Name,
-role_manage_role_num,text,Role Number,
-role_manage_title,text,Role Management,
-save,text,Save,
-save_and_execute,text,Save and Execute,
-save_sop_check,text,Generate SOP,
-save_success,text,Saved successfully!,
-scan_complete_app_restarting,text,"Scan complete, app will restart automatically",
-select,text,Select,
-select_colocker_tip,text,Please select co-locker from the following personnel,
-select_coloker,text,Please select co-locker,
-select_group_tip,text,Click empty space in group to select,
-select_locker,text,Select Locker,
-select_locker_tip,text,Please select [{0}] as locker from the following personnel,
-select_member_title,text,Select Personnel,
-select_point_title,text,Select Point,
-selected_point_already_in_use,text,Some selected points are already in use,
-selected_point_info_title,text,Selected Point Information,
-selected_quick_entrance,text,"Configured Shortcuts (up to 8, draggable)",
-selected_rfid_in_use,text,Some selected RFID tags are in use,
-send_ticket_fail,text,Job ticket issuance failed,
-sending_ticket,text,Sending job ticket...,
-server_address,text,Server Address,
-server_address_error,text,Server address error,
-set_colocker,text,Set Co-locker,
-set_data_tv,text,Click to set,
-set_face_title,text,Set Face,
-set_fingerprint_title,text,Set Fingerprint,
-set_job_card_title,text,Set Job Card,
-set_locker,text,Set Locker,
-set_password,text,"Set Password (6-20 characters: letters, numbers, special symbols)",
-settings,text,Settings,
-show_member_when_selected_sop,text,Personnel information will be displayed automatically after selecting SOP,
-show_points_when_selected_sop,text,Point information will be displayed automatically after selecting SOP,
-shutdown,text,Shutdown,
-ski_step,text,Skip this step,
-skip_and_complete,text,Skip and Complete,
-slot_exception_tag,text,This lock slot has been marked as abnormal,
-slots_exception_report,text,Slot Exception Report,
-slots_manage_title,text,Slot Management,
-sop_create_failed,text,SOP creation failed,
-sop_create_succeed,text,SOP created successfully,
-sop_job_save_and_execute_failed,text,SOP job execution failed,
-sop_job_save_and_execute_succeed,text,SOP job started successfully,
-sop_job_save_failed,text,SOP job save failed,
-sop_job_save_succeed,text,SOP job saved successfully,
-sop_manage_delete_failed,text,Unable to delete selected SOP,
-sop_manage_delete_succeed,text,Selected SOP deleted successfully,
-sop_manage_sop_name,text,SOP Name,
-sop_manage_title,text,SOP Management,
-sop_manage_workstation,text,Workstation,
-sop_save_failed,text,SOP save failed,
-sop_save_succeed,text,SOP saved successfully,
-sop_save_tip,text,"Are you sure you want to save ""{0}""?",
-sop_workstation,text,SOP Area,
-start,text,Start,
-start_detect_key_slot,text,Start detecting key slot,
-start_detect_lock_slot,text,Start detecting lock slot,
-start_scan_key_mac,text,Start scanning key information,
-start_time,text,Start Time,
-end_time_must_large_then_start_time,text,End time must be later than start time,
-start_tip,text,Initialize the system according to the instructions,
-start_to_send_ticket,text,Start sending job ticket...,
-status,text,Status,
-step_confirm_failed,text,Step confirmation failed,
-take_out_key,text,Please take out the key,
-take_out_key_tip,text,Please take the key from the opened key slot,
-take_out_lock_tip,text,"Please take the lock from the opened lock slot, {0} remaining",
-take_out_rest_locks,text,Please take out remaining locks with activated card locks,
-tec_support,text,"Wenzhou Doctor Safety Products Co., Ltd.",
-the_verification_file_not_exists,text,Verification file does not exist,
-ticket_data_error,text,Job ticket data corrupted,
-ticket_get_failed,text,Failed to obtain job ticket,
-ticket_lost,text,Job ticket does not exist,
-time_frame_tv,text,Time Range,
-todo_header,text,In Progress,
-turn_off,text,Off,
-turn_on,text,On,
-turn_read,text,Read,
-uncolock_complete,text,Co-lock release successful,
-uncolock_failed,text,Co-lock release failed,
-unlock,text,Unlock,
-unlock_and_restore_switch,text,Unlock and restore switch,
-unzip,text,Unzipping… {0},
-update_card_failed,text,Update card failed,
-update_card_succeed,text,Card updated successfully,
-update_key_failed,text,Update key failed,
-update_key_succeed,text,Key updated successfully,
-update_lock_failed,text,Update lock failed,
-update_lock_succeed,text,Lock updated successfully,
-update_point_failed,text,Save point failed,
-update_point_succeed,text,Point saved successfully,
-update_rfid_token_failed,text,Update RFID tag failed,
-update_rfid_token_succeed,text,RFID tag updated successfully,
-update_role_failed,text,Role update failed,
-update_role_succeed,text,Role updated successfully,
-update_user_failed,text,User update failed,
-update_user_succeed,text,User updated successfully,
-update_workstation_failed,text,Update area failed,
-update_workstation_succeed,text,Area updated successfully,
-user_already_exists,text,User already exists,
-user_info_title,text,Personal Information,
-user_manage_area,text,Area,
-user_manage_card_code,text,Job Card,
-user_manage_delete_failed,text,Unable to delete user,
-user_manage_delete_succeed,text,User deleted successfully,
-user_manage_filter_activate,text,Active,
-user_manage_filter_deactivate,text,Inactive,
-user_manage_filter_title,text,Filter Criteria,
-user_manage_new_user_title,text,Add User,
-user_manage_role,text,Role,
-user_manage_title,text,User Management,
-user_manage_user_detail_title,text,User Details,
-user_manage_view,text,View,
-user_name,text,Login Name,
-username,text,Username,
-username_or_password_error,text,Incorrect username or password,
-username_passowrd_login_success,text,Username and password verified successfully,
-username_password_not_exists,text,Username or password does not exist,
-username_regex_tip,text,Username does not meet requirements,
-verify_failed,text,Verification failed,
-view,text,View,
-wait_header,text,Waiting,
-wait_to_colock,text,Pending co-lock ({0}),
-warn,text,Warning,
-welcome_tip,text,"Hello, welcome",
-workflow_already_exists,text,Workflow mode already exists,
-workflow_manage_title,text,Workflow Mode Management,
-workflow_mode,text,Workflow Mode,
-workflow_mode_manage_delete_succeed,text,Workflow mode deleted successfully,
-workflow_mode_status_update_failed,text,Status update failed,
-workflow_mode_status_update_succeed,text,Status updated successfully,
-workflow_name,text,Workflow Mode Name,
-workflow_setting,text,Workflow Settings,
-workflow_step_confirm_member,text,Execution confirmation personnel,
-workflow_step_confirm_role,text,Execution confirmation role,
-workflow_step_confirm_type,text,Execution confirmation method,
-workflow_step_description,text,Step Instructions,
-workflow_step_function,text,Step Function,
-workflow_step_title,text,Step Title,
-workflow_step_title_short,text,Step Title Abbreviation,
-workstation_already_exists,text,Area already exists,
-workstation_is_in_bottom,text,Area is already at the bottom,
-workstation_is_in_top,text,Area is already at the top,
-workstation_manage_delete_failed,text,Unable to delete area "{0}",
-workstation_manage_delete_succeed,text,Area "{0}" deleted successfully,
-workstation_manage_new_workstation,text,Add Area,
-workstation_manage_title,text,Area Management,
-workstation_manage_workstation_name,text,Area Name,
-you_are_not_locker_tip,text,You are not the locker and cannot perform this operation,
-zone,text,Area Range,
-backup_title,text,Backup/Restore
-backup,text,Backup
-backup_path,text,Backup Path
-maximum_number_of_backups,text,Maximum Number of Backups
-auto_backup,text,Auto Backup
-common_enable,text,Enable
-common_disable,text,Disable
-backup_frequency,text,Backup Frequency
-backup_time,text,Backup Time
-backup_tip,text,Note: The app must remain running during auto backup.
-backup_now,text,Backup Now
-backup_range,text,Range: {0}
-restore,text,Restore
-common_batch_export,text,Batch Export
-common_batch_delete,text,Batch Delete
-common_export,text,Export
-MON,text,Monday
-TUE,text,Tuesday
-WED,text,Wednesday
-THU,text,Thursday
-FRI,text,Friday
-SAT,text,Saturday
-SUN,text,Sunday
-backup_frequency_every_day,text,Every Day
-please_select_backup_frequency,text,Please select a backup frequency
-maximumNumberOfBackupsNotCorrect,text,Please enter a valid maximum number of backups
-please_select_time,text,Please select a time
-backup_now_please_wait,text,Backing up, please wait…
-backup_success,text,Backup Successful
-backup_failed,text,Backup Failed
-delete_backup_file_confirm,text,Are you sure you want to delete this backup? Once deleted, it cannot be recovered.
-delete_selected_backup_file_confirm,text,Are you sure you want to delete the selected backups? Once deleted, they cannot be recovered.
-restore_backup_confirm,text,Restoring a backup will erase all data from the backup date to now. Are you sure you want to continue?
-restore_backup_success,text,Backup restored successfully
-export_success,text,Export Successful
-no_backup_data,text,No backup data available
-loading_backup,text,Reading backup file…
-max_backup_tip,text,The maximum number of backups has been reached. Continuing will remove the oldest backup.
-switch,text,Switch
-backup_restoring,text,Restoring backup…
-point_manage_switch_icon,text,Switch Icon
-user_manage,text,User Management
-role_manage,text,Role Management
-workstation_manage,text,Area Management
-point_manage,text,Point Management
-backup_and_restore,text,Backup / Restore
-in_progress_job,text,Jobs in Progress
-create_sop,text,Create SOP
-sop_manage,text,SOP Management
-exception_job,text,Exception Jobs
-create_job,text,Create Job
-job_manage,text,Job Management
-workflow_manage,text,Workflow Mode Management
-create_sop_job,text,Create SOP Job
-locked_point,text,Locked Points
-slot_manage,text,Slot Management
-key_manage,text,Key Management
-lock_manage,text,Padlock Management
-card_manage,text,Card Management
-rfid_manage,text,RFID Management
-exception_report,text,Exception Reporting
-exception_manage,text,Exception Management
-user_info,text,Personal Information
-reset_password,text,Reset Password
-fingerprint_setting,text,Fingerprint Settings
-face_setting,text,Face Settings
-card_setting,text,Card Settings
-logout,text,Log Out
-todo_list,text,My To-Dos
-hardware_manage,text,Hardware Management
-job_ticket_manage,text,Job Ticket Management
-data_manage,text,Data Management
-home,text,Home
-auto_confirm,text,Auto Confirm
-click_confirm,text,Click Confirm
-role_confirm,text,Role Confirmation
-admin,text,Super Admin
-jtdrawer,text,Job Manager
-jtlocker,text,Job Lead
-jtcolocker,text,Job Participant
-jtguard,text,Job Observer
-sysconfig,text,System Configurator
-force_shared_lock,text,Forced Shared-Lock Mode
-force_multi_lock,text,Forced Multi-Lock Mode
-mixed_mode,text,Mixed Mode
-lock_take_key,text,Start Locking
-lock_return_key,text,Finish Locking
-unlock_take_key,text,Start Unlocking
-unlock_return_key,text,Finish Unlocking
-colock,text,Add Co-lock
-release_colock,text,Release Co-lock
-confirm_exec,text,Confirm Execution
-end,text,End Job
-unknown,text,Unknown To-Do
-not_start,text,Not Started
-select_member,text,Select Member
-locking,text,Locking
-colocking,text,Co-locking
-unlocking,text,Unlocking
-finished,text,Finished
-canceled,text,Canceled
-progressing,text,In Progress
-hydraulic_pressure,text,Hydraulic
-electric_energy,text,Electrical Energy
-potential_energy,text,Potential Energy
-heat_energy,text,Thermal Energy
-gas,text,Gas
-mechanical_energy,text,Mechanical Energy
-air_energy,text,Compressed Air
-apply_master_key,text,Apply for Master Key
-apply_finish_job,text,Apply to Finish Job
-apply_scrap_slot,text,Apply to Scrap Slot
-apply_scrap_lock,text,Apply to Scrap Padlock
-apply_scrap_key,text,Apply to Scrap Key
-slot_damage,text,Damaged Slot
-lock_damage,text,Damaged Padlock
-key_damage,text,Damaged Key
-job_cat_not_exec,text,Job Ticket Not Executable
-pending,text,Pending
-processed,text,Processed
-canceld,text,Canceled
-key,text,Key
-lock,text,Padlock
-slot,text,Slot
-job,text,Job
-job_exception,text,Job Exception
-hardware_exception,text,Hardware Exception

+ 3762 - 0
app/src/main/assets/i18n/en-US.json

@@ -0,0 +1,3762 @@
+{
+  "i18n.language_name": {
+    "key": "i18n.language_name",
+    "type": "text",
+    "value": "English"
+  },
+  "abnormal": {
+    "key": "abnormal",
+    "type": "text",
+    "value": "Abnormal"
+  },
+  "account_login": {
+    "key": "account_login",
+    "type": "text",
+    "value": "Username Login"
+  },
+  "action_confirm": {
+    "key": "action_confirm",
+    "type": "text",
+    "value": "Action Confirmation"
+  },
+  "action_confirm_content": {
+    "key": "action_confirm_content",
+    "type": "text",
+    "value": "Are you sure you want to perform {0}?"
+  },
+  "action_failed": {
+    "key": "action_failed",
+    "type": "text",
+    "value": "Action Failed"
+  },
+  "action_hint": {
+    "key": "action_hint",
+    "type": "text",
+    "value": "Action Notification"
+  },
+  "action_succeed": {
+    "key": "action_succeed",
+    "type": "text",
+    "value": "Action Successful"
+  },
+  "add_card_failed": {
+    "key": "add_card_failed",
+    "type": "text",
+    "value": "Failed to Add Card"
+  },
+  "add_card_succeed": {
+    "key": "add_card_succeed",
+    "type": "text",
+    "value": "Card Added Successfully"
+  },
+  "add_colocker": {
+    "key": "add_colocker",
+    "type": "text",
+    "value": "Add Co-lock User ({0})"
+  },
+  "add_group": {
+    "key": "add_group",
+    "type": "text",
+    "value": "Add Group"
+  },
+  "add_key_failed": {
+    "key": "add_key_failed",
+    "type": "text",
+    "value": "Failed to Add Key"
+  },
+  "add_key_succeed": {
+    "key": "add_key_succeed",
+    "type": "text",
+    "value": "Key Added Successfully"
+  },
+  "add_lock_failed": {
+    "key": "add_lock_failed",
+    "type": "text",
+    "value": "Failed to Add Padlock"
+  },
+  "add_lock_succeed": {
+    "key": "add_lock_succeed",
+    "type": "text",
+    "value": "Padlock Added Successfully"
+  },
+  "add_point_failed": {
+    "key": "add_point_failed",
+    "type": "text",
+    "value": "Failed to Add Isolation Point"
+  },
+  "add_point_succeed": {
+    "key": "add_point_succeed",
+    "type": "text",
+    "value": "Isolation Point Added Successfully"
+  },
+  "add_rfid_token_failed": {
+    "key": "add_rfid_token_failed",
+    "type": "text",
+    "value": "Failed to Add RFID Tag"
+  },
+  "add_rfid_token_succeed": {
+    "key": "add_rfid_token_succeed",
+    "type": "text",
+    "value": "RFID Tag Added Successfully"
+  },
+  "add_role_failed": {
+    "key": "add_role_failed",
+    "type": "text",
+    "value": "Failed to Add Role"
+  },
+  "add_role_succeed": {
+    "key": "add_role_succeed",
+    "type": "text",
+    "value": "Role Added Successfully"
+  },
+  "add_user_succeed": {
+    "key": "add_user_succeed",
+    "type": "text",
+    "value": "User Added Successfully"
+  },
+  "add_workstation_failed": {
+    "key": "add_workstation_failed",
+    "type": "text",
+    "value": "Failed to Add Workstation"
+  },
+  "add_workstation_succeed": {
+    "key": "add_workstation_succeed",
+    "type": "text",
+    "value": "Workstation Added Successfully"
+  },
+  "admin_role_can_not_edit": {
+    "key": "admin_role_can_not_edit",
+    "type": "text",
+    "value": "Administrator Role Cannot Be Edited"
+  },
+  "admin_username": {
+    "key": "admin_username",
+    "type": "text",
+    "value": "Admin Account: (Numbers, Letters, 6–20 characters)"
+  },
+  "all": {
+    "key": "all",
+    "type": "text",
+    "value": "All"
+  },
+  "all_hardware_tv": {
+    "key": "all_hardware_tv",
+    "type": "text",
+    "value": "All Hardware"
+  },
+  "all_job_tv": {
+    "key": "all_job_tv",
+    "type": "text",
+    "value": "All Jobs"
+  },
+  "all_points_tv": {
+    "key": "all_points_tv",
+    "type": "text",
+    "value": "All Points"
+  },
+  "all_quick_entrance": {
+    "key": "all_quick_entrance",
+    "type": "text",
+    "value": "All Shortcuts"
+  },
+  "all_select_not_all_select": {
+    "key": "all_select_not_all_select",
+    "type": "text",
+    "value": "Select All / Deselect All"
+  },
+  "already_colock": {
+    "key": "already_colock",
+    "type": "text",
+    "value": "Co-locked ({0})"
+  },
+  "already_uncolock": {
+    "key": "already_uncolock",
+    "type": "text",
+    "value": "Co-lock Released ({0})"
+  },
+  "back": {
+    "key": "back",
+    "type": "text",
+    "value": "Back"
+  },
+  "base_info_title": {
+    "key": "base_info_title",
+    "type": "text",
+    "value": "Basic Information"
+  },
+  "ble_connect_fail": {
+    "key": "ble_connect_fail",
+    "type": "text",
+    "value": "Connection Failed, Please Retry!"
+  },
+  "ble_connecting": {
+    "key": "ble_connecting",
+    "type": "text",
+    "value": "Connecting, Please Wait..."
+  },
+  "can_not_remove_current_colocker": {
+    "key": "can_not_remove_current_colocker",
+    "type": "text",
+    "value": "Cannot Remove Current Co-lock User"
+  },
+  "can_not_remove_current_locker": {
+    "key": "can_not_remove_current_locker",
+    "type": "text",
+    "value": "Cannot Remove Current Locker"
+  },
+  "cancel": {
+    "key": "cancel",
+    "type": "text",
+    "value": "Cancel"
+  },
+  "cancel_countdown": {
+    "key": "cancel_countdown",
+    "type": "text",
+    "value": "Cancel ({0}s)"
+  },
+  "cancel_exception": {
+    "key": "cancel_exception",
+    "type": "text",
+    "value": "Cancel Exception"
+  },
+  "cancel_exception_failed": {
+    "key": "cancel_exception_failed",
+    "type": "text",
+    "value": "Failed to Cancel Exception"
+  },
+  "cancel_exception_success": {
+    "key": "cancel_exception_success",
+    "type": "text",
+    "value": "Exception Cancelled Successfully"
+  },
+  "cancel_job": {
+    "key": "cancel_job",
+    "type": "text",
+    "value": "Cancel Job"
+  },
+  "cancel_job_tip": {
+    "key": "cancel_job_tip",
+    "type": "text",
+    "value": "Are you sure you want to cancel the current job?"
+  },
+  "capture_tip_content": {
+    "key": "capture_tip_content",
+    "type": "text",
+    "value": "1. The system will automatically take a photo. During the process, please ensure:\n       · Face is facing the camera\n       · Maintain an appropriate distance so the entire face fits within the left frame\n       · Adequate lighting\n       · Natural expression \n 2. After the photo is taken, you can click the Confirm button to submit, or click the Retake button to take the photo again. \n 3. To cancel enrollment, please click the Cancel button."
+  },
+  "capture_tip_title": {
+    "key": "capture_tip_title",
+    "type": "text",
+    "value": "Capture Prompt"
+  },
+  "card_already_registration": {
+    "key": "card_already_registration",
+    "type": "text",
+    "value": "Card Already Registered"
+  },
+  "card_code": {
+    "key": "card_code",
+    "type": "text",
+    "value": "Card Name"
+  },
+  "card_login": {
+    "key": "card_login",
+    "type": "text",
+    "value": "Card Login"
+  },
+  "card_manage_card_detail_title": {
+    "key": "card_manage_card_detail_title",
+    "type": "text",
+    "value": "Card Details"
+  },
+  "card_manage_delete_failed": {
+    "key": "card_manage_delete_failed",
+    "type": "text",
+    "value": "Failed to Delete Card"
+  },
+  "card_manage_delete_succeed": {
+    "key": "card_manage_delete_succeed",
+    "type": "text",
+    "value": "Card Deleted Successfully"
+  },
+  "card_manage_new_card_title": {
+    "key": "card_manage_new_card_title",
+    "type": "text",
+    "value": "Add New Card"
+  },
+  "card_manage_title": {
+    "key": "card_manage_title",
+    "type": "text",
+    "value": "Card Management"
+  },
+  "card_nfc": {
+    "key": "card_nfc",
+    "type": "text",
+    "value": "Card NFC"
+  },
+  "change_to_standard": {
+    "key": "change_to_standard",
+    "type": "text",
+    "value": "Switch to Standard Version"
+  },
+  "check_before_unlocking": {
+    "key": "check_before_unlocking",
+    "type": "text",
+    "value": "Pre-Unlocking Check"
+  },
+  "check_delete_card": {
+    "key": "check_delete_card",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected card?"
+  },
+  "check_delete_job": {
+    "key": "check_delete_job",
+    "type": "text",
+    "value": "Are you sure you want to delete the job?"
+  },
+  "check_delete_key": {
+    "key": "check_delete_key",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected key?"
+  },
+  "check_delete_lock": {
+    "key": "check_delete_lock",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected padlock?"
+  },
+  "check_delete_point": {
+    "key": "check_delete_point",
+    "type": "text",
+    "value": "Are you sure you want to delete the isolation point?"
+  },
+  "check_delete_rfid_token": {
+    "key": "check_delete_rfid_token",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected RFID tag?"
+  },
+  "check_delete_role": {
+    "key": "check_delete_role",
+    "type": "text",
+    "value": "Are you sure you want to delete the role?"
+  },
+  "check_delete_sop": {
+    "key": "check_delete_sop",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected SOP?"
+  },
+  "check_delete_user": {
+    "key": "check_delete_user",
+    "type": "text",
+    "value": "Are you sure you want to delete the user?"
+  },
+  "check_delete_workflow_mode": {
+    "key": "check_delete_workflow_mode",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected workflow mode?"
+  },
+  "check_delete_workstation": {
+    "key": "check_delete_workstation",
+    "type": "text",
+    "value": "Are you sure you want to delete the area \"{0}\"?"
+  },
+  "check_device_info": {
+    "key": "check_device_info",
+    "type": "text",
+    "value": "Detected {0} unregistered keys, {1} unregistered padlocks"
+  },
+  "check_key_and_lock": {
+    "key": "check_key_and_lock",
+    "type": "text",
+    "value": "Checking Keys and Padlocks"
+  },
+  "check_lock_is_new_device": {
+    "key": "check_lock_is_new_device",
+    "type": "text",
+    "value": "Checking if Padlock is New Device"
+  },
+  "check_new_key_need_register": {
+    "key": "check_new_key_need_register",
+    "type": "text",
+    "value": "New Key Detected. Register Now?"
+  },
+  "check_new_lock_need_register": {
+    "key": "check_new_lock_need_register",
+    "type": "text",
+    "value": "New Padlock Detected. Register Now?"
+  },
+  "close": {
+    "key": "close",
+    "type": "text",
+    "value": "Close"
+  },
+  "colock": {
+    "key": "colock",
+    "type": "text",
+    "value": "Add Co-lock"
+  },
+  "colock_complete": {
+    "key": "colock_complete",
+    "type": "text",
+    "value": "Co-lock Added Successfully"
+  },
+  "colock_failed": {
+    "key": "colock_failed",
+    "type": "text",
+    "value": "Failed to Add Co-lock"
+  },
+  "colocker": {
+    "key": "colocker",
+    "type": "text",
+    "value": "Co-lock User"
+  },
+  "confirm": {
+    "key": "confirm",
+    "type": "text",
+    "value": "Confirm"
+  },
+  "confirm_cancel_exception": {
+    "key": "confirm_cancel_exception",
+    "type": "text",
+    "value": "Are you sure you want to cancel the exception?"
+  },
+  "confirm_create_lock_job": {
+    "key": "confirm_create_lock_job",
+    "type": "text",
+    "value": "Confirm Creating Locking Job?"
+  },
+  "confirm_create_unlock_job": {
+    "key": "confirm_create_unlock_job",
+    "type": "text",
+    "value": "Confirm Creating Unlocking Job?"
+  },
+  "confirm_handle_exception": {
+    "key": "confirm_handle_exception",
+    "type": "text",
+    "value": "Are you sure you want to handle the exception?"
+  },
+  "confirm_to_colock": {
+    "key": "confirm_to_colock",
+    "type": "text",
+    "value": "Should {0} confirm co-locking?"
+  },
+  "confirm_to_uncolock": {
+    "key": "confirm_to_uncolock",
+    "type": "text",
+    "value": "Should {0} confirm releasing co-lock?"
+  },
+  "continue_the_ticket": {
+    "key": "continue_the_ticket",
+    "type": "text",
+    "value": "Please Continue Completing the Work Permit"
+  },
+  "create_job_failed": {
+    "key": "create_job_failed",
+    "type": "text",
+    "value": "Failed to Create Job"
+  },
+  "create_job_name": {
+    "key": "create_job_name",
+    "type": "text",
+    "value": "Job Name"
+  },
+  "create_job_title": {
+    "key": "create_job_title",
+    "type": "text",
+    "value": "Create New Job"
+  },
+  "create_sop_job_sop": {
+    "key": "create_sop_job_sop",
+    "type": "text",
+    "value": "SOP"
+  },
+  "create_sop_job_tip": {
+    "key": "create_sop_job_tip",
+    "type": "text",
+    "value": "Are you sure you want to execute job \"{0}\"?"
+  },
+  "create_sop_job_title": {
+    "key": "create_sop_job_title",
+    "type": "text",
+    "value": "Create New SOP Job"
+  },
+  "create_sop_name": {
+    "key": "create_sop_name",
+    "type": "text",
+    "value": "SOP Name"
+  },
+  "create_sop_title": {
+    "key": "create_sop_title",
+    "type": "text",
+    "value": "Create New SOP"
+  },
+  "current_job_has_cross_job": {
+    "key": "current_job_has_cross_job",
+    "type": "text",
+    "value": "Warning! Current job overlaps with another. Continue handling exception?"
+  },
+  "current_role_no_user": {
+    "key": "current_role_no_user",
+    "type": "text",
+    "value": "No Users Assigned to Current Role"
+  },
+  "current_slot_has_no_key": {
+    "key": "current_slot_has_no_key",
+    "type": "text",
+    "value": "No Key in Current Slot"
+  },
+  "current_slot_has_no_lock": {
+    "key": "current_slot_has_no_lock",
+    "type": "text",
+    "value": "No Padlock in Current Slot"
+  },
+  "current_sop_has_job_in_progress": {
+    "key": "current_sop_has_job_in_progress",
+    "type": "text",
+    "value": "Current SOP Has Ongoing Job"
+  },
+  "current_ticket_report_lock_take_exception_tip": {
+    "key": "current_ticket_report_lock_take_exception_tip",
+    "type": "text",
+    "value": "Padlock Exception Reported in Current Job. Please Return Padlock"
+  },
+  "current_user_has_not_face_data": {
+    "key": "current_user_has_not_face_data",
+    "type": "text",
+    "value": "Current User Has No Face Data"
+  },
+  "current_workflow_mode_error": {
+    "key": "current_workflow_mode_error",
+    "type": "text",
+    "value": "Current Workflow Mode Error"
+  },
+  "currently_no_hardware_can_be_report": {
+    "key": "currently_no_hardware_can_be_report",
+    "type": "text",
+    "value": "No Hardware Available for Reporting"
+  },
+  "currently_no_job_can_be_report": {
+    "key": "currently_no_job_can_be_report",
+    "type": "text",
+    "value": "No Job Available for Reporting"
+  },
+  "currently_unable_to_lock_together": {
+    "key": "currently_unable_to_lock_together",
+    "type": "text",
+    "value": "Unable to Co-lock at Current Stage"
+  },
+  "data_content_error": {
+    "key": "data_content_error",
+    "type": "text",
+    "value": "Data Content Error"
+  },
+  "data_decrypt_failed": {
+    "key": "data_decrypt_failed",
+    "type": "text",
+    "value": "Data Decryption Failed"
+  },
+  "data_file_is_corrupted": {
+    "key": "data_file_is_corrupted",
+    "type": "text",
+    "value": "Data File Corrupted"
+  },
+  "data_file_not_exists": {
+    "key": "data_file_not_exists",
+    "type": "text",
+    "value": "Data File Does Not Exist"
+  },
+  "date": {
+    "key": "date",
+    "type": "text",
+    "value": "{0}-{1}-{2}"
+  },
+  "delete": {
+    "key": "delete",
+    "type": "text",
+    "value": "Delete"
+  },
+  "delete_group": {
+    "key": "delete_group",
+    "type": "text",
+    "value": "Delete Group"
+  },
+  "delete_success": {
+    "key": "delete_success",
+    "type": "text",
+    "value": "Deleted Successfully"
+  },
+  "detail": {
+    "key": "detail",
+    "type": "text",
+    "value": "Details"
+  },
+  "detect_face_tip": {
+    "key": "detect_face_tip",
+    "type": "text",
+    "value": "Face Detected. Capturing Soon"
+  },
+  "detect_port": {
+    "key": "detect_port",
+    "type": "text",
+    "value": "Scanning Devices..."
+  },
+  "detect_slot": {
+    "key": "detect_slot",
+    "type": "text",
+    "value": "Detecting Slot"
+  },
+  "device_in_detect": {
+    "key": "device_in_detect",
+    "type": "text",
+    "value": "Device Recognition in Progress"
+  },
+  "do_you_want_to_remove_exception": {
+    "key": "do_you_want_to_remove_exception",
+    "type": "text",
+    "value": "Are you sure you want to remove this exception?"
+  },
+  "doing_checking": {
+    "key": "doing_checking",
+    "type": "text",
+    "value": "Verifying..."
+  },
+  "doing_login": {
+    "key": "doing_login",
+    "type": "text",
+    "value": "Logging In..."
+  },
+  "done_header": {
+    "key": "done_header",
+    "type": "text",
+    "value": "Processed"
+  },
+  "edit": {
+    "key": "edit",
+    "type": "text",
+    "value": "Edit"
+  },
+  "edit_job_title": {
+    "key": "edit_job_title",
+    "type": "text",
+    "value": "Job Details"
+  },
+  "edit_sop_job_title": {
+    "key": "edit_sop_job_title",
+    "type": "text",
+    "value": "SOP Job Details"
+  },
+  "edit_sop_title": {
+    "key": "edit_sop_title",
+    "type": "text",
+    "value": "SOP Details"
+  },
+  "end": {
+    "key": "end",
+    "type": "text",
+    "value": "End Job"
+  },
+  "end_job": {
+    "key": "end_job",
+    "type": "text",
+    "value": "End Job"
+  },
+  "end_time": {
+    "key": "end_time",
+    "type": "text",
+    "value": "End Time"
+  },
+  "ensure_power_isolation": {
+    "key": "ensure_power_isolation",
+    "type": "text",
+    "value": "Energy Isolation Confirmation"
+  },
+  "error_date_range_invalid": {
+    "key": "error_date_range_invalid",
+    "type": "text",
+    "value": "Start Time Cannot Be Later Than End Time"
+  },
+  "exception_data_not_exists": {
+    "key": "exception_data_not_exists",
+    "type": "text",
+    "value": "Exception Data Not Found"
+  },
+  "exception_description": {
+    "key": "exception_description",
+    "type": "text",
+    "value": "Exception Description:"
+  },
+  "exception_description_tv": {
+    "key": "exception_description_tv",
+    "type": "text",
+    "value": "Exception Description"
+  },
+  "exception_detail_title": {
+    "key": "exception_detail_title",
+    "type": "text",
+    "value": "Exception Details"
+  },
+  "exception_info": {
+    "key": "exception_info",
+    "type": "text",
+    "value": "Exception Information"
+  },
+  "exception_job": {
+    "key": "exception_job",
+    "type": "text",
+    "value": "Exception Jobs"
+  },
+  "exception_job_title": {
+    "key": "exception_job_title",
+    "type": "text",
+    "value": "Exception Job"
+  },
+  "exception_lost": {
+    "key": "exception_lost",
+    "type": "text",
+    "value": "Exception Lost"
+  },
+  "exception_manage_title": {
+    "key": "exception_manage_title",
+    "type": "text",
+    "value": "Exception Management"
+  },
+  "exception_occurrence_time": {
+    "key": "exception_occurrence_time",
+    "type": "text",
+    "value": "Exception Occurrence Time:"
+  },
+  "exception_occurrence_time_header": {
+    "key": "exception_occurrence_time_header",
+    "type": "text",
+    "value": "Occurrence Time"
+  },
+  "exception_reason": {
+    "key": "exception_reason",
+    "type": "text",
+    "value": "Exception Reason"
+  },
+  "exception_release_time": {
+    "key": "exception_release_time",
+    "type": "text",
+    "value": "Exception Release Time:"
+  },
+  "exception_report": {
+    "key": "exception_report",
+    "type": "text",
+    "value": "Exception Reporting"
+  },
+  "exception_report_success": {
+    "key": "exception_report_success",
+    "type": "text",
+    "value": "Exception Report Successful"
+  },
+  "exception_reporter": {
+    "key": "exception_reporter",
+    "type": "text",
+    "value": "Reporter:"
+  },
+  "exception_source": {
+    "key": "exception_source",
+    "type": "text",
+    "value": "Exception Source:"
+  },
+  "exception_source_tv": {
+    "key": "exception_source_tv",
+    "type": "text",
+    "value": "Exception Source"
+  },
+  "exception_status": {
+    "key": "exception_status",
+    "type": "text",
+    "value": "Status:"
+  },
+  "exception_status_header": {
+    "key": "exception_status_header",
+    "type": "text",
+    "value": "Exception Status"
+  },
+  "exception_type": {
+    "key": "exception_type",
+    "type": "text",
+    "value": "Exception Type:"
+  },
+  "exception_type_header": {
+    "key": "exception_type_header",
+    "type": "text",
+    "value": "Exception Type"
+  },
+  "exception_type_tv": {
+    "key": "exception_type_tv",
+    "type": "text",
+    "value": "Exception Type"
+  },
+  "expand_collapse": {
+    "key": "expand_collapse",
+    "type": "text",
+    "value": "Expand/Collapse"
+  },
+  "face_can_not_process": {
+    "key": "face_can_not_process",
+    "type": "text",
+    "value": "Face Recognition Engine Activation Failed, Recognition Unavailable"
+  },
+  "face_detected_do_login": {
+    "key": "face_detected_do_login",
+    "type": "text",
+    "value": "Face Detected, Logging In..."
+  },
+  "face_login": {
+    "key": "face_login",
+    "type": "text",
+    "value": "Face Login"
+  },
+  "face_login_failed": {
+    "key": "face_login_failed",
+    "type": "text",
+    "value": "Face Match Failed, Please Retry"
+  },
+  "face_login_success": {
+    "key": "face_login_success",
+    "type": "text",
+    "value": "Face Authentication Successful"
+  },
+  "face_not_set_tip": {
+    "key": "face_not_set_tip",
+    "type": "text",
+    "value": "Face Data Not Set"
+  },
+  "face_set_tip": {
+    "key": "face_set_tip",
+    "type": "text",
+    "value": "Face Data Configured"
+  },
+  "file_not_exists": {
+    "key": "file_not_exists",
+    "type": "text",
+    "value": "File Does Not Exist"
+  },
+  "filter": {
+    "key": "filter",
+    "type": "text",
+    "value": "Filter"
+  },
+  "fingerprint_add_success_tip": {
+    "key": "fingerprint_add_success_tip",
+    "type": "text",
+    "value": "Fingerprint Data Added Successfully"
+  },
+  "fingerprint_code": {
+    "key": "fingerprint_code",
+    "type": "text",
+    "value": "Fingerprint ID"
+  },
+  "fingerprint_code_str": {
+    "key": "fingerprint_code_str",
+    "type": "text",
+    "value": "Fingerprint_{0}"
+  },
+  "fingerprint_delete_confirm_tip": {
+    "key": "fingerprint_delete_confirm_tip",
+    "type": "text",
+    "value": "Are you sure you want to delete {0}?"
+  },
+  "fingerprint_delete_selected_confirm_tip": {
+    "key": "fingerprint_delete_selected_confirm_tip",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected fingerprint(s)?"
+  },
+  "fingerprint_login": {
+    "key": "fingerprint_login",
+    "type": "text",
+    "value": "Fingerprint Login"
+  },
+  "fingerprint_login_failed": {
+    "key": "fingerprint_login_failed",
+    "type": "text",
+    "value": "Fingerprint Recognition Failed, Please Retry"
+  },
+  "fingerprint_login_success": {
+    "key": "fingerprint_login_success",
+    "type": "text",
+    "value": "Fingerprint Authentication Successful"
+  },
+  "fingerprint_scan_tip": {
+    "key": "fingerprint_scan_tip",
+    "type": "text",
+    "value": "Please Press Fingerprint Sensor {0} Times"
+  },
+  "finish_job_tip": {
+    "key": "finish_job_tip",
+    "type": "text",
+    "value": "Are you sure you want to end the current job?"
+  },
+  "finish_the_job": {
+    "key": "finish_the_job",
+    "type": "text",
+    "value": "End Job"
+  },
+  "get_key_info_fail": {
+    "key": "get_key_info_fail",
+    "type": "text",
+    "value": "Failed to Retrieve Key Information"
+  },
+  "go_locking": {
+    "key": "go_locking",
+    "type": "text",
+    "value": "Proceed to Lock"
+  },
+  "go_unlocking": {
+    "key": "go_unlocking",
+    "type": "text",
+    "value": "Proceed to Unlock"
+  },
+  "group_at_least_has_one_point": {
+    "key": "group_at_least_has_one_point",
+    "type": "text",
+    "value": "Each Group Must Contain at Least One Point"
+  },
+  "group_job_in_progress": {
+    "key": "group_job_in_progress",
+    "type": "text",
+    "value": "Group Job in Progress"
+  },
+  "group_name_must_not_empty": {
+    "key": "group_name_must_not_empty",
+    "type": "text",
+    "value": "Group Name Cannot Be Empty"
+  },
+  "handle": {
+    "key": "handle",
+    "type": "text",
+    "value": "Handle"
+  },
+  "handle_colock": {
+    "key": "handle_colock",
+    "type": "text",
+    "value": "Please Confirm to Add Co-lock"
+  },
+  "handle_exception": {
+    "key": "handle_exception",
+    "type": "text",
+    "value": "Handle Exception"
+  },
+  "handle_exception_success": {
+    "key": "handle_exception_success",
+    "type": "text",
+    "value": "Exception Handled Successfully"
+  },
+  "handle_exception_will_release_all_colock": {
+    "key": "handle_exception_will_release_all_colock",
+    "type": "text",
+    "value": "Warning! Handling Exception Will Remove All Co-locks. Continue?"
+  },
+  "handle_failed": {
+    "key": "handle_failed",
+    "type": "text",
+    "value": "Handling Failed"
+  },
+  "handle_lock_take_key": {
+    "key": "handle_lock_take_key",
+    "type": "text",
+    "value": "Confirm to Take Key for Locking?"
+  },
+  "handle_release_colock": {
+    "key": "handle_release_colock",
+    "type": "text",
+    "value": "Please Confirm to Release Co-lock"
+  },
+  "handle_step_confirm": {
+    "key": "handle_step_confirm",
+    "type": "text",
+    "value": "Please Confirm Completion of [{0}]"
+  },
+  "handle_time": {
+    "key": "handle_time",
+    "type": "text",
+    "value": "Handling Time:"
+  },
+  "handle_time_custom_time_range": {
+    "key": "handle_time_custom_time_range",
+    "type": "text",
+    "value": "Custom Range"
+  },
+  "handle_time_last_30_days": {
+    "key": "handle_time_last_30_days",
+    "type": "text",
+    "value": "Last 30 Days"
+  },
+  "handle_time_last_7_days": {
+    "key": "handle_time_last_7_days",
+    "type": "text",
+    "value": "Last 7 Days"
+  },
+  "handle_unknown": {
+    "key": "handle_unknown",
+    "type": "text",
+    "value": "Unknown Handling Type, Unable to Process"
+  },
+  "handle_unlock_take_key": {
+    "key": "handle_unlock_take_key",
+    "type": "text",
+    "value": "Confirm to Take Key for Unlocking?"
+  },
+  "hardware_in_use_tv": {
+    "key": "hardware_in_use_tv",
+    "type": "text",
+    "value": "Hardware In Use"
+  },
+  "hardware_info": {
+    "key": "hardware_info",
+    "type": "text",
+    "value": "Hardware Info: {0}"
+  },
+  "hardware_key": {
+    "key": "hardware_key",
+    "type": "text",
+    "value": "Key"
+  },
+  "hardware_lock": {
+    "key": "hardware_lock",
+    "type": "text",
+    "value": "Padlock"
+  },
+  "hardware_unknown": {
+    "key": "hardware_unknown",
+    "type": "text",
+    "value": "Unknown"
+  },
+  "has_job_in_progress": {
+    "key": "has_job_in_progress",
+    "type": "text",
+    "value": "Job in Progress Exists"
+  },
+  "has_locked": {
+    "key": "has_locked",
+    "type": "text",
+    "value": "Locked"
+  },
+  "has_user_in_progress_job": {
+    "key": "has_user_in_progress_job",
+    "type": "text",
+    "value": "User(s) Currently in Job"
+  },
+  "home_overview_data_title": {
+    "key": "home_overview_data_title",
+    "type": "text",
+    "value": "Overview Data"
+  },
+  "home_realtime_data_title": {
+    "key": "home_realtime_data_title",
+    "type": "text",
+    "value": "Real-time Data"
+  },
+  "import_str": {
+    "key": "import_str",
+    "type": "text",
+    "value": "Import"
+  },
+  "import_success": {
+    "key": "import_success",
+    "type": "text",
+    "value": "Import Successful"
+  },
+  "in_progress_job_manage_title": {
+    "key": "in_progress_job_manage_title",
+    "type": "text",
+    "value": "Jobs in Progress"
+  },
+  "init_card_registration_step_hint": {
+    "key": "init_card_registration_step_hint",
+    "type": "text",
+    "value": "Please Swipe Card on Reader"
+  },
+  "init_card_registration_step_tip": {
+    "key": "init_card_registration_step_tip",
+    "type": "text",
+    "value": "Identify and Register Card"
+  },
+  "init_device_registration_key_and_lock_complete_step_hint": {
+    "key": "init_device_registration_key_and_lock_complete_step_hint",
+    "type": "text",
+    "value": "Scan Complete"
+  },
+  "init_device_registration_key_and_lock_step_hint": {
+    "key": "init_device_registration_key_and_lock_step_hint",
+    "type": "text",
+    "value": "Please Wait for System to Identify Keys and Padlocks"
+  },
+  "init_device_registration_key_and_lock_step_tip": {
+    "key": "init_device_registration_key_and_lock_step_tip",
+    "type": "text",
+    "value": "Identify Keys and Padlocks"
+  },
+  "init_point_rfid_registration_step_hint": {
+    "key": "init_point_rfid_registration_step_hint",
+    "type": "text",
+    "value": "Please Scan Point RFID Tag on Reader"
+  },
+  "init_point_rfid_registration_step_tip": {
+    "key": "init_point_rfid_registration_step_tip",
+    "type": "text",
+    "value": "Identify and Register Point RFID Tag"
+  },
+  "init_set_admin_account_step": {
+    "key": "init_set_admin_account_step",
+    "type": "text",
+    "value": "1"
+  },
+  "init_set_admin_account_step_hint": {
+    "key": "init_set_admin_account_step_hint",
+    "type": "text",
+    "value": "Please Set Admin Username and Password"
+  },
+  "init_set_admin_account_step_tip": {
+    "key": "init_set_admin_account_step_tip",
+    "type": "text",
+    "value": "Configure Admin Account"
+  },
+  "init_set_remote_server_step_hint": {
+    "key": "init_set_remote_server_step_hint",
+    "type": "text",
+    "value": "Please Set Server Address and Port"
+  },
+  "init_set_remote_server_step_tip": {
+    "key": "init_set_remote_server_step_tip",
+    "type": "text",
+    "value": "Configure Server"
+  },
+  "insert": {
+    "key": "insert",
+    "type": "text",
+    "value": "Add"
+  },
+  "invalid_card": {
+    "key": "invalid_card",
+    "type": "text",
+    "value": "Invalid Card"
+  },
+  "invalid_user": {
+    "key": "invalid_user",
+    "type": "text",
+    "value": "User Does Not Exist"
+  },
+  "item_my_todo_complete_time_title": {
+    "key": "item_my_todo_complete_time_title",
+    "type": "text",
+    "value": "Completion Time:"
+  },
+  "item_my_todo_current_operation_title": {
+    "key": "item_my_todo_current_operation_title",
+    "type": "text",
+    "value": "Current Operation:"
+  },
+  "item_my_todo_current_step_title": {
+    "key": "item_my_todo_current_step_title",
+    "type": "text",
+    "value": "Current Step:"
+  },
+  "item_my_todo_job_name_title": {
+    "key": "item_my_todo_job_name_title",
+    "type": "text",
+    "value": "Related Job:"
+  },
+  "job_already_finished": {
+    "key": "job_already_finished",
+    "type": "text",
+    "value": "This job has already been completed"
+  },
+  "job_canceled": {
+    "key": "job_canceled",
+    "type": "text",
+    "value": "Job canceled"
+  },
+  "job_card_login_failed": {
+    "key": "job_card_login_failed",
+    "type": "text",
+    "value": "Invalid work card"
+  },
+  "job_card_login_success": {
+    "key": "job_card_login_success",
+    "type": "text",
+    "value": "Work card recognized successfully"
+  },
+  "job_card_not_set_tip": {
+    "key": "job_card_not_set_tip",
+    "type": "text",
+    "value": "You have not set up a work card"
+  },
+  "job_card_scan_tip": {
+    "key": "job_card_scan_tip",
+    "type": "text",
+    "value": "Please scan your card on the reader"
+  },
+  "job_card_set_tip": {
+    "key": "job_card_set_tip",
+    "type": "text",
+    "value": "Work card data has been set"
+  },
+  "job_create_and_execute_failed": {
+    "key": "job_create_and_execute_failed",
+    "type": "text",
+    "value": "Job execution failed"
+  },
+  "job_create_and_execute_succeed": {
+    "key": "job_create_and_execute_succeed",
+    "type": "text",
+    "value": "Job started successfully"
+  },
+  "job_create_failed": {
+    "key": "job_create_failed",
+    "type": "text",
+    "value": "Job save failed"
+  },
+  "job_create_succeed": {
+    "key": "job_create_succeed",
+    "type": "text",
+    "value": "Job saved successfully"
+  },
+  "job_execute_colocker_colock_status_title": {
+    "key": "job_execute_colocker_colock_status_title",
+    "type": "text",
+    "value": "Co-lock personnel status"
+  },
+  "job_execute_lock_status_title": {
+    "key": "job_execute_lock_status_title",
+    "type": "text",
+    "value": "Isolation point lock status"
+  },
+  "job_execute_step_description": {
+    "key": "job_execute_step_description",
+    "type": "text",
+    "value": "Operation instructions ({0})"
+  },
+  "job_execute_tab_title_colock": {
+    "key": "job_execute_tab_title_colock",
+    "type": "text",
+    "value": "Co-lock"
+  },
+  "job_execute_tab_title_lock": {
+    "key": "job_execute_tab_title_lock",
+    "type": "text",
+    "value": "Lock"
+  },
+  "job_execute_title": {
+    "key": "job_execute_title",
+    "type": "text",
+    "value": "Job Execution"
+  },
+  "job_finished": {
+    "key": "job_finished",
+    "type": "text",
+    "value": "Job completed"
+  },
+  "job_lost": {
+    "key": "job_lost",
+    "type": "text",
+    "value": "Job lost"
+  },
+  "job_manage_delete_failed": {
+    "key": "job_manage_delete_failed",
+    "type": "text",
+    "value": "Failed to delete selected job"
+  },
+  "job_manage_delete_succeed": {
+    "key": "job_manage_delete_succeed",
+    "type": "text",
+    "value": "Selected job deleted successfully"
+  },
+  "job_manage_title": {
+    "key": "job_manage_title",
+    "type": "text",
+    "value": "Job Management"
+  },
+  "job_name": {
+    "key": "job_name",
+    "type": "text",
+    "value": "Job Name"
+  },
+  "job_save_and_execute_tip": {
+    "key": "job_save_and_execute_tip",
+    "type": "text",
+    "value": "Are you sure you want to execute job \"{0}\"?"
+  },
+  "job_save_tip": {
+    "key": "job_save_tip",
+    "type": "text",
+    "value": "Are you sure you want to save job \"{0}\"?"
+  },
+  "job_status": {
+    "key": "job_status",
+    "type": "text",
+    "value": "Job Status"
+  },
+  "job_workstation": {
+    "key": "job_workstation",
+    "type": "text",
+    "value": "Job Area"
+  },
+  "key_exception_tag": {
+    "key": "key_exception_tag",
+    "type": "text",
+    "value": "This key has been flagged as abnormal"
+  },
+  "key_in_use": {
+    "key": "key_in_use",
+    "type": "text",
+    "value": "Key is in use"
+  },
+  "key_info_already_exists": {
+    "key": "key_info_already_exists",
+    "type": "text",
+    "value": "Key information already exists"
+  },
+  "key_is_in_failure_mode": {
+    "key": "key_is_in_failure_mode",
+    "type": "text",
+    "value": "Key is in failure mode"
+  },
+  "key_mac": {
+    "key": "key_mac",
+    "type": "text",
+    "value": "Key MAC"
+  },
+  "key_manage_delete_failed": {
+    "key": "key_manage_delete_failed",
+    "type": "text",
+    "value": "Failed to delete key"
+  },
+  "key_manage_delete_succeed": {
+    "key": "key_manage_delete_succeed",
+    "type": "text",
+    "value": "Key deleted successfully"
+  },
+  "key_manage_key_detail_title": {
+    "key": "key_manage_key_detail_title",
+    "type": "text",
+    "value": "Key Details"
+  },
+  "key_manage_new_key_title": {
+    "key": "key_manage_new_key_title",
+    "type": "text",
+    "value": "Add New Key"
+  },
+  "key_manage_title": {
+    "key": "key_manage_title",
+    "type": "text",
+    "value": "Key Management"
+  },
+  "key_name": {
+    "key": "key_name",
+    "type": "text",
+    "value": "Key Name"
+  },
+  "key_nfc": {
+    "key": "key_nfc",
+    "type": "text",
+    "value": "Key NFC"
+  },
+  "key_not_exists": {
+    "key": "key_not_exists",
+    "type": "text",
+    "value": "Key does not exist"
+  },
+  "key_return_success": {
+    "key": "key_return_success",
+    "type": "text",
+    "value": "Key returned successfully"
+  },
+  "key_return_tip": {
+    "key": "key_return_tip",
+    "type": "text",
+    "value": "Job ticket not completed; returning key is prohibited"
+  },
+  "key_take_error_tip": {
+    "key": "key_take_error_tip",
+    "type": "text",
+    "value": "Key allocation failed; please check hardware status"
+  },
+  "loading_data": {
+    "key": "loading_data",
+    "type": "text",
+    "value": "Loading data"
+  },
+  "loading_device": {
+    "key": "loading_device",
+    "type": "text",
+    "value": "Loading hardware..."
+  },
+  "loading_msg_get_ticket_status_start": {
+    "key": "loading_msg_get_ticket_status_start",
+    "type": "text",
+    "value": "Reading key job ticket"
+  },
+  "loading_msg_return_key_start": {
+    "key": "loading_msg_return_key_start",
+    "type": "text",
+    "value": "Connecting to key, please wait..."
+  },
+  "lock": {
+    "key": "lock",
+    "type": "text",
+    "value": "Padlock"
+  },
+  "lock_already_exists": {
+    "key": "lock_already_exists",
+    "type": "text",
+    "value": "Lock information already exists"
+  },
+  "lock_code": {
+    "key": "lock_code",
+    "type": "text",
+    "value": "Lock Number"
+  },
+  "lock_exception_tag": {
+    "key": "lock_exception_tag",
+    "type": "text",
+    "value": "This lock has been flagged as abnormal"
+  },
+  "lock_in_use": {
+    "key": "lock_in_use",
+    "type": "text",
+    "value": "Lock is currently in use"
+  },
+  "lock_is_not_enough": {
+    "key": "lock_is_not_enough",
+    "type": "text",
+    "value": "Insufficient lock quantity"
+  },
+  "lock_key_return_tip": {
+    "key": "lock_key_return_tip",
+    "type": "text",
+    "value": "Job ticket not completed; force upload data?"
+  },
+  "lock_manage_delete_failed": {
+    "key": "lock_manage_delete_failed",
+    "type": "text",
+    "value": "Failed to delete lock"
+  },
+  "lock_manage_delete_succeed": {
+    "key": "lock_manage_delete_succeed",
+    "type": "text",
+    "value": "Lock deleted successfully"
+  },
+  "lock_manage_lock_detail_title": {
+    "key": "lock_manage_lock_detail_title",
+    "type": "text",
+    "value": "Lock Details"
+  },
+  "lock_manage_new_lock_title": {
+    "key": "lock_manage_new_lock_title",
+    "type": "text",
+    "value": "Add New Lock"
+  },
+  "lock_manage_title": {
+    "key": "lock_manage_title",
+    "type": "text",
+    "value": "Lock Management"
+  },
+  "lock_name": {
+    "key": "lock_name",
+    "type": "text",
+    "value": "Lock Name"
+  },
+  "lock_nfc": {
+    "key": "lock_nfc",
+    "type": "text",
+    "value": "Lock NFC"
+  },
+  "lock_status": {
+    "key": "lock_status",
+    "type": "text",
+    "value": "Lock Status"
+  },
+  "lock_take_report_fail": {
+    "key": "lock_take_report_fail",
+    "type": "text",
+    "value": "Lock removal reporting failed"
+  },
+  "locked_points_title": {
+    "key": "locked_points_title",
+    "type": "text",
+    "value": "Locked Points"
+  },
+  "locked_points_tv": {
+    "key": "locked_points_tv",
+    "type": "text",
+    "value": "Locked Points"
+  },
+  "locker": {
+    "key": "locker",
+    "type": "text",
+    "value": "Locker"
+  },
+  "login": {
+    "key": "login",
+    "type": "text",
+    "value": "Login"
+  },
+  "login_tip": {
+    "key": "login_tip",
+    "type": "text",
+    "value": "Please enter username and password or swipe card to login"
+  },
+  "loto": {
+    "key": "loto",
+    "type": "text",
+    "value": "Intelligent Lock Control System"
+  },
+  "loto_en": {
+    "key": "loto_en",
+    "type": "text",
+    "value": "Intelligent Lock Control System"
+  },
+  "manage_filter_status": {
+    "key": "manage_filter_status",
+    "type": "text",
+    "value": "Status"
+  },
+  "manage_role_function_permission": {
+    "key": "manage_role_function_permission",
+    "type": "text",
+    "value": "Function Permissions"
+  },
+  "member_info_title": {
+    "key": "member_info_title",
+    "type": "text",
+    "value": "Personnel Information"
+  },
+  "move_down": {
+    "key": "move_down",
+    "type": "text",
+    "value": "Move Down"
+  },
+  "move_up": {
+    "key": "move_up",
+    "type": "text",
+    "value": "Move Up"
+  },
+  "my_todo_title": {
+    "key": "my_todo_title",
+    "type": "text",
+    "value": "My To-Do"
+  },
+  "navigate_to_step": {
+    "key": "navigate_to_step",
+    "type": "text",
+    "value": "Navigate to Step {0}"
+  },
+  "new_device": {
+    "key": "new_device",
+    "type": "text",
+    "value": "New Device"
+  },
+  "new_group": {
+    "key": "new_group",
+    "type": "text",
+    "value": "New Group {0}"
+  },
+  "new_password": {
+    "key": "new_password",
+    "type": "text",
+    "value": "New Password (6-20 characters: letters, numbers, special symbols)"
+  },
+  "new_password_and_repeat_new_password_not_same": {
+    "key": "new_password_and_repeat_new_password_not_same",
+    "type": "text",
+    "value": "New password and repeated password do not match"
+  },
+  "new_password_cannot_be_the_same_as_the_old_password": {
+    "key": "new_password_cannot_be_the_same_as_the_old_password",
+    "type": "text",
+    "value": "New password cannot be the same as the old password"
+  },
+  "next": {
+    "key": "next",
+    "type": "text",
+    "value": "Next"
+  },
+  "nickname": {
+    "key": "nickname",
+    "type": "text",
+    "value": "Name"
+  },
+  "no_available_key": {
+    "key": "no_available_key",
+    "type": "text",
+    "value": "No available keys"
+  },
+  "no_data": {
+    "key": "no_data",
+    "type": "text",
+    "value": "No data"
+  },
+  "no_goto_step": {
+    "key": "no_goto_step",
+    "type": "text",
+    "value": "No jump step"
+  },
+  "no_permission_to_handle": {
+    "key": "no_permission_to_handle",
+    "type": "text",
+    "value": "You do not have permission to operate the current job ticket"
+  },
+  "no_response_board_exists": {
+    "key": "no_response_board_exists",
+    "type": "text",
+    "value": "Unresponsive main board exists"
+  },
+  "normal": {
+    "key": "normal",
+    "type": "text",
+    "value": "Normal"
+  },
+  "not_group_can_lock": {
+    "key": "not_group_can_lock",
+    "type": "text",
+    "value": "No group available for locking"
+  },
+  "not_group_can_unlock": {
+    "key": "not_group_can_unlock",
+    "type": "text",
+    "value": "No group available for unlocking"
+  },
+  "not_in_slot": {
+    "key": "not_in_slot",
+    "type": "text",
+    "value": "Not in slot"
+  },
+  "not_save_tip": {
+    "key": "not_save_tip",
+    "type": "text",
+    "value": "Data not saved yet. Are you sure you want to discard changes and leave this page?"
+  },
+  "number": {
+    "key": "number",
+    "type": "text",
+    "value": "Number:"
+  },
+  "old_password": {
+    "key": "old_password",
+    "type": "text",
+    "value": "Old Password"
+  },
+  "old_password_error": {
+    "key": "old_password_error",
+    "type": "text",
+    "value": "Incorrect old password"
+  },
+  "one_key_cancel": {
+    "key": "one_key_cancel",
+    "type": "text",
+    "value": "One-Click Cancel"
+  },
+  "one_key_handle": {
+    "key": "one_key_handle",
+    "type": "text",
+    "value": "One-Click Handle"
+  },
+  "ongoing_job_tv": {
+    "key": "ongoing_job_tv",
+    "type": "text",
+    "value": "Ongoing Jobs"
+  },
+  "only_one_person_allowed": {
+    "key": "only_one_person_allowed",
+    "type": "text",
+    "value": "Only one person allowed in view"
+  },
+  "operation": {
+    "key": "operation",
+    "type": "text",
+    "value": "Operation"
+  },
+  "password_and_repeat_password_not_same": {
+    "key": "password_and_repeat_password_not_same",
+    "type": "text",
+    "value": "Password and repeated password do not match"
+  },
+  "password_regex_tip": {
+    "key": "password_regex_tip",
+    "type": "text",
+    "value": "Password does not meet requirements"
+  },
+  "phone": {
+    "key": "phone",
+    "type": "text",
+    "value": "Phone"
+  },
+  "please_do_colock": {
+    "key": "please_do_colock",
+    "type": "text",
+    "value": "Please complete co-locking"
+  },
+  "please_do_uncolock": {
+    "key": "please_do_uncolock",
+    "type": "text",
+    "value": "Please release co-locking"
+  },
+  "please_done_operation": {
+    "key": "please_done_operation",
+    "type": "text",
+    "value": "Please complete {0} first"
+  },
+  "please_go_locking": {
+    "key": "please_go_locking",
+    "type": "text",
+    "value": "Please proceed to locking operation"
+  },
+  "please_go_unlocking": {
+    "key": "please_go_unlocking",
+    "type": "text",
+    "value": "Please proceed to unlocking operation"
+  },
+  "please_input_account": {
+    "key": "please_input_account",
+    "type": "text",
+    "value": "Please enter username"
+  },
+  "please_input_admin_username": {
+    "key": "please_input_admin_username",
+    "type": "text",
+    "value": "Please enter admin account"
+  },
+  "please_input_area": {
+    "key": "please_input_area",
+    "type": "text",
+    "value": "Please enter area"
+  },
+  "please_input_card_code": {
+    "key": "please_input_card_code",
+    "type": "text",
+    "value": "Please enter work card number"
+  },
+  "please_input_card_nfc": {
+    "key": "please_input_card_nfc",
+    "type": "text",
+    "value": "Please enter card NFC"
+  },
+  "please_input_correct_phone": {
+    "key": "please_input_correct_phone",
+    "type": "text",
+    "value": "Please enter a valid phone number"
+  },
+  "please_input_exception_reason": {
+    "key": "please_input_exception_reason",
+    "type": "text",
+    "value": "Please enter exception reason"
+  },
+  "please_input_job_name": {
+    "key": "please_input_job_name",
+    "type": "text",
+    "value": "Please enter job name"
+  },
+  "please_input_key_mac": {
+    "key": "please_input_key_mac",
+    "type": "text",
+    "value": "Please enter key MAC"
+  },
+  "please_input_key_name": {
+    "key": "please_input_key_name",
+    "type": "text",
+    "value": "Please enter key name"
+  },
+  "please_input_key_nfc": {
+    "key": "please_input_key_nfc",
+    "type": "text",
+    "value": "Please enter key NFC"
+  },
+  "please_input_key_word": {
+    "key": "please_input_key_word",
+    "type": "text",
+    "value": "Please enter keyword"
+  },
+  "please_input_lock_code": {
+    "key": "please_input_lock_code",
+    "type": "text",
+    "value": "Please enter lock number"
+  },
+  "please_input_lock_nfc": {
+    "key": "please_input_lock_nfc",
+    "type": "text",
+    "value": "Please enter lock NFC"
+  },
+  "please_input_new_password": {
+    "key": "please_input_new_password",
+    "type": "text",
+    "value": "Please enter new password"
+  },
+  "please_input_nickname": {
+    "key": "please_input_nickname",
+    "type": "text",
+    "value": "Please enter name"
+  },
+  "please_input_old_password": {
+    "key": "please_input_old_password",
+    "type": "text",
+    "value": "Please enter old password"
+  },
+  "please_input_password": {
+    "key": "please_input_password",
+    "type": "text",
+    "value": "Please enter password"
+  },
+  "please_input_permission_characters": {
+    "key": "please_input_permission_characters",
+    "type": "text",
+    "value": "Please enter permission characters"
+  },
+  "please_input_phone": {
+    "key": "please_input_phone",
+    "type": "text",
+    "value": "Please enter phone number"
+  },
+  "please_input_point_function": {
+    "key": "please_input_point_function",
+    "type": "text",
+    "value": "Please enter isolation point function"
+  },
+  "please_input_point_name": {
+    "key": "please_input_point_name",
+    "type": "text",
+    "value": "Please enter isolation point name"
+  },
+  "please_input_remark": {
+    "key": "please_input_remark",
+    "type": "text",
+    "value": "Please enter remark"
+  },
+  "please_input_remote_server_address": {
+    "key": "please_input_remote_server_address",
+    "type": "text",
+    "value": "Please enter server address"
+  },
+  "please_input_repeat_new_password": {
+    "key": "please_input_repeat_new_password",
+    "type": "text",
+    "value": "Please repeat new password"
+  },
+  "please_input_repeat_password": {
+    "key": "please_input_repeat_password",
+    "type": "text",
+    "value": "Please enter repeated password"
+  },
+  "please_input_rfid": {
+    "key": "please_input_rfid",
+    "type": "text",
+    "value": "Please enter RFID tag"
+  },
+  "please_input_rfid_code": {
+    "key": "please_input_rfid_code",
+    "type": "text",
+    "value": "Please enter RFID code"
+  },
+  "please_input_rfid_tag": {
+    "key": "please_input_rfid_tag",
+    "type": "text",
+    "value": "Please enter RFID tag"
+  },
+  "please_input_role_name": {
+    "key": "please_input_role_name",
+    "type": "text",
+    "value": "Please enter role name"
+  },
+  "please_input_sop_name": {
+    "key": "please_input_sop_name",
+    "type": "text",
+    "value": "Please enter SOP name"
+  },
+  "please_input_step_description": {
+    "key": "please_input_step_description",
+    "type": "text",
+    "value": "Please enter step operation instructions"
+  },
+  "please_input_step_title": {
+    "key": "please_input_step_title",
+    "type": "text",
+    "value": "Please enter step title"
+  },
+  "please_input_step_title_short": {
+    "key": "please_input_step_title_short",
+    "type": "text",
+    "value": "Please enter step title abbreviation"
+  },
+  "please_input_username": {
+    "key": "please_input_username",
+    "type": "text",
+    "value": "Please enter login name"
+  },
+  "please_input_workstation_name": {
+    "key": "please_input_workstation_name",
+    "type": "text",
+    "value": "Please enter area name"
+  },
+  "please_must_select_at_least_one_point": {
+    "key": "please_must_select_at_least_one_point",
+    "type": "text",
+    "value": "You must add at least one point"
+  },
+  "please_press_fingerprint_again": {
+    "key": "please_press_fingerprint_again",
+    "type": "text",
+    "value": "Please press fingerprint again"
+  },
+  "please_re_press_fingerprint_again": {
+    "key": "please_re_press_fingerprint_again",
+    "type": "text",
+    "value": "Please press fingerprint again"
+  },
+  "please_return_key_after_locking": {
+    "key": "please_return_key_after_locking",
+    "type": "text",
+    "value": "Please return key after locking operation"
+  },
+  "please_return_key_after_unlocking": {
+    "key": "please_return_key_after_unlocking",
+    "type": "text",
+    "value": "Please return key after unlocking operation"
+  },
+  "please_scan_face": {
+    "key": "please_scan_face",
+    "type": "text",
+    "value": "Please scan face"
+  },
+  "please_scan_fingerprint": {
+    "key": "please_scan_fingerprint",
+    "type": "text",
+    "value": "Please scan fingerprint"
+  },
+  "please_select_area": {
+    "key": "please_select_area",
+    "type": "text",
+    "value": "Please select area"
+  },
+  "please_select_card": {
+    "key": "please_select_card",
+    "type": "text",
+    "value": "Please select card"
+  },
+  "please_select_card_username": {
+    "key": "please_select_card_username",
+    "type": "text",
+    "value": "Please select user name"
+  },
+  "please_select_colocker": {
+    "key": "please_select_colocker",
+    "type": "text",
+    "value": "Please select co-locker"
+  },
+  "please_select_exception_description": {
+    "key": "please_select_exception_description",
+    "type": "text",
+    "value": "Please select exception description"
+  },
+  "please_select_exception_source": {
+    "key": "please_select_exception_source",
+    "type": "text",
+    "value": "Please select exception source"
+  },
+  "please_select_exception_type": {
+    "key": "please_select_exception_type",
+    "type": "text",
+    "value": "Please select exception type"
+  },
+  "please_select_flow_mode": {
+    "key": "please_select_flow_mode",
+    "type": "text",
+    "value": "Please select workflow mode"
+  },
+  "please_select_group": {
+    "key": "please_select_group",
+    "type": "text",
+    "value": "Please select group"
+  },
+  "please_select_handle_time": {
+    "key": "please_select_handle_time",
+    "type": "text",
+    "value": "Please select handling time"
+  },
+  "please_select_job": {
+    "key": "please_select_job",
+    "type": "text",
+    "value": "Please select job"
+  },
+  "please_select_job_workstation": {
+    "key": "please_select_job_workstation",
+    "type": "text",
+    "value": "Please select job area"
+  },
+  "please_select_key": {
+    "key": "please_select_key",
+    "type": "text",
+    "value": "Please select key"
+  },
+  "please_select_lock": {
+    "key": "please_select_lock",
+    "type": "text",
+    "value": "Please select lock"
+  },
+  "please_select_locker": {
+    "key": "please_select_locker",
+    "type": "text",
+    "value": "Please select locker"
+  },
+  "please_select_member": {
+    "key": "please_select_member",
+    "type": "text",
+    "value": "You can select personnel to add"
+  },
+  "please_select_point": {
+    "key": "please_select_point",
+    "type": "text",
+    "value": "Please select isolation point"
+  },
+  "please_select_power_type": {
+    "key": "please_select_power_type",
+    "type": "text",
+    "value": "Please select power source"
+  },
+  "please_select_process_application": {
+    "key": "please_select_process_application",
+    "type": "text",
+    "value": "Please select process application"
+  },
+  "please_select_rfid_token": {
+    "key": "please_select_rfid_token",
+    "type": "text",
+    "value": "Please select RFID tag"
+  },
+  "please_select_role": {
+    "key": "please_select_role",
+    "type": "text",
+    "value": "Please select role"
+  },
+  "please_select_sop": {
+    "key": "please_select_sop",
+    "type": "text",
+    "value": "Please select SOP"
+  },
+  "please_select_sop_workstation": {
+    "key": "please_select_sop_workstation",
+    "type": "text",
+    "value": "Please select SOP area"
+  },
+  "please_select_start_time": {
+    "key": "please_select_start_time",
+    "type": "text",
+    "value": "Please select start time first"
+  },
+  "please_select_status": {
+    "key": "please_select_status",
+    "type": "text",
+    "value": "Please select status"
+  },
+  "please_select_step_confirm_member": {
+    "key": "please_select_step_confirm_member",
+    "type": "text",
+    "value": "Please select execution confirmation personnel"
+  },
+  "please_select_step_confirm_role": {
+    "key": "please_select_step_confirm_role",
+    "type": "text",
+    "value": "Please select execution confirmation role"
+  },
+  "please_select_step_confirm_type": {
+    "key": "please_select_step_confirm_type",
+    "type": "text",
+    "value": "Please select execution confirmation method"
+  },
+  "please_select_user": {
+    "key": "please_select_user",
+    "type": "text",
+    "value": "Please select user"
+  },
+  "please_select_workflow_mode": {
+    "key": "please_select_workflow_mode",
+    "type": "text",
+    "value": "Please select workflow mode"
+  },
+  "please_select_workstation": {
+    "key": "please_select_workstation",
+    "type": "text",
+    "value": "Please select area"
+  },
+  "please_swipe_card": {
+    "key": "please_swipe_card",
+    "type": "text",
+    "value": "Please swipe card"
+  },
+  "please_take_out_ready_device_first": {
+    "key": "please_take_out_ready_device_first",
+    "type": "text",
+    "value": "Please remove devices with activated card locks first"
+  },
+  "please_wait_ticket_name_lock_complete": {
+    "key": "please_wait_ticket_name_lock_complete",
+    "type": "text",
+    "value": "Please wait for [{0}] to complete locking"
+  },
+  "point_detail": {
+    "key": "point_detail",
+    "type": "text",
+    "value": "Point Details"
+  },
+  "point_in_use": {
+    "key": "point_in_use",
+    "type": "text",
+    "value": "Point is in use and cannot be modified"
+  },
+  "point_info_title": {
+    "key": "point_info_title",
+    "type": "text",
+    "value": "Point Information"
+  },
+  "point_list_title": {
+    "key": "point_list_title",
+    "type": "text",
+    "value": "Point List"
+  },
+  "point_manage_add_title": {
+    "key": "point_manage_add_title",
+    "type": "text",
+    "value": "Add Point"
+  },
+  "point_manage_delete_failed": {
+    "key": "point_manage_delete_failed",
+    "type": "text",
+    "value": "Unable to delete isolation point"
+  },
+  "point_manage_delete_succeed": {
+    "key": "point_manage_delete_succeed",
+    "type": "text",
+    "value": "Isolation point deleted successfully"
+  },
+  "point_manage_point_function": {
+    "key": "point_manage_point_function",
+    "type": "text",
+    "value": "Isolation Point Function"
+  },
+  "point_manage_point_group": {
+    "key": "point_manage_point_group",
+    "type": "text",
+    "value": "Group Name"
+  },
+  "point_manage_point_name": {
+    "key": "point_manage_point_name",
+    "type": "text",
+    "value": "Isolation Point Name"
+  },
+  "point_manage_point_power_type": {
+    "key": "point_manage_point_power_type",
+    "type": "text",
+    "value": "Power Source"
+  },
+  "point_manage_rfid": {
+    "key": "point_manage_rfid",
+    "type": "text",
+    "value": "RFID"
+  },
+  "point_manage_rfid_tag": {
+    "key": "point_manage_rfid_tag",
+    "type": "text",
+    "value": "RFID Tag"
+  },
+  "point_manage_title": {
+    "key": "point_manage_title",
+    "type": "text",
+    "value": "Point Management"
+  },
+  "point_manage_update_title": {
+    "key": "point_manage_update_title",
+    "type": "text",
+    "value": "Edit Point"
+  },
+  "point_manage_workstation": {
+    "key": "point_manage_workstation",
+    "type": "text",
+    "value": "Area"
+  },
+  "point_name_tv": {
+    "key": "point_name_tv",
+    "type": "text",
+    "value": "Isolation Point"
+  },
+  "power_isolation_way": {
+    "key": "power_isolation_way",
+    "type": "text",
+    "value": "Confirm Isolation Method"
+  },
+  "preset_workflow_can_not_delete": {
+    "key": "preset_workflow_can_not_delete",
+    "type": "text",
+    "value": "Preset workflow mode cannot be deleted"
+  },
+  "previous": {
+    "key": "previous",
+    "type": "text",
+    "value": "Previous"
+  },
+  "process_application_tv": {
+    "key": "process_application_tv",
+    "type": "text",
+    "value": "Process Application"
+  },
+  "quick_entrance_most_set_tip": {
+    "key": "quick_entrance_most_set_tip",
+    "type": "text",
+    "value": "A maximum of 8 shortcuts can be set"
+  },
+  "quick_entrance_title": {
+    "key": "quick_entrance_title",
+    "type": "text",
+    "value": "Shortcut Configuration"
+  },
+  "re_recognize": {
+    "key": "re_recognize",
+    "type": "text",
+    "value": "Re-recognize"
+  },
+  "real_person_verification_required": {
+    "key": "real_person_verification_required",
+    "type": "text",
+    "value": "Please ensure real-person operation"
+  },
+  "recapture": {
+    "key": "recapture",
+    "type": "text",
+    "value": "Retake"
+  },
+  "recognize_work_content": {
+    "key": "recognize_work_content",
+    "type": "text",
+    "value": "Recognize Work Content"
+  },
+  "recognized_card_rfid": {
+    "key": "recognized_card_rfid",
+    "type": "text",
+    "value": "Recognized Card RFID"
+  },
+  "recognized_point_rfid": {
+    "key": "recognized_point_rfid",
+    "type": "text",
+    "value": "Recognized Point RFID"
+  },
+  "reduce_colocker": {
+    "key": "reduce_colocker",
+    "type": "text",
+    "value": "Reduce co-locker ({0})"
+  },
+  "register_failed": {
+    "key": "register_failed",
+    "type": "text",
+    "value": "Registration failed"
+  },
+  "register_success": {
+    "key": "register_success",
+    "type": "text",
+    "value": "Registration succeeded"
+  },
+  "release_colocker": {
+    "key": "release_colocker",
+    "type": "text",
+    "value": "Release Co-locking"
+  },
+  "remark": {
+    "key": "remark",
+    "type": "text",
+    "value": "Remark"
+  },
+  "repeat_new_password": {
+    "key": "repeat_new_password",
+    "type": "text",
+    "value": "Repeat New Password (6-20 characters: letters, numbers, special symbols)"
+  },
+  "repeat_password": {
+    "key": "repeat_password",
+    "type": "text",
+    "value": "Repeat Password (6-20 characters: letters, numbers, special symbols)"
+  },
+  "reset": {
+    "key": "reset",
+    "type": "text",
+    "value": "Reset"
+  },
+  "reset_data_tv": {
+    "key": "reset_data_tv",
+    "type": "text",
+    "value": "Click to reset"
+  },
+  "reset_password_title": {
+    "key": "reset_password_title",
+    "type": "text",
+    "value": "Reset Password"
+  },
+  "reset_user_password_failed": {
+    "key": "reset_user_password_failed",
+    "type": "text",
+    "value": "User password reset failed"
+  },
+  "reset_user_password_succeed": {
+    "key": "reset_user_password_succeed",
+    "type": "text",
+    "value": "User password reset succeeded"
+  },
+  "restart_app_after_set": {
+    "key": "restart_app_after_set",
+    "type": "text",
+    "value": "App will restart after settings are applied"
+  },
+  "rfid": {
+    "key": "rfid",
+    "type": "text",
+    "value": "RFID Tag"
+  },
+  "rfid_already_bind": {
+    "key": "rfid_already_bind",
+    "type": "text",
+    "value": "This RFID tag is already bound"
+  },
+  "rfid_already_registration": {
+    "key": "rfid_already_registration",
+    "type": "text",
+    "value": "RFID tag already registered"
+  },
+  "rfid_code": {
+    "key": "rfid_code",
+    "type": "text",
+    "value": "RFID Code"
+  },
+  "rfid_in_use": {
+    "key": "rfid_in_use",
+    "type": "text",
+    "value": "RFID tag in use, cannot modify"
+  },
+  "rfid_name": {
+    "key": "rfid_name",
+    "type": "text",
+    "value": "RFID Number"
+  },
+  "rfid_token_manage_delete_failed": {
+    "key": "rfid_token_manage_delete_failed",
+    "type": "text",
+    "value": "RFID tag deletion failed"
+  },
+  "rfid_token_manage_delete_succeed": {
+    "key": "rfid_token_manage_delete_succeed",
+    "type": "text",
+    "value": "RFID tag deleted successfully"
+  },
+  "rfid_token_manage_new_rfid_token_title": {
+    "key": "rfid_token_manage_new_rfid_token_title",
+    "type": "text",
+    "value": "Add RFID Tag"
+  },
+  "rfid_token_manage_rfid_token_detail_title": {
+    "key": "rfid_token_manage_rfid_token_detail_title",
+    "type": "text",
+    "value": "RFID Tag Details"
+  },
+  "rfid_token_manage_title": {
+    "key": "rfid_token_manage_title",
+    "type": "text",
+    "value": "RFID Management"
+  },
+  "role_in_preset_tip": {
+    "key": "role_in_preset_tip",
+    "type": "text",
+    "value": "Preset roles cannot be deleted"
+  },
+  "role_in_use": {
+    "key": "role_in_use",
+    "type": "text",
+    "value": "Role is in use in current jobs"
+  },
+  "role_key_already_exists": {
+    "key": "role_key_already_exists",
+    "type": "text",
+    "value": "Role permission characters already exist"
+  },
+  "role_manage_add_title": {
+    "key": "role_manage_add_title",
+    "type": "text",
+    "value": "Add Role"
+  },
+  "role_manage_delete_failed": {
+    "key": "role_manage_delete_failed",
+    "type": "text",
+    "value": "Unable to delete role"
+  },
+  "role_manage_delete_succeed": {
+    "key": "role_manage_delete_succeed",
+    "type": "text",
+    "value": "Role deleted successfully"
+  },
+  "role_manage_permission_string": {
+    "key": "role_manage_permission_string",
+    "type": "text",
+    "value": "Permission Characters"
+  },
+  "role_manage_role_name": {
+    "key": "role_manage_role_name",
+    "type": "text",
+    "value": "Role Name"
+  },
+  "role_manage_role_num": {
+    "key": "role_manage_role_num",
+    "type": "text",
+    "value": "Role Number"
+  },
+  "role_manage_title": {
+    "key": "role_manage_title",
+    "type": "text",
+    "value": "Role Management"
+  },
+  "save": {
+    "key": "save",
+    "type": "text",
+    "value": "Save"
+  },
+  "save_and_execute": {
+    "key": "save_and_execute",
+    "type": "text",
+    "value": "Save and Execute"
+  },
+  "save_sop_check": {
+    "key": "save_sop_check",
+    "type": "text",
+    "value": "Generate SOP"
+  },
+  "save_success": {
+    "key": "save_success",
+    "type": "text",
+    "value": "Saved successfully!"
+  },
+  "scan_complete_app_restarting": {
+    "key": "scan_complete_app_restarting",
+    "type": "text",
+    "value": "Scan complete, app will restart automatically"
+  },
+  "select": {
+    "key": "select",
+    "type": "text",
+    "value": "Select"
+  },
+  "select_colocker_tip": {
+    "key": "select_colocker_tip",
+    "type": "text",
+    "value": "Please select co-locker from the following personnel"
+  },
+  "select_coloker": {
+    "key": "select_coloker",
+    "type": "text",
+    "value": "Please select co-locker"
+  },
+  "select_group_tip": {
+    "key": "select_group_tip",
+    "type": "text",
+    "value": "Click empty space in group to select"
+  },
+  "select_locker": {
+    "key": "select_locker",
+    "type": "text",
+    "value": "Select Locker"
+  },
+  "select_locker_tip": {
+    "key": "select_locker_tip",
+    "type": "text",
+    "value": "Please select [{0}] as locker from the following personnel"
+  },
+  "select_member_title": {
+    "key": "select_member_title",
+    "type": "text",
+    "value": "Select Personnel"
+  },
+  "select_point_title": {
+    "key": "select_point_title",
+    "type": "text",
+    "value": "Select Point"
+  },
+  "selected_point_already_in_use": {
+    "key": "selected_point_already_in_use",
+    "type": "text",
+    "value": "Some selected points are already in use"
+  },
+  "selected_point_info_title": {
+    "key": "selected_point_info_title",
+    "type": "text",
+    "value": "Selected Point Information"
+  },
+  "selected_quick_entrance": {
+    "key": "selected_quick_entrance",
+    "type": "text",
+    "value": "Configured Shortcuts (up to 8, draggable)"
+  },
+  "selected_rfid_in_use": {
+    "key": "selected_rfid_in_use",
+    "type": "text",
+    "value": "Some selected RFID tags are in use"
+  },
+  "send_ticket_fail": {
+    "key": "send_ticket_fail",
+    "type": "text",
+    "value": "Job ticket issuance failed"
+  },
+  "sending_ticket": {
+    "key": "sending_ticket",
+    "type": "text",
+    "value": "Sending job ticket..."
+  },
+  "server_address": {
+    "key": "server_address",
+    "type": "text",
+    "value": "Server Address"
+  },
+  "server_address_error": {
+    "key": "server_address_error",
+    "type": "text",
+    "value": "Server address error"
+  },
+  "set_colocker": {
+    "key": "set_colocker",
+    "type": "text",
+    "value": "Set Co-locker"
+  },
+  "set_data_tv": {
+    "key": "set_data_tv",
+    "type": "text",
+    "value": "Click to set"
+  },
+  "set_face_title": {
+    "key": "set_face_title",
+    "type": "text",
+    "value": "Set Face"
+  },
+  "set_fingerprint_title": {
+    "key": "set_fingerprint_title",
+    "type": "text",
+    "value": "Set Fingerprint"
+  },
+  "set_job_card_title": {
+    "key": "set_job_card_title",
+    "type": "text",
+    "value": "Set Job Card"
+  },
+  "set_locker": {
+    "key": "set_locker",
+    "type": "text",
+    "value": "Set Locker"
+  },
+  "set_password": {
+    "key": "set_password",
+    "type": "text",
+    "value": "Set Password (6-20 characters: letters, numbers, special symbols)"
+  },
+  "settings": {
+    "key": "settings",
+    "type": "text",
+    "value": "Settings"
+  },
+  "show_member_when_selected_sop": {
+    "key": "show_member_when_selected_sop",
+    "type": "text",
+    "value": "Personnel information will be displayed automatically after selecting SOP"
+  },
+  "show_points_when_selected_sop": {
+    "key": "show_points_when_selected_sop",
+    "type": "text",
+    "value": "Point information will be displayed automatically after selecting SOP"
+  },
+  "shutdown": {
+    "key": "shutdown",
+    "type": "text",
+    "value": "Shutdown"
+  },
+  "ski_step": {
+    "key": "ski_step",
+    "type": "text",
+    "value": "Skip this step"
+  },
+  "skip_and_complete": {
+    "key": "skip_and_complete",
+    "type": "text",
+    "value": "Skip and Complete"
+  },
+  "slot_exception_tag": {
+    "key": "slot_exception_tag",
+    "type": "text",
+    "value": "This lock slot has been marked as abnormal"
+  },
+  "slots_exception_report": {
+    "key": "slots_exception_report",
+    "type": "text",
+    "value": "Slot Exception Report"
+  },
+  "slots_manage_title": {
+    "key": "slots_manage_title",
+    "type": "text",
+    "value": "Slot Management"
+  },
+  "sop_create_failed": {
+    "key": "sop_create_failed",
+    "type": "text",
+    "value": "SOP creation failed"
+  },
+  "sop_create_succeed": {
+    "key": "sop_create_succeed",
+    "type": "text",
+    "value": "SOP created successfully"
+  },
+  "sop_job_save_and_execute_failed": {
+    "key": "sop_job_save_and_execute_failed",
+    "type": "text",
+    "value": "SOP job execution failed"
+  },
+  "sop_job_save_and_execute_succeed": {
+    "key": "sop_job_save_and_execute_succeed",
+    "type": "text",
+    "value": "SOP job started successfully"
+  },
+  "sop_job_save_failed": {
+    "key": "sop_job_save_failed",
+    "type": "text",
+    "value": "SOP job save failed"
+  },
+  "sop_job_save_succeed": {
+    "key": "sop_job_save_succeed",
+    "type": "text",
+    "value": "SOP job saved successfully"
+  },
+  "sop_manage_delete_failed": {
+    "key": "sop_manage_delete_failed",
+    "type": "text",
+    "value": "Unable to delete selected SOP"
+  },
+  "sop_manage_delete_succeed": {
+    "key": "sop_manage_delete_succeed",
+    "type": "text",
+    "value": "Selected SOP deleted successfully"
+  },
+  "sop_manage_sop_name": {
+    "key": "sop_manage_sop_name",
+    "type": "text",
+    "value": "SOP Name"
+  },
+  "sop_manage_title": {
+    "key": "sop_manage_title",
+    "type": "text",
+    "value": "SOP Management"
+  },
+  "sop_manage_workstation": {
+    "key": "sop_manage_workstation",
+    "type": "text",
+    "value": "Workstation"
+  },
+  "sop_save_failed": {
+    "key": "sop_save_failed",
+    "type": "text",
+    "value": "SOP save failed"
+  },
+  "sop_save_succeed": {
+    "key": "sop_save_succeed",
+    "type": "text",
+    "value": "SOP saved successfully"
+  },
+  "sop_save_tip": {
+    "key": "sop_save_tip",
+    "type": "text",
+    "value": "Are you sure you want to save \"{0}\"?"
+  },
+  "sop_workstation": {
+    "key": "sop_workstation",
+    "type": "text",
+    "value": "SOP Area"
+  },
+  "start": {
+    "key": "start",
+    "type": "text",
+    "value": "Start"
+  },
+  "start_detect_key_slot": {
+    "key": "start_detect_key_slot",
+    "type": "text",
+    "value": "Start detecting key slot"
+  },
+  "start_detect_lock_slot": {
+    "key": "start_detect_lock_slot",
+    "type": "text",
+    "value": "Start detecting lock slot"
+  },
+  "start_scan_key_mac": {
+    "key": "start_scan_key_mac",
+    "type": "text",
+    "value": "Start scanning key information"
+  },
+  "start_time": {
+    "key": "start_time",
+    "type": "text",
+    "value": "Start Time"
+  },
+  "end_time_must_large_then_start_time": {
+    "key": "end_time_must_large_then_start_time",
+    "type": "text",
+    "value": "End time must be later than start time"
+  },
+  "start_tip": {
+    "key": "start_tip",
+    "type": "text",
+    "value": "Initialize the system according to the instructions"
+  },
+  "start_to_send_ticket": {
+    "key": "start_to_send_ticket",
+    "type": "text",
+    "value": "Start sending job ticket..."
+  },
+  "status": {
+    "key": "status",
+    "type": "text",
+    "value": "Status"
+  },
+  "step_confirm_failed": {
+    "key": "step_confirm_failed",
+    "type": "text",
+    "value": "Step confirmation failed"
+  },
+  "take_out_key": {
+    "key": "take_out_key",
+    "type": "text",
+    "value": "Please take out the key"
+  },
+  "take_out_key_tip": {
+    "key": "take_out_key_tip",
+    "type": "text",
+    "value": "Please take the key from the opened key slot"
+  },
+  "take_out_lock_tip": {
+    "key": "take_out_lock_tip",
+    "type": "text",
+    "value": "Please take the lock from the opened lock slot, {0} remaining"
+  },
+  "take_out_rest_locks": {
+    "key": "take_out_rest_locks",
+    "type": "text",
+    "value": "Please take out remaining locks with activated card locks"
+  },
+  "tec_support": {
+    "key": "tec_support",
+    "type": "text",
+    "value": "Wenzhou Doctor Safety Products Co., Ltd."
+  },
+  "the_verification_file_not_exists": {
+    "key": "the_verification_file_not_exists",
+    "type": "text",
+    "value": "Verification file does not exist"
+  },
+  "ticket_data_error": {
+    "key": "ticket_data_error",
+    "type": "text",
+    "value": "Job ticket data corrupted"
+  },
+  "ticket_get_failed": {
+    "key": "ticket_get_failed",
+    "type": "text",
+    "value": "Failed to obtain job ticket"
+  },
+  "ticket_lost": {
+    "key": "ticket_lost",
+    "type": "text",
+    "value": "Job ticket does not exist"
+  },
+  "time_frame_tv": {
+    "key": "time_frame_tv",
+    "type": "text",
+    "value": "Time Range"
+  },
+  "todo_header": {
+    "key": "todo_header",
+    "type": "text",
+    "value": "In Progress"
+  },
+  "turn_off": {
+    "key": "turn_off",
+    "type": "text",
+    "value": "Off"
+  },
+  "turn_on": {
+    "key": "turn_on",
+    "type": "text",
+    "value": "On"
+  },
+  "turn_read": {
+    "key": "turn_read",
+    "type": "text",
+    "value": "Read"
+  },
+  "uncolock_complete": {
+    "key": "uncolock_complete",
+    "type": "text",
+    "value": "Co-lock release successful"
+  },
+  "uncolock_failed": {
+    "key": "uncolock_failed",
+    "type": "text",
+    "value": "Co-lock release failed"
+  },
+  "unlock": {
+    "key": "unlock",
+    "type": "text",
+    "value": "Unlock"
+  },
+  "unlock_and_restore_switch": {
+    "key": "unlock_and_restore_switch",
+    "type": "text",
+    "value": "Unlock and restore switch"
+  },
+  "unzip": {
+    "key": "unzip",
+    "type": "text",
+    "value": "Unzipping… {0}"
+  },
+  "update_card_failed": {
+    "key": "update_card_failed",
+    "type": "text",
+    "value": "Update card failed"
+  },
+  "update_card_succeed": {
+    "key": "update_card_succeed",
+    "type": "text",
+    "value": "Card updated successfully"
+  },
+  "update_key_failed": {
+    "key": "update_key_failed",
+    "type": "text",
+    "value": "Update key failed"
+  },
+  "update_key_succeed": {
+    "key": "update_key_succeed",
+    "type": "text",
+    "value": "Key updated successfully"
+  },
+  "update_lock_failed": {
+    "key": "update_lock_failed",
+    "type": "text",
+    "value": "Update lock failed"
+  },
+  "update_lock_succeed": {
+    "key": "update_lock_succeed",
+    "type": "text",
+    "value": "Lock updated successfully"
+  },
+  "update_point_failed": {
+    "key": "update_point_failed",
+    "type": "text",
+    "value": "Save point failed"
+  },
+  "update_point_succeed": {
+    "key": "update_point_succeed",
+    "type": "text",
+    "value": "Point saved successfully"
+  },
+  "update_rfid_token_failed": {
+    "key": "update_rfid_token_failed",
+    "type": "text",
+    "value": "Update RFID tag failed"
+  },
+  "update_rfid_token_succeed": {
+    "key": "update_rfid_token_succeed",
+    "type": "text",
+    "value": "RFID tag updated successfully"
+  },
+  "update_role_failed": {
+    "key": "update_role_failed",
+    "type": "text",
+    "value": "Role update failed"
+  },
+  "update_role_succeed": {
+    "key": "update_role_succeed",
+    "type": "text",
+    "value": "Role updated successfully"
+  },
+  "update_user_failed": {
+    "key": "update_user_failed",
+    "type": "text",
+    "value": "User update failed"
+  },
+  "update_user_succeed": {
+    "key": "update_user_succeed",
+    "type": "text",
+    "value": "User updated successfully"
+  },
+  "update_workstation_failed": {
+    "key": "update_workstation_failed",
+    "type": "text",
+    "value": "Update area failed"
+  },
+  "update_workstation_succeed": {
+    "key": "update_workstation_succeed",
+    "type": "text",
+    "value": "Area updated successfully"
+  },
+  "user_already_exists": {
+    "key": "user_already_exists",
+    "type": "text",
+    "value": "User already exists"
+  },
+  "user_info_title": {
+    "key": "user_info_title",
+    "type": "text",
+    "value": "Personal Information"
+  },
+  "user_manage_area": {
+    "key": "user_manage_area",
+    "type": "text",
+    "value": "Area"
+  },
+  "user_manage_card_code": {
+    "key": "user_manage_card_code",
+    "type": "text",
+    "value": "Job Card"
+  },
+  "user_manage_delete_failed": {
+    "key": "user_manage_delete_failed",
+    "type": "text",
+    "value": "Unable to delete user"
+  },
+  "user_manage_delete_succeed": {
+    "key": "user_manage_delete_succeed",
+    "type": "text",
+    "value": "User deleted successfully"
+  },
+  "user_manage_filter_activate": {
+    "key": "user_manage_filter_activate",
+    "type": "text",
+    "value": "Active"
+  },
+  "user_manage_filter_deactivate": {
+    "key": "user_manage_filter_deactivate",
+    "type": "text",
+    "value": "Inactive"
+  },
+  "user_manage_filter_title": {
+    "key": "user_manage_filter_title",
+    "type": "text",
+    "value": "Filter Criteria"
+  },
+  "user_manage_new_user_title": {
+    "key": "user_manage_new_user_title",
+    "type": "text",
+    "value": "Add User"
+  },
+  "user_manage_role": {
+    "key": "user_manage_role",
+    "type": "text",
+    "value": "Role"
+  },
+  "user_manage_title": {
+    "key": "user_manage_title",
+    "type": "text",
+    "value": "User Management"
+  },
+  "user_manage_user_detail_title": {
+    "key": "user_manage_user_detail_title",
+    "type": "text",
+    "value": "User Details"
+  },
+  "user_manage_view": {
+    "key": "user_manage_view",
+    "type": "text",
+    "value": "View"
+  },
+  "user_name": {
+    "key": "user_name",
+    "type": "text",
+    "value": "Login Name"
+  },
+  "username": {
+    "key": "username",
+    "type": "text",
+    "value": "Username"
+  },
+  "username_or_password_error": {
+    "key": "username_or_password_error",
+    "type": "text",
+    "value": "Incorrect username or password"
+  },
+  "username_passowrd_login_success": {
+    "key": "username_passowrd_login_success",
+    "type": "text",
+    "value": "Username and password verified successfully"
+  },
+  "username_password_not_exists": {
+    "key": "username_password_not_exists",
+    "type": "text",
+    "value": "Username or password does not exist"
+  },
+  "username_regex_tip": {
+    "key": "username_regex_tip",
+    "type": "text",
+    "value": "Username does not meet requirements"
+  },
+  "verify_failed": {
+    "key": "verify_failed",
+    "type": "text",
+    "value": "Verification failed"
+  },
+  "view": {
+    "key": "view",
+    "type": "text",
+    "value": "View"
+  },
+  "wait_header": {
+    "key": "wait_header",
+    "type": "text",
+    "value": "Waiting"
+  },
+  "wait_to_colock": {
+    "key": "wait_to_colock",
+    "type": "text",
+    "value": "Pending co-lock ({0})"
+  },
+  "warn": {
+    "key": "warn",
+    "type": "text",
+    "value": "Warning"
+  },
+  "welcome_tip": {
+    "key": "welcome_tip",
+    "type": "text",
+    "value": "Hello, welcome"
+  },
+  "workflow_already_exists": {
+    "key": "workflow_already_exists",
+    "type": "text",
+    "value": "Workflow mode already exists"
+  },
+  "workflow_manage_title": {
+    "key": "workflow_manage_title",
+    "type": "text",
+    "value": "Workflow Mode Management"
+  },
+  "workflow_mode": {
+    "key": "workflow_mode",
+    "type": "text",
+    "value": "Workflow Mode"
+  },
+  "workflow_mode_manage_delete_succeed": {
+    "key": "workflow_mode_manage_delete_succeed",
+    "type": "text",
+    "value": "Workflow mode deleted successfully"
+  },
+  "workflow_mode_status_update_failed": {
+    "key": "workflow_mode_status_update_failed",
+    "type": "text",
+    "value": "Status update failed"
+  },
+  "workflow_mode_status_update_succeed": {
+    "key": "workflow_mode_status_update_succeed",
+    "type": "text",
+    "value": "Status updated successfully"
+  },
+  "workflow_name": {
+    "key": "workflow_name",
+    "type": "text",
+    "value": "Workflow Mode Name"
+  },
+  "workflow_setting": {
+    "key": "workflow_setting",
+    "type": "text",
+    "value": "Workflow Settings"
+  },
+  "workflow_step_confirm_member": {
+    "key": "workflow_step_confirm_member",
+    "type": "text",
+    "value": "Execution confirmation personnel"
+  },
+  "workflow_step_confirm_role": {
+    "key": "workflow_step_confirm_role",
+    "type": "text",
+    "value": "Execution confirmation role"
+  },
+  "workflow_step_confirm_type": {
+    "key": "workflow_step_confirm_type",
+    "type": "text",
+    "value": "Execution confirmation method"
+  },
+  "workflow_step_description": {
+    "key": "workflow_step_description",
+    "type": "text",
+    "value": "Step Instructions"
+  },
+  "workflow_step_function": {
+    "key": "workflow_step_function",
+    "type": "text",
+    "value": "Step Function"
+  },
+  "workflow_step_title": {
+    "key": "workflow_step_title",
+    "type": "text",
+    "value": "Step Title"
+  },
+  "workflow_step_title_short": {
+    "key": "workflow_step_title_short",
+    "type": "text",
+    "value": "Step Title Abbreviation"
+  },
+  "workstation_already_exists": {
+    "key": "workstation_already_exists",
+    "type": "text",
+    "value": "Area already exists"
+  },
+  "workstation_is_in_bottom": {
+    "key": "workstation_is_in_bottom",
+    "type": "text",
+    "value": "Area is already at the bottom"
+  },
+  "workstation_is_in_top": {
+    "key": "workstation_is_in_top",
+    "type": "text",
+    "value": "Area is already at the top"
+  },
+  "workstation_manage_delete_failed": {
+    "key": "workstation_manage_delete_failed",
+    "type": "text",
+    "value": "Unable to delete area {0}"
+  },
+  "workstation_manage_delete_succeed": {
+    "key": "workstation_manage_delete_succeed",
+    "type": "text",
+    "value": "Area {0} deleted successfully"
+  },
+  "workstation_manage_new_workstation": {
+    "key": "workstation_manage_new_workstation",
+    "type": "text",
+    "value": "Add Area"
+  },
+  "workstation_manage_title": {
+    "key": "workstation_manage_title",
+    "type": "text",
+    "value": "Area Management"
+  },
+  "workstation_manage_workstation_name": {
+    "key": "workstation_manage_workstation_name",
+    "type": "text",
+    "value": "Area Name"
+  },
+  "you_are_not_locker_tip": {
+    "key": "you_are_not_locker_tip",
+    "type": "text",
+    "value": "You are not the locker and cannot perform this operation"
+  },
+  "zone": {
+    "key": "zone",
+    "type": "text",
+    "value": "Area Range"
+  },
+  "backup_title": {
+    "key": "backup_title",
+    "type": "text",
+    "value": "Backup/Restore"
+  },
+  "backup": {
+    "key": "backup",
+    "type": "text",
+    "value": "Backup"
+  },
+  "backup_path": {
+    "key": "backup_path",
+    "type": "text",
+    "value": "Backup Path"
+  },
+  "maximum_number_of_backups": {
+    "key": "maximum_number_of_backups",
+    "type": "text",
+    "value": "Maximum Number of Backups"
+  },
+  "auto_backup": {
+    "key": "auto_backup",
+    "type": "text",
+    "value": "Auto Backup"
+  },
+  "common_enable": {
+    "key": "common_enable",
+    "type": "text",
+    "value": "Enable"
+  },
+  "common_disable": {
+    "key": "common_disable",
+    "type": "text",
+    "value": "Disable"
+  },
+  "backup_frequency": {
+    "key": "backup_frequency",
+    "type": "text",
+    "value": "Backup Frequency"
+  },
+  "backup_time": {
+    "key": "backup_time",
+    "type": "text",
+    "value": "Backup Time"
+  },
+  "backup_tip": {
+    "key": "backup_tip",
+    "type": "text",
+    "value": "Note: The app must remain running during auto backup."
+  },
+  "backup_now": {
+    "key": "backup_now",
+    "type": "text",
+    "value": "Backup Now"
+  },
+  "backup_range": {
+    "key": "backup_range",
+    "type": "text",
+    "value": "Range: {0}"
+  },
+  "restore": {
+    "key": "restore",
+    "type": "text",
+    "value": "Restore"
+  },
+  "common_batch_export": {
+    "key": "common_batch_export",
+    "type": "text",
+    "value": "Batch Export"
+  },
+  "common_batch_delete": {
+    "key": "common_batch_delete",
+    "type": "text",
+    "value": "Batch Delete"
+  },
+  "common_export": {
+    "key": "common_export",
+    "type": "text",
+    "value": "Export"
+  },
+  "MON": {
+    "key": "MON",
+    "type": "text",
+    "value": "Monday"
+  },
+  "TUE": {
+    "key": "TUE",
+    "type": "text",
+    "value": "Tuesday"
+  },
+  "WED": {
+    "key": "WED",
+    "type": "text",
+    "value": "Wednesday"
+  },
+  "THU": {
+    "key": "THU",
+    "type": "text",
+    "value": "Thursday"
+  },
+  "FRI": {
+    "key": "FRI",
+    "type": "text",
+    "value": "Friday"
+  },
+  "SAT": {
+    "key": "SAT",
+    "type": "text",
+    "value": "Saturday"
+  },
+  "SUN": {
+    "key": "SUN",
+    "type": "text",
+    "value": "Sunday"
+  },
+  "backup_frequency_every_day": {
+    "key": "backup_frequency_every_day",
+    "type": "text",
+    "value": "Every Day"
+  },
+  "please_select_backup_frequency": {
+    "key": "please_select_backup_frequency",
+    "type": "text",
+    "value": "Please select a backup frequency"
+  },
+  "maximumNumberOfBackupsNotCorrect": {
+    "key": "maximumNumberOfBackupsNotCorrect",
+    "type": "text",
+    "value": "Please enter a valid maximum number of backups"
+  },
+  "please_select_time": {
+    "key": "please_select_time",
+    "type": "text",
+    "value": "Please select a time"
+  },
+  "backup_now_please_wait": {
+    "key": "backup_now_please_wait",
+    "type": "text",
+    "value": "Backing up,please wait…"
+  },
+  "backup_success": {
+    "key": "backup_success",
+    "type": "text",
+    "value": "Backup Successful"
+  },
+  "backup_failed": {
+    "key": "backup_failed",
+    "type": "text",
+    "value": "Backup Failed"
+  },
+  "delete_backup_file_confirm": {
+    "key": "delete_backup_file_confirm",
+    "type": "text",
+    "value": "Are you sure you want to delete this backup? Once deleted,it cannot be recovered."
+  },
+  "delete_selected_backup_file_confirm": {
+    "key": "delete_selected_backup_file_confirm",
+    "type": "text",
+    "value": "Are you sure you want to delete the selected backups? Once deleted,they cannot be recovered."
+  },
+  "restore_backup_confirm": {
+    "key": "restore_backup_confirm",
+    "type": "text",
+    "value": "Restoring a backup will erase all data from the backup date to now. Are you sure you want to continue?"
+  },
+  "restore_backup_success": {
+    "key": "restore_backup_success",
+    "type": "text",
+    "value": "Backup restored successfully"
+  },
+  "export_success": {
+    "key": "export_success",
+    "type": "text",
+    "value": "Export Successful"
+  },
+  "no_backup_data": {
+    "key": "no_backup_data",
+    "type": "text",
+    "value": "No backup data available"
+  },
+  "loading_backup": {
+    "key": "loading_backup",
+    "type": "text",
+    "value": "Reading backup file…"
+  },
+  "max_backup_tip": {
+    "key": "max_backup_tip",
+    "type": "text",
+    "value": "The maximum number of backups has been reached. Continuing will remove the oldest backup."
+  },
+  "switch": {
+    "key": "switch",
+    "type": "text",
+    "value": "Switch"
+  },
+  "backup_restoring": {
+    "key": "backup_restoring",
+    "type": "text",
+    "value": "Restoring backup…"
+  },
+  "point_manage_switch_icon": {
+    "key": "point_manage_switch_icon",
+    "type": "text",
+    "value": "Switch Icon"
+  },
+  "user_manage": {
+    "key": "user_manage",
+    "type": "text",
+    "value": "User Management"
+  },
+  "role_manage": {
+    "key": "role_manage",
+    "type": "text",
+    "value": "Role Management"
+  },
+  "workstation_manage": {
+    "key": "workstation_manage",
+    "type": "text",
+    "value": "Area Management"
+  },
+  "point_manage": {
+    "key": "point_manage",
+    "type": "text",
+    "value": "Point Management"
+  },
+  "backup_and_restore": {
+    "key": "backup_and_restore",
+    "type": "text",
+    "value": "Backup / Restore"
+  },
+  "in_progress_job": {
+    "key": "in_progress_job",
+    "type": "text",
+    "value": "Jobs in Progress"
+  },
+  "create_sop": {
+    "key": "create_sop",
+    "type": "text",
+    "value": "Create SOP"
+  },
+  "sop_manage": {
+    "key": "sop_manage",
+    "type": "text",
+    "value": "SOP Management"
+  },
+  "create_job": {
+    "key": "create_job",
+    "type": "text",
+    "value": "Create Job"
+  },
+  "job_manage": {
+    "key": "job_manage",
+    "type": "text",
+    "value": "Job Management"
+  },
+  "workflow_manage": {
+    "key": "workflow_manage",
+    "type": "text",
+    "value": "Workflow Mode Management"
+  },
+  "create_sop_job": {
+    "key": "create_sop_job",
+    "type": "text",
+    "value": "Create SOP Job"
+  },
+  "locked_point": {
+    "key": "locked_point",
+    "type": "text",
+    "value": "Locked Points"
+  },
+  "slot_manage": {
+    "key": "slot_manage",
+    "type": "text",
+    "value": "Slot Management"
+  },
+  "key_manage": {
+    "key": "key_manage",
+    "type": "text",
+    "value": "Key Management"
+  },
+  "lock_manage": {
+    "key": "lock_manage",
+    "type": "text",
+    "value": "Padlock Management"
+  },
+  "card_manage": {
+    "key": "card_manage",
+    "type": "text",
+    "value": "Card Management"
+  },
+  "rfid_manage": {
+    "key": "rfid_manage",
+    "type": "text",
+    "value": "RFID Management"
+  },
+  "exception_manage": {
+    "key": "exception_manage",
+    "type": "text",
+    "value": "Exception Management"
+  },
+  "user_info": {
+    "key": "user_info",
+    "type": "text",
+    "value": "Personal Information"
+  },
+  "reset_password": {
+    "key": "reset_password",
+    "type": "text",
+    "value": "Reset Password"
+  },
+  "fingerprint_setting": {
+    "key": "fingerprint_setting",
+    "type": "text",
+    "value": "Fingerprint Settings"
+  },
+  "face_setting": {
+    "key": "face_setting",
+    "type": "text",
+    "value": "Face Settings"
+  },
+  "card_setting": {
+    "key": "card_setting",
+    "type": "text",
+    "value": "Card Settings"
+  },
+  "logout": {
+    "key": "logout",
+    "type": "text",
+    "value": "Log Out"
+  },
+  "todo_list": {
+    "key": "todo_list",
+    "type": "text",
+    "value": "My To-Dos"
+  },
+  "hardware_manage": {
+    "key": "hardware_manage",
+    "type": "text",
+    "value": "Hardware Management"
+  },
+  "job_ticket_manage": {
+    "key": "job_ticket_manage",
+    "type": "text",
+    "value": "Job Ticket Management"
+  },
+  "data_manage": {
+    "key": "data_manage",
+    "type": "text",
+    "value": "Data Management"
+  },
+  "home": {
+    "key": "home",
+    "type": "text",
+    "value": "Home"
+  },
+  "auto_confirm": {
+    "key": "auto_confirm",
+    "type": "text",
+    "value": "Auto Confirm"
+  },
+  "click_confirm": {
+    "key": "click_confirm",
+    "type": "text",
+    "value": "Click Confirm"
+  },
+  "role_confirm": {
+    "key": "role_confirm",
+    "type": "text",
+    "value": "Role Confirmation"
+  },
+  "admin": {
+    "key": "admin",
+    "type": "text",
+    "value": "Super Admin"
+  },
+  "jtdrawer": {
+    "key": "jtdrawer",
+    "type": "text",
+    "value": "Job Manager"
+  },
+  "jtlocker": {
+    "key": "jtlocker",
+    "type": "text",
+    "value": "Job Lead"
+  },
+  "jtcolocker": {
+    "key": "jtcolocker",
+    "type": "text",
+    "value": "Job Participant"
+  },
+  "jtguard": {
+    "key": "jtguard",
+    "type": "text",
+    "value": "Job Observer"
+  },
+  "sysconfig": {
+    "key": "sysconfig",
+    "type": "text",
+    "value": "System Configurator"
+  },
+  "force_shared_lock": {
+    "key": "force_shared_lock",
+    "type": "text",
+    "value": "Forced Shared-Lock Mode"
+  },
+  "force_multi_lock": {
+    "key": "force_multi_lock",
+    "type": "text",
+    "value": "Forced Multi-Lock Mode"
+  },
+  "mixed_mode": {
+    "key": "mixed_mode",
+    "type": "text",
+    "value": "Mixed Mode"
+  },
+  "lock_take_key": {
+    "key": "lock_take_key",
+    "type": "text",
+    "value": "Start Locking"
+  },
+  "lock_return_key": {
+    "key": "lock_return_key",
+    "type": "text",
+    "value": "Finish Locking"
+  },
+  "unlock_take_key": {
+    "key": "unlock_take_key",
+    "type": "text",
+    "value": "Start Unlocking"
+  },
+  "unlock_return_key": {
+    "key": "unlock_return_key",
+    "type": "text",
+    "value": "Finish Unlocking"
+  },
+  "release_colock": {
+    "key": "release_colock",
+    "type": "text",
+    "value": "Release Co-lock"
+  },
+  "confirm_exec": {
+    "key": "confirm_exec",
+    "type": "text",
+    "value": "Confirm Execution"
+  },
+  "unknown": {
+    "key": "unknown",
+    "type": "text",
+    "value": "Unknown To-Do"
+  },
+  "not_start": {
+    "key": "not_start",
+    "type": "text",
+    "value": "Not Started"
+  },
+  "select_member": {
+    "key": "select_member",
+    "type": "text",
+    "value": "Select Member"
+  },
+  "locking": {
+    "key": "locking",
+    "type": "text",
+    "value": "Locking"
+  },
+  "colocking": {
+    "key": "colocking",
+    "type": "text",
+    "value": "Co-locking"
+  },
+  "unlocking": {
+    "key": "unlocking",
+    "type": "text",
+    "value": "Unlocking"
+  },
+  "finished": {
+    "key": "finished",
+    "type": "text",
+    "value": "Finished"
+  },
+  "canceled": {
+    "key": "canceled",
+    "type": "text",
+    "value": "Canceled"
+  },
+  "progressing": {
+    "key": "progressing",
+    "type": "text",
+    "value": "In Progress"
+  },
+  "hydraulic_pressure": {
+    "key": "hydraulic_pressure",
+    "type": "text",
+    "value": "Hydraulic"
+  },
+  "electric_energy": {
+    "key": "electric_energy",
+    "type": "text",
+    "value": "Electrical Energy"
+  },
+  "potential_energy": {
+    "key": "potential_energy",
+    "type": "text",
+    "value": "Potential Energy"
+  },
+  "heat_energy": {
+    "key": "heat_energy",
+    "type": "text",
+    "value": "Thermal Energy"
+  },
+  "gas": {
+    "key": "gas",
+    "type": "text",
+    "value": "Gas"
+  },
+  "mechanical_energy": {
+    "key": "mechanical_energy",
+    "type": "text",
+    "value": "Mechanical Energy"
+  },
+  "air_energy": {
+    "key": "air_energy",
+    "type": "text",
+    "value": "Compressed Air"
+  },
+  "apply_master_key": {
+    "key": "apply_master_key",
+    "type": "text",
+    "value": "Apply for Master Key"
+  },
+  "apply_finish_job": {
+    "key": "apply_finish_job",
+    "type": "text",
+    "value": "Apply to Finish Job"
+  },
+  "apply_scrap_slot": {
+    "key": "apply_scrap_slot",
+    "type": "text",
+    "value": "Apply to Scrap Slot"
+  },
+  "apply_scrap_lock": {
+    "key": "apply_scrap_lock",
+    "type": "text",
+    "value": "Apply to Scrap Padlock"
+  },
+  "apply_scrap_key": {
+    "key": "apply_scrap_key",
+    "type": "text",
+    "value": "Apply to Scrap Key"
+  },
+  "slot_damage": {
+    "key": "slot_damage",
+    "type": "text",
+    "value": "Damaged Slot"
+  },
+  "lock_damage": {
+    "key": "lock_damage",
+    "type": "text",
+    "value": "Damaged Padlock"
+  },
+  "key_damage": {
+    "key": "key_damage",
+    "type": "text",
+    "value": "Damaged Key"
+  },
+  "job_cat_not_exec": {
+    "key": "job_cat_not_exec",
+    "type": "text",
+    "value": "Job Ticket Not Executable"
+  },
+  "pending": {
+    "key": "pending",
+    "type": "text",
+    "value": "Pending"
+  },
+  "processed": {
+    "key": "processed",
+    "type": "text",
+    "value": "Processed"
+  },
+  "canceld": {
+    "key": "canceld",
+    "type": "text",
+    "value": "Canceled"
+  },
+  "key": {
+    "key": "key",
+    "type": "text",
+    "value": "Key"
+  },
+  "slot": {
+    "key": "slot",
+    "type": "text",
+    "value": "Slot"
+  },
+  "job": {
+    "key": "job",
+    "type": "text",
+    "value": "Job"
+  },
+  "job_exception": {
+    "key": "job_exception",
+    "type": "text",
+    "value": "Job Exception"
+  },
+  "hardware_exception": {
+    "key": "hardware_exception",
+    "type": "text",
+    "value": "Hardware Exception"
+  }
+}

+ 0 - 764
app/src/main/assets/i18n/zh-CN.csv

@@ -1,764 +0,0 @@
-key,type,comment,value
-i18n.language_name,text,语言自称,中文
-abnormal,text,添加修改数据界面的状态的显示文本,异常
-account_login,text,登录界面的账号密码登录的文本,用户名登录
-action_confirm,text,提示弹窗的标题,操作确认
-action_confirm_content,text,点击步骤确认时的消息,确定要执行{0}吗?
-action_failed,text,提示弹窗的标题,操作失败
-action_hint,text,提示弹窗的标题,操作提醒
-action_succeed,text,提示弹窗的标题,操作成功
-add_card_failed,text,提示弹窗的内容,添加卡片失败
-add_card_succeed,text,提示弹窗的内容,添加卡片成功
-add_colocker,text,流程模式设置,步骤功能显示,添加共锁人({0})
-add_group,text,选择点位的时候的分组添加的按钮,添加分组
-add_key_failed,text,添加钥匙失败的弹窗的内容,新增钥匙失败
-add_key_succeed,text,添加钥匙成功的弹窗的内容,新增钥匙成功
-add_lock_failed,text,添加挂锁失败的弹窗的内容,添加挂锁失败
-add_lock_succeed,text,添加挂锁成功的弹窗的内容,添加挂锁成功
-add_point_failed,text,添加隔离点失败的弹窗的内容,新增隔离点失败
-add_point_succeed,text,添加隔离点成功的弹窗的内容,新增隔离点成功
-add_rfid_token_failed,text,添加RFID失败的弹窗的内容,添加RFID标签失败
-add_rfid_token_succeed,text,添加RFID成功的弹窗的内容,添加RFID标签成功
-add_role_failed,text,添加角色失败的弹窗的内容,新增角色失败
-add_role_succeed,text,添加角色成功的弹窗的内容,新增角色成功
-add_user_succeed,text,添加用户成功的弹窗的内容,新增用户成功
-add_workstation_failed,text,添加区域失败的弹窗的内容,新增区域失败
-add_workstation_succeed,text,添加区域成功的弹窗的内容,新增区域成功
-admin_role_can_not_edit,text,管理员信息修改的提示内容,管理员角色无法编辑
-admin_username,text,初始化超级管理员时的账号的标题,管理员账号:(数字、字母、6-20位)
-all,text,下拉框的全部文本,全部
-all_hardware_tv,text,首页的全部硬件文本,全部硬件
-all_job_tv,text,首页的全部作业文本,全部作业
-all_points_tv,text,首页的全部点位文本,全部点位
-all_quick_entrance,text,快捷入口的配置弹窗的备选快捷入口的文本,所有快捷入口
-all_select_not_all_select,text,角色添加/修改弹窗中权限菜单选矿的文本,全选/全不选
-already_colock,text,作业执行界面的共锁人员界面的标题文本,已共锁({0})
-already_uncolock,text,作业执行界面的共锁人员界面的标题文本,已解除共锁({0})
-back,text,通用返回文本,返回
-base_info_title,text,作业创建/修改,SOP创建/修改的基本信息标题文本,基本信息
-ble_connect_fail,text,蓝牙连接失败的加载弹窗提示文本,连接失败,请重试!
-ble_connecting,text,蓝牙连接中的加载弹窗的提示文本,连接中,请稍后...
-can_not_remove_current_colocker,text,选择共锁人时只有一个共锁人时移除触发的提示文本,无法移除当前共锁人
-can_not_remove_current_locker,text,选择上锁人时,非选择人员步骤不允许移除上锁人提示文本,无法移除当前上锁人
-cancel,text,通用取消文本,取消
-cancel_countdown,text,提示框的取消倒计时文本,取消({0}秒)
-cancel_exception,text,异常管理详情/异常作业详情界面的按钮文本,取消异常
-cancel_exception_failed,text,取消异常完成之后提示弹窗文本,取消异常失败
-cancel_exception_success,text,取消异常完成之后提示弹窗文本,异常取消成功
-cancel_job,text,作业执行界面的按钮文本,取消作业
-cancel_job_tip,text,取消作业的二次确认弹窗文本,是否确认取消当前作业
-capture_tip_content,text,人脸录入时的提示文本,1. 系统将自动拍摄照片,在拍摄过程中请确保:
-      · 脸部正对摄像头
-      · 保持适当距离,让整个脸部出现在左侧框中
-      · 光线充足
-      · 表情自然
-2. 拍摄完成后,您可以点击确认按钮进行提交,也可以点击重拍按钮重新进行拍摄。
-3. 取消录入,请点击取消按钮
-capture_tip_title,text,录入人脸时的标题文本,录入提示
-card_already_registration,text,卡片录入时已存在卡片保存是的错误文本,卡片已录入
-card_code,text,卡片管理表头文本,卡片名称
-card_login,text,登录界面的刷卡登录文本,刷卡登录
-card_manage_card_detail_title,text,卡片管理表头文本,卡片详情
-card_manage_delete_failed,text,卡片管理删除卡片失败时的提示弹窗文本,卡片删除失败
-card_manage_delete_succeed,text,卡片管理删除卡片成功时的提示弹窗文本,卡片删除成功
-card_manage_new_card_title,text,添加卡片弹窗的标题文本,新增卡片
-card_manage_title,text,卡片管理界面的标题文本,卡片管理
-card_nfc,text,卡片管理表头文本,卡片 NFC
-change_to_standard,text,设置远程服务地址时的切换版本按钮文本,切换标准版
-check_before_unlocking,text,八大步骤(玛氏)的步骤流程名称,检查使用,取锁前检查
-check_delete_card,text,删除卡片时的二次确认弹窗文本,确定要删除选中的卡片吗?
-check_delete_job,text,删除作业时的二次确认弹窗文本,您确认要删除作业吗
-check_delete_key,text,删除钥匙时的二次确认弹窗文本,您确定要删除选中的钥匙吗
-check_delete_lock,text,删除挂锁时的二次确认弹窗文本,确定要删除选中的挂锁吗?
-check_delete_point,text,删除隔离点时的二次确认弹窗文本,您确定要删除隔离点吗
-check_delete_rfid_token,text,删除RFID标签时的二次确认弹窗文本,确定要删除选中的RFID标签吗?
-check_delete_role,text,删除角色时的二次确认弹窗文本,您确认要删除角色吗
-check_delete_sop,text,删除SOP时的二次确认弹窗文本,您确定要删除选中的SOP吗
-check_delete_user,text,删除用户时的二次确认弹窗文本,您确认要删除用户吗?
-check_delete_workflow_mode,text,删除流程模式时的二次确认弹窗文本,确定要删除选中的流程模式吗
-check_delete_workstation,text,删除区域时的二次确认弹窗文本,您确定要删除区域"{0}"吗
-check_device_info,text,初始化界面检测硬件完成之后的检测信息结果文本,检测到未注册钥匙{0}把,未注册挂锁{1}把
-check_key_and_lock,text,初始化界面检测硬件时的文本,正在检查钥匙和挂锁
-check_lock_is_new_device,text,仓位管理检查挂锁的加载弹窗的文本,检查挂锁是否为新硬件
-check_new_key_need_register,text,仓位管理检测到新钥匙是否注册的提示弹窗的文本,检测到新钥匙,是否注册
-check_new_lock_need_register,text,仓位管理检测到新挂锁是否注册的提示弹窗的文本,检测到新挂锁,是否注册
-close,text,通用关闭文本,关闭
-colock,text,流程模式设置,步骤功能显示,共锁
-colock_complete,text,作业执行界面添加共锁完成弹窗的文本,添加共锁完成
-colock_failed,text,作业执行界面添加共锁失败弹窗的文本,添加共锁失败
-colocker,text,通用共锁人文本,共锁人
-confirm,text,通用确认文本,确定
-confirm_cancel_exception,text,取消异常时的二次确认弹窗文本,是否确认取消异常
-confirm_create_lock_job,text,解锁-上锁任务,完成解锁步骤之后,处理异常之后的提示弹窗文本,确认是否创建上锁作业
-confirm_create_unlock_job,text,上锁-解锁任务,完成上锁步骤之后,处理异常之后的提示弹窗文本,是否创建解锁作业
-confirm_handle_exception,text,处理异常时的二次确认弹窗文本,是否确认处理异常
-confirm_to_colock,text,共锁人添加共锁时的弹窗确认文本,{0}是否确认共锁?
-confirm_to_uncolock,text,共锁人解除共锁时的弹窗确认文本,{0}是否确认解除共锁?
-continue_the_ticket,text,作业票未完成归还钥匙之后,如果不强制上传数据的提示文本,请继续完成作业票
-create_job_failed,text,处理异常之后新建作业创建时创建失败的弹窗文本,创建作业失败
-create_job_name,text,创建作业/编辑作业的基本信息中的作业名称文本,作业名称
-create_job_title,text,新建作业的标题文本,新建作业
-create_sop_job_sop,text,新建SOP作业选择Sop文本,SOP
-create_sop_job_tip,text,保存并执行作业时的二次确认弹窗,确定要执行作业"{0}"吗?
-create_sop_job_title,text,新建SOP作业标题,新建SOP作业
-create_sop_name,text,新建SOP的sop名称文本,SOP名称
-create_sop_title,text,新建SOP的标题,新建SOP
-current_job_has_cross_job,text,处理异常时的交叉作业警告弹窗,警告!当前作业存在交叉作业,是否继续处理异常
-current_role_no_user,text,流程模式编辑确认方式角色确认时,如果选择的角色无用户时提示,当前角色暂无用户
-current_slot_has_no_key,text,仓位管理检查钥匙时如果仓内没有钥匙时弹窗提示,当前仓位不存在钥匙
-current_slot_has_no_lock,text,仓位管理检查挂锁时如果仓内没有挂锁时弹窗提示,当前仓位不存在挂锁
-current_sop_has_job_in_progress,text,删除sop作业时如果存在关联作业弹窗提示文本,当前SOP存在进行中的作业
-current_ticket_report_lock_take_exception_tip,text,挂锁取出时,如果作业异常提示文本,当前作业挂锁上报异常,请归还挂锁
-current_user_has_not_face_data,text,选择人员界面,如果头像为空时点击提示,当前用户不存在人脸数据
-current_workflow_mode_error,text,进行流程模式设置界面,如果流程模式数据获取异常时提示,当前流程模式错误
-currently_no_hardware_can_be_report,text,异常上报,类型为硬件异常但是没有硬件数据时提示,当前没有硬件可以上报
-currently_no_job_can_be_report,text,异常上报,类型为作业异常但是没有作业数据时提示,当前没有作业可以上报
-currently_unable_to_lock_together,text,作业执行界面,如果步骤未在共锁步骤,刷卡提示,当前阶段无法共锁
-data_content_error,text,导入流程模式时如果解密之后的内容转换异常时提示,数据内容错误
-data_decrypt_failed,text,导入流程模式时如果数据解密失败时提示,数据解密失败
-data_file_is_corrupted,text,导入流程模式时如果数据文件的校验码错误时提示,数据文件已损坏
-data_file_not_exists,text,导入流程模式时如果数据文件不存在时提示,数据文件不存在
-date,text,时间范围选择弹窗格式,{0}年{1}月{2}日
-delete,text,通用删除文本,删除
-delete_group,text,选择点位的时候的分组删除的按钮,删除分组
-delete_success,text,流程模式和指纹删除成功的弹窗文本,删除成功
-detail,text,通用表头文本,详情
-detect_face_tip,text,人脸录入时检测到人脸的提示文本,检测到人脸,即将拍摄
-detect_port,text,仓位管理进入的加载文本,正在扫描设备......
-detect_slot,text,仓位管理的检测按钮文本,检测仓位
-device_in_detect,text,初始化硬件的时候的识别中提示文本,设备识别中
-do_you_want_to_remove_exception,text,仓位管理长按移除异常的二次确认弹窗文本,是否确认移除该异常
-doing_checking,text,步骤确认验证人脸时的加载提示文本,正在验证......
-doing_login,text,登录时的加载提示文本,正在登录······
-done_header,text,我的待办的tab文本,已处理
-edit,text,通用编辑文本,编辑
-edit_job_title,text,编辑作业的标题文本,作业详情
-edit_sop_job_title,text,编辑SOP作业的标题文本,SOP作业详情
-edit_sop_title,text,编辑SOP的标题文本,SOP详情
-end,text,选择时间范围的结束时间的文本,结束
-end_job,text,作业执行界面的按钮文本,结束作业
-end_time,text,首页的时间范围的文本,结束时间
-ensure_power_isolation,text,八大步骤(玛氏)的步骤流程名称,检查使用,能量隔离证实
-error_date_range_invalid,text,时间范围选择时的检查提示文本,开始时间不能晚于结束时间
-exception_data_not_exists,text,处理异常时,异常数据不存在的提示弹窗文本,异常数据不存在
-exception_description,text,异常管理详情的表头,异常描述:
-exception_description_tv,text,异常上报的内容标题,异常描述
-exception_detail_title,text,异常管理详情的标题,异常详情
-exception_info,text,异常管理详情的的表头,异常信息
-exception_job,text,异常作业的详情的表头,异常作业:
-exception_job_title,text,异常作业的标题,异常作业
-exception_lost,text,异常作业的数据不存在的情况下提示,异常丢失
-exception_manage_title,text,异常管理的标题,异常管理
-exception_occurrence_time,text,异常管理详情的表头,异常发生时间:
-exception_occurrence_time_header,text,异常管理的表头,发生时间
-exception_reason,text,仓位管理异常上报的弹窗信息,异常信息
-exception_release_time,text,异常管理详情的表头,异常解除时间:
-exception_report,text,仓位异常上报和异常上报的标题,异常上报
-exception_report_success,text,异常上报成功之后的弹窗提示,异常上报成功
-exception_reporter,text,异常管理详情的表头,上报人:
-exception_source,text,异常管理详情的表头,异常源:
-exception_source_tv,text,异常上报的内容标题,异常源
-exception_status,text,异常管理详情的表头,状态:
-exception_status_header,text,异常管理的表头,异常状态
-exception_type,text,异常管理详情的表头,异常类型:
-exception_type_header,text,异常管理列表的表头,异常类型
-exception_type_tv,text,异常上报的内容标题,异常类型
-expand_collapse,text,添加/修改角色的权限树的操作文本,展开/折叠
-face_can_not_process,text,虹软初始化失败时的提示文本,人脸引擎激活失败,识别暂不可用
-face_detected_do_login,text,人脸登录的加载窗提示文本,检测到人脸,正在登录······
-face_login,text,登录界面的人脸登录文本,人脸登录
-face_login_failed,text,人脸登录失败时的提示文本,人脸匹配失败,请重试
-face_login_success,text,人脸登录成功时的提示文本,人脸验证通过
-face_not_set_tip,text,用户信息的人脸设置界面未设置人脸的显示文本,您尚未设置人脸数据
-face_set_tip,text,用户信息的人脸设置界面已设置人脸的显示文本,您已设置了人脸数据
-file_not_exists,text,流程模式导入时如果指定文件不存在时提示,文件不存在
-filter,text,通用筛选文本,筛选
-fingerprint_add_success_tip,text,指纹添加成功时的弹窗文本,已成功添加指纹数据
-fingerprint_code,text,指纹列表的表头,指纹编号
-fingerprint_code_str,text,指纹列表的数据前缀,指纹_{0}
-fingerprint_delete_confirm_tip,text,指纹列表指纹项删除指纹的二次确认弹窗文本,确定要删除{0}吗?
-fingerprint_delete_selected_confirm_tip,text,指纹列表删除指纹的二次确认弹窗文本,确定要删除选中的指纹吗?
-fingerprint_login,text,登录界面的指纹登录文本,指纹登录
-fingerprint_login_failed,text,登录界面的指纹登录失败提示文本 ,指纹识别失败,请重试
-fingerprint_login_success,text,登录界面的指纹登录成功提示文本,指纹验证通过
-fingerprint_scan_tip,text,录入指纹时的提示录入提示文本,请连续按压{0}次指纹识别区
-finish_job_tip,text,作业执行界面结束作业的二次确认弹窗文本,是否确认结束当前作业
-finish_the_job,text,作业执行界面的结束作业按钮文本,结束作业
-get_key_info_fail,text,钥匙数据获取失败时的提示文本,获取钥匙信息失败
-go_locking,text,作业执行界面的去上锁按钮文本,去上锁
-go_unlocking,text,作业执行界面的去解锁按钮文本,去解锁
-group_at_least_has_one_point,text,选择点位确认按钮检查分组点位的错误提示文本,每个分组至少需要存在一个点位
-group_job_in_progress,text,分组已经获取钥匙未归还的情况再次点击的提示文本,分组作业进行中
-group_name_must_not_empty,text,选择点位分组名称为空时保存的错误提示文本,分组名称不能为空
-handle,text,我的待办的处理按钮文本,处理
-handle_colock,text,我的待办处理共锁时的二次确认弹窗文本,请确认是否要进行添加共锁
-handle_exception,text,异常详情和异常作业的处理异常的按钮文本,处理异常
-handle_exception_success,text,异常处理成功的弹窗文本,异常处理成功
-handle_exception_will_release_all_colock,text,异常作业的已经共锁的作业结束时的警告弹窗文本,警告!处理异常将移除所有共锁,请确认是否继续
-handle_failed,text,异常处理失败的弹窗提示文本,处理失败
-handle_lock_take_key,text,我的待办上锁取钥匙时的二次确认弹窗文本,确认获取钥匙进行上锁吗?
-handle_release_colock,text,我的待办的解除共锁时的二次确认弹窗文本,请确认是否要进行解除共锁
-handle_step_confirm,text,我的待办的步骤确认时的二次确认弹窗文本,请确认是否完成[{0}]
-handle_time,text,异常管理详情的表头,处理时间:
-handle_time_custom_time_range,text,我的待办的已处理的时间筛选的选择项文本,自定义区间
-handle_time_last_30_days,text,我的待办的已处理的时间筛选的选择项文本,近30天
-handle_time_last_7_days,text,我的待办的已处理的时间筛选的选择项文本,近7天
-handle_unknown,text,我的待办的处理项类型异常的提示文本,当前处理类型未知,无法处理
-handle_unlock_take_key,text,我的待办解锁取钥匙时的二次确认弹窗文本,确认获取钥匙进行解锁吗?
-hardware_in_use_tv,text,首页使用中的硬件文本,使用中的硬件
-hardware_info,text,仓位异常上报的信息展示,硬件信息: {0}
-hardware_key,text,仓位异常上报的硬件类型文本,钥匙
-hardware_lock,text,仓位异常上报的硬件类型文本,挂锁
-hardware_unknown,text,仓位异常上报的硬件类型文本,未知
-has_job_in_progress,text,作业管理删除作业时有作业存在时的弹窗文本,存在正在进行中的作业
-has_locked,text,作业执行界面的点位上锁状态文本,已上锁
-has_user_in_progress_job,text,删除用户时如果关联用户的作业有进行中的时候弹窗文本,有用户在进行的作业中
-home_overview_data_title,text,首页总览数据标题,总览数据
-home_realtime_data_title,text,首页试试数据标题,实时数据
-import_str,text,通用导入文本,导入
-import_success,text,通用导入成功文本,导入成功
-in_progress_job_manage_title,text,进行中的作业的标题,进行中的作业
-init_card_registration_step_hint,text,初始化卡片注册时的提示文本,请在读卡器上刷卡
-init_card_registration_step_tip,text,初始化卡片注册时的标题文本,识别并录入卡片
-init_device_registration_key_and_lock_complete_step_hint,text,初始化硬件的时候的扫描完成的提示文本,扫描完成
-init_device_registration_key_and_lock_step_hint,text,初始化硬件的时候的扫描中的提示文本,请等待系统识别钥匙和挂锁
-init_device_registration_key_and_lock_step_tip,text,初始化硬件的时候的标题文本,识别钥匙和挂锁
-init_point_rfid_registration_step_hint,text,初始化点位注册的时候的提示文本,请在读卡器上刷点位RFID标签
-init_point_rfid_registration_step_tip,text,初始化点位注册的时候的标题文本,识别并录入点位RFID标签
-init_set_admin_account_step,text,初始化设置管理员账号时的步骤序号,1
-init_set_admin_account_step_hint,text,初始化设置管理员账号时的提示文本,请设置管理员账号密码
-init_set_admin_account_step_tip,text,初始化设置管理员账号时的标题文本,设置管理员账号
-init_set_remote_server_step_hint,text,设置远程服务器地址的提示文本,请设置服务器的地址和端口
-init_set_remote_server_step_tip,text,设置远程服务器地市的标题文本,配置服务器
-insert,text,通用新增文本,新增
-invalid_card,text,作业执行界面和我的待办界面的共锁人刷卡时卡片无效的提示文本,卡片无效
-invalid_user,text,作业执行界面和我的待办界面的共锁人刷卡时用户不存在的提示文本,用户不存在
-item_my_todo_complete_time_title,text,我的待办信息的头文本,完成时间:
-item_my_todo_current_operation_title,text,我的待办信息的头文本,当前操作:
-item_my_todo_current_step_title,text,我的待办信息的头文本,当前步骤:
-item_my_todo_job_name_title,text,我的待办信息的头文本,相关作业:
-job_already_finished,text,作业执行界面,收到作业被结束的消息的提示文本,该作业已被结束
-job_canceled,text,作业管理已取消的作业点击提示文本,作业已取消
-job_card_login_failed,text,工卡登录失败的提示文本,工卡无效
-job_card_login_success,text,工卡登录成功的提示文本,工卡识别成功
-job_card_not_set_tip,text,设置工卡界面,还没有设置工卡时的文本信息,您尚未设置工卡
-job_card_scan_tip,text,设置工卡界面,设置工卡的提示文本,请在读卡器上读卡
-job_card_set_tip,text,设置工卡界面,已经设置工卡时的文本信息,您已设置了工卡数据
-job_create_and_execute_failed,text,保存并执行作业失败时的弹窗提示文本,作业执行失败
-job_create_and_execute_succeed,text,保存并执行作业成功时的弹窗提示文本,作业开始执行
-job_create_failed,text,保存作业失败时的弹窗提示文本,作业保存失败
-job_create_succeed,text,保存作业成功时的弹窗提示文本,作业保存成功
-job_execute_colocker_colock_status_title,text,作业执行界面和异常作业界面的共锁人标题,共锁人员共锁状态
-job_execute_lock_status_title,text,作业执行界面和异常作业界面的点位标题,隔离点锁定状态
-job_execute_step_description,text,作业执行界面和异常作业界面的操作说明标题,操作说明({0})
-job_execute_tab_title_colock,text,作业执行界面和异常作业界面的共锁人TAB标题,共锁
-job_execute_tab_title_lock,text,作业执行界面和异常作业界面的点位TAB标题,锁定
-job_execute_title,text,作业执行界面标题,作业执行
-job_finished,text,作业管理的已结束作业点击提示文本,作业已结束
-job_lost,text,作业执行界面的作业数据不存在的文本,作业丢失
-job_manage_delete_failed,text,作业管理删除作业失败时的弹窗提示文本,无法删除选中的作业
-job_manage_delete_succeed,text,作业管理删除作业成功时的弹窗提示文本,删除选中的作业成功
-job_manage_title,text,作业管理标题,作业管理
-job_name,text,作业观猎列表表头,作业名称
-job_save_and_execute_tip,text,保存并执行作业时二次确认弹窗文本,确定要执行作业"{0}"吗?
-job_save_tip,text,保存作业二次确认弹窗文本,确定要保存作业"{0}"吗?
-job_status,text,锁定中的点位表头,作业状态
-job_workstation,text,创建/修改作业的基本信息的文本,作业区域
-key_exception_tag,text,还钥匙的时候如果钥匙异常提示,该钥匙已被标记异常
-key_in_use,text,钥匙管理列表删除钥匙时如果钥匙使用中提示,钥匙正在使用
-key_info_already_exists,text,仓位管理检查钥匙仓位注册时如果钥匙信息已存在提示,钥匙信息已存在
-key_is_in_failure_mode,text,钥匙状态查询为故障的时候输出到日志,钥匙处于故障模式
-key_mac,text,添加钥匙弹窗的信息文本,钥匙MAC
-key_manage_delete_failed,text,钥匙管理删除失败时弹窗文本,钥匙删除失败
-key_manage_delete_succeed,text,钥匙管理删除成功时弹窗文本,钥匙删除成功
-key_manage_key_detail_title,text,钥匙详情标题,钥匙详情
-key_manage_new_key_title,text,新增钥匙标题,新增钥匙
-key_manage_title,text,钥匙管理标题,钥匙管理
-key_name,text,钥匙管理表头,钥匙名称
-key_nfc,text,钥匙管理表头,钥匙NFC
-key_not_exists,text,切换工作模式之后,没有找到钥匙信息时提示,钥匙不存在
-key_return_success,text,钥匙归还之后信息上报成功之后提示,钥匙归还成功
-key_return_tip,text,上报点位信息异常时提示文本,作业票尚未完成,禁止归还钥匙
-key_take_error_tip,text,获取挂锁之后,获取钥匙信息失败时提示,钥匙分配失败,请检查硬件状态
-loading_data,text,通用数据加载弹窗文本,数据加载中
-loading_device,text,仓位管理加载中文本,正在加载硬件......
-loading_msg_get_ticket_status_start,text,开始读取作业票加载中文本,正在读取钥匙作业票
-loading_msg_return_key_start,text,开始连接钥匙加载中文本,开始连接钥匙,请稍候······
-lock,text,流程模式设置,步骤功能显示,上锁
-lock_already_exists,text,仓位管理检查挂锁和挂锁列表添加挂锁信息存在时提示,挂锁信息已存在
-lock_code,text,挂锁列表表头,挂锁编号
-lock_exception_tag,text,还挂锁时挂锁异常提示,该挂锁已被标记异常
-lock_in_use,text,挂锁管理删除挂锁时,如果挂锁使用中提示,挂锁正在使用中
-lock_is_not_enough,text,去上锁是,挂锁数量不足时提示,锁具数量不足
-lock_key_return_tip,text,还钥匙时,如果作业票未完成提示是否强制上传,作业票尚未完成,是否强制上传数据
-lock_manage_delete_failed,text,挂锁删除失败时提示,挂锁删除失败
-lock_manage_delete_succeed,text,挂锁删除成功时提示,挂锁删除成功
-lock_manage_lock_detail_title,text,挂锁详情标题,挂锁详情
-lock_manage_new_lock_title,text,新增挂锁标题,新增挂锁
-lock_manage_title,text,挂锁管理标题,挂锁管理
-lock_name,text,挂锁管理表头,挂锁名称
-lock_nfc,text,挂锁管理表头,挂锁 NFC
-lock_status,text,作业执行界面挂锁信息表头,上锁状态
-lock_take_report_fail,text,挂锁取出上报异常时提示信息,挂锁取出上报失败
-locked_points_title,text,锁定中的点位标题,锁定中的点位
-locked_points_tv,text,首页锁定中的点位文本,锁定中的点位
-locker,text,通用上锁人文本,上锁人
-login,text,通用登录文本,登录
-login_tip,text,登录界面提示文本,请输入用户名和密码或者刷卡进行登录
-loto,text,系统主标题,智能锁控系统
-loto_en,text,系统副标题,Intelligent Lock Control System
-manage_filter_status,text,添加/修改弹窗状态文本,状态
-manage_role_function_permission,text,角色管理功能权限文本,功能权限
-member_info_title,text,人员信息标题,人员信息
-move_down,text,区域管理下移按钮文本,下移
-move_up,text,区域管理上移按钮文本,上移
-my_todo_title,text,我的待办标题,我的待办
-navigate_to_step,text,流程模式设置,步骤功能显示,跳转到第{0}步
-new_device,text,新设备标题文本,New
-new_group,text,选择点位,默认新增分组名称前缀,新分组{0}
-new_password,text,重置密码界面新密码文本,新密码(数字、字母、特殊符号、6-20位)
-new_password_and_repeat_new_password_not_same,text,重置密码界面重复密码校验提示文本,新密码与重复新密码不一致
-new_password_cannot_be_the_same_as_the_old_password,text,重置密码界面新旧密码校验提示文本,新密码与旧密码不能相同
-next,text,初始化界面下一步按钮文本,下一步
-nickname,text,通用姓名文本,姓名
-no_available_key,text,作业执行界面去上锁没有钥匙时弹窗提示文本,暂无可用钥匙
-no_data,text,列表界面没有数据时默认展示信息文本,暂无数据
-no_goto_step,text,流程模式设置,步骤功能显示,无跳转
-no_permission_to_handle,text,作业执行界面,进行操作时权限不通过提示文本,您暂无权限操作当前作业票
-no_response_board_exists,text,硬件通信时响应超时提示文本,存在未响应的主板
-normal,text,通用正常文本,正常
-not_group_can_lock,text,所有分组上锁完成之后点击去上锁按钮提示,当前无分组可上锁
-not_group_can_unlock,text,所有分组解锁完成之后点击去解锁按钮提示,当前无分组可解锁
-not_in_slot,text,仓位管理长按仓位检查硬件不存在时提示,未在仓位
-not_save_tip,text,创建/修改作业,SOP,SOP作业返回时通用确认弹窗文本,数据还没有保存,您确定要放弃保存,离开当前页面吗?
-number,text,仓位异常上报信息文本,编号: 
-old_password,text,重置密码旧密码文本,旧密码
-old_password_error,text,重置密码旧密码校验失败提示以文本,旧密码错误
-one_key_cancel,text,异常管理列表按钮文本,一键取消
-one_key_handle,text,异常管理列表按钮文本,一键处理
-ongoing_job_tv,text,首页进行中的作业文本,进行中的作业
-only_one_person_allowed,text,人脸录入时提示文本,请保持单人入镜
-operation,text,列表表头,操作
-password_and_repeat_password_not_same,text,重置密码和初始化设置管理员账号时密码与重复密码不一致时提示文本,密码与重复密码不一致
-password_regex_tip,text,重置密码和初始化设置管理员账号时密码不符合规范提示文本,密码不符合要求
-phone,text,通用电话文本,电话
-please_do_colock,text,作业执行界面提示文本,请共锁人完成共锁
-please_do_uncolock,text,作业执行界面提示文本,请共锁人解除共锁
-please_done_operation,text,作业执行界面点击未完成的非当前步骤时提示,请先完成{0}
-please_go_locking,text,作业执行界面提示文本,请上锁员执行去上锁操作
-please_go_unlocking,text,作业执行界面提示文本,请上锁员执行去解锁操作
-please_input_account,text,输入框提示文本和数据校验错误提示文本,请输入用户名
-please_input_admin_username,text,输入框提示文本和数据校验错误提示文本,请输入管理员账号
-please_input_area,text,输入框提示文本和数据校验错误提示文本,请输入区域
-please_input_card_code,text,输入框提示文本和数据校验错误提示文本,请输入工卡
-please_input_card_nfc,text,输入框提示文本和数据校验错误提示文本,请输入卡片 NFC
-please_input_correct_phone,text,输入框提示文本和数据校验错误提示文本,请输入正确的手机号
-please_input_exception_reason,text,输入框提示文本和数据校验错误提示文本,请输入异常原因
-please_input_job_name,text,输入框提示文本和数据校验错误提示文本,请输入作业名称
-please_input_key_mac,text,输入框提示文本和数据校验错误提示文本,请输入钥匙MAC
-please_input_key_name,text,输入框提示文本和数据校验错误提示文本,请输入钥匙名称
-please_input_key_nfc,text,输入框提示文本和数据校验错误提示文本,请输入钥匙NFC
-please_input_key_word,text,输入框提示文本和数据校验错误提示文本,请输入关键字
-please_input_lock_code,text,输入框提示文本和数据校验错误提示文本,请输入挂锁编号
-please_input_lock_nfc,text,输入框提示文本和数据校验错误提示文本,请输入挂锁 NFC
-please_input_new_password,text,输入框提示文本和数据校验错误提示文本,请输入新密码
-please_input_nickname,text,输入框提示文本和数据校验错误提示文本,请输入姓名
-please_input_old_password,text,输入框提示文本和数据校验错误提示文本,请输入旧密码
-please_input_password,text,输入框提示文本和数据校验错误提示文本,请输入密码
-please_input_permission_characters,text,输入框提示文本和数据校验错误提示文本,请输入权限字符
-please_input_phone,text,输入框提示文本和数据校验错误提示文本,请输入电话
-please_input_point_function,text,输入框提示文本和数据校验错误提示文本,请输入隔离点作用
-please_input_point_name,text,输入框提示文本和数据校验错误提示文本,请输入隔离点名称
-please_input_remark,text,输入框提示文本和数据校验错误提示文本,请输入备注
-please_input_remote_server_address,text,输入框提示文本和数据校验错误提示文本,请输入服务地址
-please_input_repeat_new_password,text,输入框提示文本和数据校验错误提示文本,请重复新密码
-please_input_repeat_password,text,输入框提示文本和数据校验错误提示文本,请输入重复密码
-please_input_rfid,text,输入框提示文本和数据校验错误提示文本,请输入 RFID 标签
-please_input_rfid_code,text,输入框提示文本和数据校验错误提示文本,请输入 RFID 编号
-please_input_rfid_tag,text,输入框提示文本和数据校验错误提示文本,请输入RFID标签
-please_input_role_name,text,输入框提示文本和数据校验错误提示文本,请输入角色名称
-please_input_sop_name,text,输入框提示文本和数据校验错误提示文本,请输入SOP名称
-please_input_step_description,text,输入框提示文本和数据校验错误提示文本,请输入步骤操作说明
-please_input_step_title,text,输入框提示文本和数据校验错误提示文本,请填写步骤标题
-please_input_step_title_short,text,输入框提示文本和数据校验错误提示文本,请输入步骤标题缩写
-please_input_username,text,输入框提示文本和数据校验错误提示文本,请输入登录名
-please_input_workstation_name,text,输入框提示文本和数据校验错误提示文本,请输入区域名称
-please_must_select_at_least_one_point,text,创建作业,SOP,SOP作业保存时如果分组点位不足时提示,您至少需要添加一个点位
-please_press_fingerprint_again,text,设置指纹时提示,请再次按压指纹
-please_re_press_fingerprint_again,text,设置指纹时如果3次全错误时提示,请重新按压指纹
-please_return_key_after_locking,text,作业执行界面提示文本,请上锁员完成上锁后,归还钥匙
-please_return_key_after_unlocking,text,作业执行界面提示文本,请上锁员完成解锁后,归还钥匙
-please_scan_face,text,登录弹窗提示文本,请刷脸
-please_scan_fingerprint,text,登录弹窗提示文本,请刷指纹
-please_select_area,text,删除区域时未选择区域的提示文本,请选择区域
-please_select_card,text,删除卡片时未选择卡片的提示文本,请选择卡片
-please_select_card_username,text,保存卡片时未选择用户的提示文本,请选择用户名称
-please_select_colocker,text,选择人员界面未选择共锁人时保存提示文本,请选择共锁人
-please_select_exception_description,text,异常上报检查数据时提示文本,请选择异常描述
-please_select_exception_source,text,异常上报检查数据时提示文本,请选择异常源
-please_select_exception_type,text,异常上报检查数据时提示文本,请选择异常类型
-please_select_flow_mode,text,选择提示文本和数据校验错误提示文本,请选择流程模式
-please_select_group,text,去上锁选择标题,请选择分组
-please_select_handle_time,text,我的待办已处理时间选择提示文本,请选择处理时间
-please_select_job,text,作业管理删除作业未选择提示文本,请选择作业
-please_select_job_workstation,text,选择提示文本和数据校验错误提示文本,请选择作业区域
-please_select_key,text,钥匙管理删除钥匙未选择提示文本,请选择钥匙
-please_select_lock,text,挂锁管理删除挂锁未选择提示文本,请选择挂锁
-please_select_locker,text,选择人员确认数据时未选择上锁人提示,请选择上锁人
-please_select_member,text,作业执行界面提示文本,您可以选择添加人员
-please_select_point,text,选择点位确认数据时未选择点位提示,请选择隔离点
-please_select_power_type,text,添加点位时能量源提示文本和未选择提示文本,请选择能量源
-please_select_process_application,text,异常上报时处理申请提示文本和未选择提示文本,请选择处理申请
-please_select_rfid_token,text,添加更新点位数据时rfid未选择提示和提示文本,请选择RFID标签
-please_select_role,text,添加修改用户时未选择角色文本和选择提示文本,请选择角色
-please_select_sop,text,创建修改SOP作业时的提示文本和未选择提示文本,请选择SOP
-please_select_sop_workstation,text,创建修改SOP作业时的提示文本和未选择提示文本,请选择SOP区域
-please_select_start_time,text,首页点击结束时间未选择开始时间时提示文本,请先选择开始时间
-please_select_status,text,添加用户时未选择状态时提示,请选择状态
-please_select_step_confirm_member,text,流程模式设置,确认数据时提示,请选择执行确认人员
-please_select_step_confirm_role,text,流程模式设置,确认数据时提示,请选择执行确认角色
-please_select_step_confirm_type,text,流程模式设置,确认数据时提示,请选择执行确认方式
-please_select_user,text,用户管理删除用户未选择时提示,请选择用户
-please_select_workflow_mode,text,创建作业,SOP时未选择流程模式提示,请选择流程模式
-please_select_workstation,text,创建作业,SOP时未选择区域提示,请选择区域
-please_swipe_card,text,登录弹窗提示文本,请刷卡
-please_take_out_ready_device_first,text,同一个作业去上锁还未取出设备,再次上锁时提示,请先取出已开卡扣的设备
-please_wait_ticket_name_lock_complete,text,交叉点位存在上锁时,有任务要去解锁时提示,请等待[{0}]上锁完成
-point_detail,text,我的待办点位明细按钮文本,点位明细
-point_in_use,text,点位删除时检查,点位使用中提示,点位正在使用无法修改
-point_info_title,text,点位信息标题文本,点位信息
-point_list_title,text,点位选择界面标题,点位清单
-point_manage_add_title,text,点位管理添加点位标题,添加点位
-point_manage_delete_failed,text,点位管理删除失败时提示,无法删除隔离点
-point_manage_delete_succeed,text,点位管理删除成功时提示,隔离点删除成功
-point_manage_point_function,text,点位管理隔离点作用表头,隔离点作用
-point_manage_point_group,text,作业执行界面点位表头,分组名称
-point_manage_point_name,text,添加更新筛选点位显示文本,隔离点名称
-point_manage_point_power_type,text,添加更新筛选点位显示文本,能量源
-point_manage_rfid,text,添加更新筛选点位显示文本,RFID
-point_manage_rfid_tag,text,添加更新筛选点位显示文本,RFID 标签
-point_manage_title,text,点位管理标题,点位管理
-point_manage_update_title,text,修改点位标题,修改点位
-point_manage_workstation,text,添加更新筛选点位显示文本,区域
-point_name_tv,text,添加更新筛选点位显示文本,隔离点
-power_isolation_way,text,添加更新筛选点位显示文本,确认隔离方式
-preset_workflow_can_not_delete,text,删除流程模式时如果流程模式时预设弹窗提示文本,预设流程模式无法删除
-previous,text,初始化界面上一步按钮我文本,上一步
-process_application_tv,text,异常上报显示文本,处理申请
-quick_entrance_most_set_tip,text,快捷入口配置提示文本,快捷入口最多设置8个
-quick_entrance_title,text,快捷入口配置弹窗标题,快捷入口配置
-re_recognize,text,捕捉人脸按钮文本,重新识别
-real_person_verification_required,text,捕捉人脸提示文本,请保持真人操作
-recapture,text,捕捉人脸按钮文本,重拍
-recognize_work_content,text,八大步骤(玛氏)的步骤流程名称,检查使用,识别工作内容
-recognized_card_rfid,text,初始化注册卡片表头,已识别的卡片RFID
-recognized_point_rfid,text,初始化注册RFID表头,已识别的点位RFID
-reduce_colocker,text,流程模式设置,步骤功能显示,减少共锁人({0})
-register_failed,text,仓位管理注册硬件失败时弹窗文本,注册失败
-register_success,text,仓位管理注册硬件成功时弹窗文本,注册成功
-release_colocker,text,流程模式设置,步骤标题,解除共锁
-remark,text,通用备注文本,备注
-repeat_new_password,text,重置密码界面,重新密码显示文本,重复新密码(数字、字母、特殊符号、6-20位)
-repeat_password,text,初始化管理员界面,重复密码显示文本,重复密码:(数字、字母、特殊符号、6-20位)
-reset,text,通用重置文本,重置
-reset_data_tv,text,设置人脸和设置工卡,重新设置按钮文本,点击重设
-reset_password_title,text,重置密码标题,重置密码
-reset_user_password_failed,text,重置密码失败弹窗提示文本,用户密码重置失败
-reset_user_password_succeed,text,重置密码成功弹窗提示文本,用户密码重置成功
-restart_app_after_set,text,设置远程地址完成之后自动重启提示,App将在设置完成后重启
-rfid,text,添加RFID显示文本,RFID 标签
-rfid_already_bind,text,添加点位时如果RFID已被绑定是弹窗显示,该Rfid标签已被绑定
-rfid_already_registration,text,初始化注册RFID,添加修改RFID时如果RFID已存在提示文本,RFID标签已录入
-rfid_code,text,RFID列表表头,RFID 编号
-rfid_in_use,text,修改RFID时如果RFID使用中无法进行修改提示,RFID标签使用中,无法修改
-rfid_name,text,RFID列表表头,RFID编号
-rfid_token_manage_delete_failed,text,删除RFID失败时提示,RFID标签删除失败
-rfid_token_manage_delete_succeed,text,删除RFID成功时提示,RFID标签删除成功
-rfid_token_manage_new_rfid_token_title,text,新增RFID标题,新增 RFID 标签
-rfid_token_manage_rfid_token_detail_title,text,修改RFID标题,RFID标签详情
-rfid_token_manage_title,text,RFID管理标题,RFID管理
-role_in_preset_tip,text,删除预设角色时检查是否是预设角色,是的话无法删除提示,预设角色不允许删除
-role_in_use,text,删除角色时检查角色是否使用中,是的话提示,角色已有作业在使用
-role_key_already_exists,text,添加角色时重复角色权限字符检测提示,该角色权限字符已存在
-role_manage_add_title,text,添加角色标题,添加角色
-role_manage_delete_failed,text,删除角色失败时提示,无法删除角色
-role_manage_delete_succeed,text,角色删除成功时提示,角色已删除
-role_manage_permission_string,text,权限字符显示文本,权限字符
-role_manage_role_name,text,角色名称显示文本,角色名称
-role_manage_role_num,text,角色编号显示文本,角色编号
-role_manage_title,text,角色管理标题,角色管理
-save,text,通用保存文本,保存
-save_and_execute,text,通用保存并执行文本,保存并执行
-save_sop_check,text,生成SOP选择框文本,生成SOP
-save_success,text,保存成功通用显示文本,保存成功!
-scan_complete_app_restarting,text,自动扫描串口完成之后自动重启提示,扫描完成,APP将自动重启
-select,text,通用选择文本,选择
-select_colocker_tip,text,选择人员界面选择共锁人提示文本,请在以下人员中选择共锁人
-select_coloker,text,选择人员界面未选择共锁人确认时提示文本,请选择共锁人
-select_group_tip,text,选择点位界面的分组选择操作提示文本,点击分组空白区域进行选中
-select_locker,text,选择人员界面未选择上锁人确认时提示文本,选择上锁人
-select_locker_tip,text,选择人员界面选择上锁人提示文本,请在以下人员中选择[{0}]上锁人
-select_member_title,text,选择人员标题,选择人员
-select_point_title,text,选择点位标题,选择点位
-selected_point_already_in_use,text,删除点位时,检查到存在使用中的点位是提示,存在使用中的点位
-selected_point_info_title,text,默认分组名称,已选择的点位信息
-selected_quick_entrance,text,快捷入口弹窗界面,已选择的标题提示文本,已配置的快捷入口(最多添加8个快捷入口,可拖拽排序)
-selected_rfid_in_use,text,删除RFID时检查到存在使用中的RFID时提示,存在正在使用的RFID标签
-send_ticket_fail,text,作业票下发失败时提示文本,作业票下发失败
-sending_ticket,text,作业票下发中加载弹窗文本,工作票下发中······
-server_address,text,设置服务器地址显示文本,服务地址
-server_address_error,text,设置服务器地址,服务器地址错误提示文本,服务器地址错误
-set_colocker,text,流程模式设置,功能菜单显示,设置共锁人
-set_data_tv,text,设置人脸和设置工卡,未设置时按钮文本,点击设置
-set_face_title,text,设置人脸标题,设置人脸
-set_fingerprint_title,text,设置指纹标题,设置指纹
-set_job_card_title,text,设置工卡标题,设置工卡
-set_locker,text,流程模式设置,功能菜单显示,设置上锁人
-set_password,text,初始化设置管理员,设置密码文本显示,设置密码:(数字、字母、特殊符号、6-20位)
-settings,text,通用设置文本,设置
-show_member_when_selected_sop,text,创建SOP作业人员信息展示区域提示,选择SOP后,将自动展示SOP的人员信息。
-show_points_when_selected_sop,text,创建SOP作业点位信息展示区域提示,选择SOP后,将自动展示SOP的点位信息。
-shutdown,text,八大步骤(玛氏)的步骤流程名称,检查使用,操作停机
-ski_step,text,初始化工卡,按钮文本,跳过该步骤
-skip_and_complete,text,初始化RFId,按钮文本,跳过并完成
-slot_exception_tag,text,归还钥匙时检查锁仓异常时提示,该锁仓已被标记异常
-slots_exception_report,text,锁仓异常上报标题,仓位异常上报
-slots_manage_title,text,仓位管理标题,仓位管理
-sop_create_failed,text,SOP创建失败时弹窗文本,SOP创建失败
-sop_create_succeed,text,SOP创建成功时弹窗文本,SOP创建成功
-sop_job_save_and_execute_failed,text,SOP执行失败时弹窗文本,SOP作业执行失败
-sop_job_save_and_execute_succeed,text,SOP执行成功时弹窗文本,SOP作业开始执行
-sop_job_save_failed,text,SOP保存失败时弹窗文本,SOP作业保存失败
-sop_job_save_succeed,text,SOP保存成功时弹窗文本,SOP作业保存成功
-sop_manage_delete_failed,text,删除SOP时检查是否有正在进行中的作业管理,存在时提示,无法删除选中的SOP
-sop_manage_delete_succeed,text,删除选中的SOP成功时弹窗文本,删除选中的SOP成功
-sop_manage_sop_name,text,SOP列表表头,SOP名称
-sop_manage_title,text,SOP管理标题,SOP管理
-sop_manage_workstation,text,SOP管理表头,所属岗位
-sop_save_failed,text,SOP保存失败时弹窗文本,SOP保存失败
-sop_save_succeed,text,SOP保存成功时弹窗文本,SOP保存成功
-sop_save_tip,text,SOP保存时二次确认弹窗文本,确定要保存"{0}"吗?
-sop_workstation,text,创建修改SOP作业界面SOP区域选择文本,SOP区域
-start,text,初始化欢迎界面开始按钮文本,开始
-start_detect_key_slot,text,仓位管理检测钥匙仓位开始时加载弹窗文本,开始检测钥匙仓位
-start_detect_lock_slot,text,仓位管理检测挂锁仓位开始时加载弹窗文本,开始检测挂锁仓位
-start_scan_key_mac,text,仓位管理检测钥匙仓位获取钥匙信息时加载弹窗文本,开始扫描钥匙信息
-start_time,text,首页时间范围开始时间,开始时间
-end_time_must_large_then_start_time,text,选择开始时间和结束时间时判断两个时间的大小提示文本,结束时间必须大于开始时间
-start_tip,text,初始化欢迎界面提示文本,根据提示对系统进行初始化
-start_to_send_ticket,text,开始下发工作票加载弹窗文本,开始下发工作票······
-status,text,通用状态文本,状态
-step_confirm_failed,text,作业执行界面步骤确认失败提示文本,步骤确认失败
-take_out_key,text,作业票下发完成之后加载弹窗显示文本,请取出钥匙
-take_out_key_tip,text,作业票下发完成之后加载弹窗显示文本,请从打开的钥匙仓取出钥匙
-take_out_lock_tip,text,去上锁发锁之后加载弹窗显示需要获取的钥匙文本,请从打开的锁仓取出锁,还有{0}把待取出
-take_out_rest_locks,text,去上锁发锁之后再次选择分组提示先取出已经打开卡扣的挂锁文本,请取出剩余开启卡扣的挂锁
-tec_support,text,技术支持文本,温州博士安全用品有限公司
-the_verification_file_not_exists,text,流程模式导入时解压文件的校验文件不存在时提示,校验文件不存在
-ticket_data_error,text,获取工作票数据之后数据转换异常时提示,工作票数据损坏
-ticket_get_failed,text,还钥匙之后钥匙连接失败时提示,作业票获取失败
-ticket_lost,text,获取的工作票已经取消或结束时进行判断,作业票不存在
-time_frame_tv,text,首页时间范围显示文本,时间范围
-todo_header,text,我的待办处理中TAB表头,处理中
-turn_off,text,仓位管理开关按钮文本,关
-turn_on,text,仓位管理开关按钮文本,开
-turn_read,text,仓位管理RFID读取按钮文本,读
-uncolock_complete,text,作业执行界面和我的待办界面解除共锁成功时提示,解除共锁成功
-uncolock_failed,text,作业执行界面和我的待办界面解除共锁失败时提示,解除共锁失败
-unlock,text,流程模式设置,步骤文本,解锁
-unlock_and_restore_switch,text,八大步骤(玛氏)的步骤流程名称,检查使用,拆锁恢复开关
-unzip,text,流程模式导入解压文件时加载弹窗显示,解压中……{0}
-update_card_failed,text,修改卡片信息失败时弹窗提示,更新卡片失败
-update_card_succeed,text,修改卡片信息成功时弹窗提示,更新卡片成功
-update_key_failed,text,修改钥匙信息失败时弹窗提示,更新钥匙失败
-update_key_succeed,text,修改钥匙信息成功时弹窗提示,更新钥匙成功
-update_lock_failed,text,修改挂锁信息失败时弹窗提示,更新挂锁失败
-update_lock_succeed,text,修改挂锁信息成功时弹窗提示,更新挂锁成功
-update_point_failed,text,修改点位信息失败时弹窗提示,保存点位失败
-update_point_succeed,text,修改点位信息成功时弹窗提示,保存点位成功
-update_rfid_token_failed,text,修改RFID信息失败时弹窗提示,更新RFID标签失败
-update_rfid_token_succeed,text,修改RFID信息成功时弹窗提示,更新RFID标签成功
-update_role_failed,text,修改角色信息失败时弹窗提示,角色更新失败
-update_role_succeed,text,修改角色信息成功时弹窗提示,角色更新成功
-update_user_failed,text,修改用户信息失败时弹窗提示,用户更新失败
-update_user_succeed,text,修改用户信息成功时弹窗提示,用户更新成功
-update_workstation_failed,text,修改区域信息失败时弹窗提示,更新区域失败
-update_workstation_succeed,text,修改区域信息成功时弹窗提示,更新区域成功
-user_already_exists,text,添加用户,检测用户信息是否存在,存在时提示,用户已存在
-user_info_title,text,个人信息标题,个人信息
-user_manage_area,text,添加修改用户区域文本,区域
-user_manage_card_code,text,添加修改用户工卡文本,工卡
-user_manage_delete_failed,text,删除用户时检查用户是否在进行中的作业,存在则提示无法删除,无法删除用户
-user_manage_delete_succeed,text,用户删除成功时提示,用户已删除
-user_manage_filter_activate,text,用户筛选状态文本,正常
-user_manage_filter_deactivate,text,用户筛选状态文本,停用
-user_manage_filter_title,text,筛选条件标题,筛选条件
-user_manage_new_user_title,text,新增用户标题,新增用户
-user_manage_role,text,添加修改用户角色文本,角色
-user_manage_title,text,用户管理标题,用户管理
-user_manage_user_detail_title,text,用户详情标题,用户详情
-user_manage_view,text,用户管理列表表头,查看
-user_name,text,添加修改用户用户名文本,登录名
-username,text,通用用户名称文本,用户名称
-username_or_password_error,text,账号密码登录时,账号密码错误提示,账号或密码错误
-username_passowrd_login_success,text,账号密码登录成功提示,账号密码验证通过
-username_password_not_exists,text,账号密码登录时,如果账号不存在提示,账号密码不存在
-username_regex_tip,text,初始化管理员账号,账号不符合要求提示,账号不符合要求
-verify_failed,text,登录失败时提示,验证失败
-view,text,通用查看文本,查看
-wait_header,text,我的待办等待中TAB表头,等待中
-wait_to_colock,text,作业执行界面共锁表头,待共锁({0})
-warn,text,通用警告文本,警告
-welcome_tip,text,初始化欢迎界面文本,您好,欢迎您使用
-workflow_already_exists,text,导入流程模式时,流程模式已存在文本提示,流程模式已存在
-workflow_manage_title,text,流程模式管理标题,流程模式管理
-workflow_mode,text,通用流程模式文本,流程模式
-workflow_mode_manage_delete_succeed,text,删除流程模式成功时提示,删除流程模式成功
-workflow_mode_status_update_failed,text,流程模式状态修改失败时提示,状态修改失败
-workflow_mode_status_update_succeed,text,流程模式状态修改成功时提示,状态修改成功
-workflow_name,text,流程模式表头,流程模式名称
-workflow_setting,text,流程模式设置标题,流程设置
-workflow_step_confirm_member,text,流程模式设置项标题,执行确认人员
-workflow_step_confirm_role,text,流程模式设置项标题,执行确认角色
-workflow_step_confirm_type,text,流程模式设置项标题,执行确认方式
-workflow_step_description,text,流程模式设置项标题,步骤操作说明
-workflow_step_function,text,流程模式设置项标题,步骤功能
-workflow_step_title,text,流程模式设置项标题,步骤标题
-workflow_step_title_short,text,流程模式设置项标题,步骤标题缩写
-workstation_already_exists,text,添加区域是检查同级是否已经存在区域,存在时弹窗文本,区域已存在
-workstation_is_in_bottom,text,区域下移时检测是否已经到底部,到底部提示文本,区域已经在底部
-workstation_is_in_top,text,区域上移时检测是否已经到顶部,到顶部提示文本,区域已经在顶部
-workstation_manage_delete_failed,text,区域删除时检查是否有正在使用的作业,有的话提示无法删除,无法删除区域"{0}"
-workstation_manage_delete_succeed,text,区域删除成功时提示,删除区域"{0}"成功
-workstation_manage_new_workstation,text,新增区域标题,新增区域
-workstation_manage_title,text,区域管理标题,区域管理
-workstation_manage_workstation_name,text,新增区域显示文本,区域名称
-you_are_not_locker_tip,text,非上锁人执行上锁/解锁作业时提示文本,您不是上锁人,无法执行此操作
-zone,text,首页区域范围,区域范围
-backup_title,text,备份/还原标题,备份/还原
-backup,text,备份文本,备份
-backup_path,text,备份路径文本,备份路径
-maximum_number_of_backups,text,备份数量上限文本,备份数量上限
-auto_backup,text,自动备份文本,自动备份
-common_enable,text,通用启用文本,启用
-common_disable,text,通用停用文本,停用
-backup_frequency,text,备份频率文本,备份频率
-backup_time,text,备份时间文本,备份时间
-backup_tip,text,备份注意文本,注意:自动备份时必须保证应用处于启动状态。
-backup_now,text,立即备份文本,立即备份
-backup_range,text,备份数量上限提示,范围文本,范围:{0}
-restore,text,还原文本,还原
-common_batch_export,text,通用批量导出文本,批量导出
-common_batch_delete,text,通用批量删除文本,批量删除
-common_export,text,通用导出文本,导出
-MON,text,周一,星期一
-TUE,text,周二,星期二
-WED,text,周三,星期三
-THU,text,周四,星期四
-FRI,text,周五,星期五
-SAT,text,周六,星期六
-SUN,text,周日,星期日
-backup_frequency_every_day,text,备份频率每天,每天
-please_select_backup_frequency,text,选择备份频率提示,请选择备份频率
-maximumNumberOfBackupsNotCorrect,text,备份数量上限不正确提示,请填写正确的备份数量上限
-please_select_time,text,通用选择时间标题,请选择时间
-backup_now_please_wait,text,备份等待文本,正在备份中,请稍等……
-backup_success,text,备份成功文本,备份成功
-backup_failed,text,备份失败文本,备份失败
-delete_backup_file_confirm,text,删除备份提示,是否确认删除该备份,删除后备份无法恢复。
-delete_selected_backup_file_confirm,text,删除选中备份提示,是否确认删除选中备份,删除后备份无法恢复。
-restore_backup_confirm,text,还原备份提醒,还原备份将清除备份日期到当前时间的所有数据,是否确认还原备份?
-restore_backup_success,text,还原备份成功文本,备份还原成功
-export_success,text,通用导出成功,导出成功
-no_backup_data,text,暂无备份数据,暂无备份数据
-loading_backup,text,加载备份中,正在读取备份文件
-max_backup_tip,text,备份达到上限,备份数量已经达到上限,继续备份将移除最老的数据。
-switch,text,切换文本,切换
-backup_restoring,text,备份还原中,备份还原中……
-point_manage_switch_icon,text,开关图标
-user_manage,text,用户管理
-role_manage,text,角色管理
-workstation_manage,text,区域管理
-point_manage,text,点位管理
-backup_and_restore,text,备份/还原
-in_progress_job,text,进行中的作业
-create_sop,text,新建SOP
-sop_manage,text,SOP管理
-exception_job,text,异常作业
-create_job,text,新建作业
-job_manage,text,作业管理
-workflow_manage,text,流程模式管理
-create_sop_job,text,新建SOP作业
-locked_point,text,锁定中的点位
-slot_manage,text,仓位管理
-key_manage,text,钥匙管理
-lock_manage,text,挂锁管理
-card_manage,text,卡片管理
-rfid_manage,text,RFID管理
-exception_report,text,异常上报
-exception_manage,text,异常管理
-user_info,text,个人信息
-reset_password,text,重置密码
-fingerprint_setting,text,设置指纹
-face_setting,text,设置人脸
-card_setting,text,设置工卡
-logout,text,退出登录
-todo_list,text,我的待办
-hardware_manage,text,硬件管理
-job_ticket_manage,text,作业管理
-data_manage,text,数据管理
-home,text,主页
-auto_confirm,text,自动确认
-click_confirm,text,点击确认
-role_confirm,text,角色确认
-admin,text,超级管理员
-jtdrawer,text,作业管理员
-jtlocker,text,作业负责人
-jtcolocker,text,作业参与人
-jtguard,text,作业观察员
-sysconfig,text,系统配置员
-force_shared_lock,text,强制共享锁模式
-force_multi_lock,text,强制多锁模式
-mixed_mode,text,混合模式
-lock_take_key,text,启动上锁
-lock_return_key,text,完成上锁
-unlock_take_key,text,启动解锁
-unlock_return_key,text,完成解锁
-colock,text,添加共锁
-release_colock,text,解除共锁
-confirm,text,执行确认
-end,text,结束作业
-unknown,text,未知待办
-not_start,text,未开始
-select_member,text,选择人员
-locking,text,上锁中
-colocking,text,共锁中
-unlocking,text,解锁中
-finished,text,已结束
-canceled,text,已取消
-progressing,text,进行中
-hydraulic_pressure,text,液压
-electric_energy,text,电能
-potential_energy,text,势能
-heat_energy,text,热能
-gas,text,燃气
-mechanical_energy,text,机械能
-air_energy,text,空气能
-apply_master_key,text,申请万能钥匙
-apply_finish_job,text,申请结束作业
-apply_scrap_slot,text,申请报废仓位
-apply_scrap_lock,text,申请报废挂锁
-apply_scrap_key,text,申请报废钥匙
-slot_damage,text,仓位损坏
-lock_damage,text,挂锁损坏
-key_damage,text,钥匙损坏
-job_cat_not_exec,text,作业票无法执行
-pending,text,待处理
-processed,text,已处理
-canceld,text,已取消
-key,text,钥匙
-lock,text,挂锁
-slot,text,仓位
-job,text,作业
-job_exception,text,作业异常
-hardware_exception,text,硬件异常

+ 3757 - 0
app/src/main/assets/i18n/zh-CN.json

@@ -0,0 +1,3757 @@
+{
+  "i18n.language_name": {
+    "key": "i18n.language_name",
+    "type": "text",
+    "value": "中文"
+  },
+  "abnormal": {
+    "key": "abnormal",
+    "type": "text",
+    "value": "异常"
+  },
+  "account_login": {
+    "key": "account_login",
+    "type": "text",
+    "value": "用户名登录"
+  },
+  "action_confirm": {
+    "key": "action_confirm",
+    "type": "text",
+    "value": "操作确认"
+  },
+  "action_confirm_content": {
+    "key": "action_confirm_content",
+    "type": "text",
+    "value": "确定要执行{0}吗?"
+  },
+  "action_failed": {
+    "key": "action_failed",
+    "type": "text",
+    "value": "操作失败"
+  },
+  "action_hint": {
+    "key": "action_hint",
+    "type": "text",
+    "value": "操作提醒"
+  },
+  "action_succeed": {
+    "key": "action_succeed",
+    "type": "text",
+    "value": "操作成功"
+  },
+  "add_card_failed": {
+    "key": "add_card_failed",
+    "type": "text",
+    "value": "添加卡片失败"
+  },
+  "add_card_succeed": {
+    "key": "add_card_succeed",
+    "type": "text",
+    "value": "添加卡片成功"
+  },
+  "add_colocker": {
+    "key": "add_colocker",
+    "type": "text",
+    "value": "添加共锁人({0})"
+  },
+  "add_group": {
+    "key": "add_group",
+    "type": "text",
+    "value": "添加分组"
+  },
+  "add_key_failed": {
+    "key": "add_key_failed",
+    "type": "text",
+    "value": "新增钥匙失败"
+  },
+  "add_key_succeed": {
+    "key": "add_key_succeed",
+    "type": "text",
+    "value": "新增钥匙成功"
+  },
+  "add_lock_failed": {
+    "key": "add_lock_failed",
+    "type": "text",
+    "value": "添加挂锁失败"
+  },
+  "add_lock_succeed": {
+    "key": "add_lock_succeed",
+    "type": "text",
+    "value": "添加挂锁成功"
+  },
+  "add_point_failed": {
+    "key": "add_point_failed",
+    "type": "text",
+    "value": "新增隔离点失败"
+  },
+  "add_point_succeed": {
+    "key": "add_point_succeed",
+    "type": "text",
+    "value": "新增隔离点成功"
+  },
+  "add_rfid_token_failed": {
+    "key": "add_rfid_token_failed",
+    "type": "text",
+    "value": "添加RFID标签失败"
+  },
+  "add_rfid_token_succeed": {
+    "key": "add_rfid_token_succeed",
+    "type": "text",
+    "value": "添加RFID标签成功"
+  },
+  "add_role_failed": {
+    "key": "add_role_failed",
+    "type": "text",
+    "value": "新增角色失败"
+  },
+  "add_role_succeed": {
+    "key": "add_role_succeed",
+    "type": "text",
+    "value": "新增角色成功"
+  },
+  "add_user_succeed": {
+    "key": "add_user_succeed",
+    "type": "text",
+    "value": "新增用户成功"
+  },
+  "add_workstation_failed": {
+    "key": "add_workstation_failed",
+    "type": "text",
+    "value": "新增区域失败"
+  },
+  "add_workstation_succeed": {
+    "key": "add_workstation_succeed",
+    "type": "text",
+    "value": "新增区域成功"
+  },
+  "admin_role_can_not_edit": {
+    "key": "admin_role_can_not_edit",
+    "type": "text",
+    "value": "管理员角色无法编辑"
+  },
+  "admin_username": {
+    "key": "admin_username",
+    "type": "text",
+    "value": "管理员账号:(数字、字母、6-20位)"
+  },
+  "all": {
+    "key": "all",
+    "type": "text",
+    "value": "全部"
+  },
+  "all_hardware_tv": {
+    "key": "all_hardware_tv",
+    "type": "text",
+    "value": "全部硬件"
+  },
+  "all_job_tv": {
+    "key": "all_job_tv",
+    "type": "text",
+    "value": "全部作业"
+  },
+  "all_points_tv": {
+    "key": "all_points_tv",
+    "type": "text",
+    "value": "全部点位"
+  },
+  "all_quick_entrance": {
+    "key": "all_quick_entrance",
+    "type": "text",
+    "value": "所有快捷入口"
+  },
+  "all_select_not_all_select": {
+    "key": "all_select_not_all_select",
+    "type": "text",
+    "value": "全选/全不选"
+  },
+  "already_colock": {
+    "key": "already_colock",
+    "type": "text",
+    "value": "已共锁({0})"
+  },
+  "already_uncolock": {
+    "key": "already_uncolock",
+    "type": "text",
+    "value": "已解除共锁({0})"
+  },
+  "back": {
+    "key": "back",
+    "type": "text",
+    "value": "返回"
+  },
+  "base_info_title": {
+    "key": "base_info_title",
+    "type": "text",
+    "value": "基本信息"
+  },
+  "ble_connect_fail": {
+    "key": "ble_connect_fail",
+    "type": "text",
+    "value": "连接失败,请重试!"
+  },
+  "ble_connecting": {
+    "key": "ble_connecting",
+    "type": "text",
+    "value": "连接中,请稍后..."
+  },
+  "can_not_remove_current_colocker": {
+    "key": "can_not_remove_current_colocker",
+    "type": "text",
+    "value": "无法移除当前共锁人"
+  },
+  "can_not_remove_current_locker": {
+    "key": "can_not_remove_current_locker",
+    "type": "text",
+    "value": "无法移除当前上锁人"
+  },
+  "cancel": {
+    "key": "cancel",
+    "type": "text",
+    "value": "取消"
+  },
+  "cancel_countdown": {
+    "key": "cancel_countdown",
+    "type": "text",
+    "value": "取消({0}秒)"
+  },
+  "cancel_exception": {
+    "key": "cancel_exception",
+    "type": "text",
+    "value": "取消异常"
+  },
+  "cancel_exception_failed": {
+    "key": "cancel_exception_failed",
+    "type": "text",
+    "value": "取消异常失败"
+  },
+  "cancel_exception_success": {
+    "key": "cancel_exception_success",
+    "type": "text",
+    "value": "异常取消成功"
+  },
+  "cancel_job": {
+    "key": "cancel_job",
+    "type": "text",
+    "value": "取消作业"
+  },
+  "cancel_job_tip": {
+    "key": "cancel_job_tip",
+    "type": "text",
+    "value": "是否确认取消当前作业"
+  },
+  "capture_tip_content": {
+    "key": "capture_tip_content",
+    "type": "text",
+    "value": "1. 系统将自动拍摄照片,在拍摄过程中请确保:\n      · 脸部正对摄像头\n      · 保持适当距离,让整个脸部出现在左侧框中\n      · 光线充足\n      · 表情自然\n2. 拍摄完成后,您可以点击确认按钮进行提交,也可以点击重拍按钮重新进行拍摄。\n3. 取消录入,请点击取消按钮"
+  },
+  "capture_tip_title": {
+    "key": "capture_tip_title",
+    "type": "text",
+    "value": "录入提示"
+  },
+  "card_already_registration": {
+    "key": "card_already_registration",
+    "type": "text",
+    "value": "卡片已录入"
+  },
+  "card_code": {
+    "key": "card_code",
+    "type": "text",
+    "value": "卡片名称"
+  },
+  "card_login": {
+    "key": "card_login",
+    "type": "text",
+    "value": "刷卡登录"
+  },
+  "card_manage_card_detail_title": {
+    "key": "card_manage_card_detail_title",
+    "type": "text",
+    "value": "卡片详情"
+  },
+  "card_manage_delete_failed": {
+    "key": "card_manage_delete_failed",
+    "type": "text",
+    "value": "卡片删除失败"
+  },
+  "card_manage_delete_succeed": {
+    "key": "card_manage_delete_succeed",
+    "type": "text",
+    "value": "卡片删除成功"
+  },
+  "card_manage_new_card_title": {
+    "key": "card_manage_new_card_title",
+    "type": "text",
+    "value": "新增卡片"
+  },
+  "card_manage_title": {
+    "key": "card_manage_title",
+    "type": "text",
+    "value": "卡片管理"
+  },
+  "card_nfc": {
+    "key": "card_nfc",
+    "type": "text",
+    "value": "卡片 NFC"
+  },
+  "change_to_standard": {
+    "key": "change_to_standard",
+    "type": "text",
+    "value": "切换标准版"
+  },
+  "check_before_unlocking": {
+    "key": "check_before_unlocking",
+    "type": "text",
+    "value": "取锁前检查"
+  },
+  "check_delete_card": {
+    "key": "check_delete_card",
+    "type": "text",
+    "value": "确定要删除选中的卡片吗?"
+  },
+  "check_delete_job": {
+    "key": "check_delete_job",
+    "type": "text",
+    "value": "您确认要删除作业吗"
+  },
+  "check_delete_key": {
+    "key": "check_delete_key",
+    "type": "text",
+    "value": "您确定要删除选中的钥匙吗"
+  },
+  "check_delete_lock": {
+    "key": "check_delete_lock",
+    "type": "text",
+    "value": "确定要删除选中的挂锁吗?"
+  },
+  "check_delete_point": {
+    "key": "check_delete_point",
+    "type": "text",
+    "value": "您确定要删除隔离点吗"
+  },
+  "check_delete_rfid_token": {
+    "key": "check_delete_rfid_token",
+    "type": "text",
+    "value": "确定要删除选中的RFID标签吗?"
+  },
+  "check_delete_role": {
+    "key": "check_delete_role",
+    "type": "text",
+    "value": "您确认要删除角色吗"
+  },
+  "check_delete_sop": {
+    "key": "check_delete_sop",
+    "type": "text",
+    "value": "您确定要删除选中的SOP吗"
+  },
+  "check_delete_user": {
+    "key": "check_delete_user",
+    "type": "text",
+    "value": "您确认要删除用户吗?"
+  },
+  "check_delete_workflow_mode": {
+    "key": "check_delete_workflow_mode",
+    "type": "text",
+    "value": "确定要删除选中的流程模式吗"
+  },
+  "check_delete_workstation": {
+    "key": "check_delete_workstation",
+    "type": "text",
+    "value": "您确定要删除区域{0}吗"
+  },
+  "check_device_info": {
+    "key": "check_device_info",
+    "type": "text",
+    "value": "检测到未注册钥匙{0}把"
+  },
+  "check_key_and_lock": {
+    "key": "check_key_and_lock",
+    "type": "text",
+    "value": "正在检查钥匙和挂锁"
+  },
+  "check_lock_is_new_device": {
+    "key": "check_lock_is_new_device",
+    "type": "text",
+    "value": "检查挂锁是否为新硬件"
+  },
+  "check_new_key_need_register": {
+    "key": "check_new_key_need_register",
+    "type": "text",
+    "value": "检测到新钥匙,是否注册"
+  },
+  "check_new_lock_need_register": {
+    "key": "check_new_lock_need_register",
+    "type": "text",
+    "value": "检测到新挂锁,是否注册"
+  },
+  "close": {
+    "key": "close",
+    "type": "text",
+    "value": "关闭"
+  },
+  "colock": {
+    "key": "colock",
+    "type": "text",
+    "value": "添加共锁"
+  },
+  "colock_complete": {
+    "key": "colock_complete",
+    "type": "text",
+    "value": "添加共锁完成"
+  },
+  "colock_failed": {
+    "key": "colock_failed",
+    "type": "text",
+    "value": "添加共锁失败"
+  },
+  "colocker": {
+    "key": "colocker",
+    "type": "text",
+    "value": "共锁人"
+  },
+  "confirm": {
+    "key": "confirm",
+    "type": "text",
+    "value": "执行确认"
+  },
+  "confirm_cancel_exception": {
+    "key": "confirm_cancel_exception",
+    "type": "text",
+    "value": "是否确认取消异常"
+  },
+  "confirm_create_lock_job": {
+    "key": "confirm_create_lock_job",
+    "type": "text",
+    "value": "确认是否创建上锁作业"
+  },
+  "confirm_create_unlock_job": {
+    "key": "confirm_create_unlock_job",
+    "type": "text",
+    "value": "是否创建解锁作业"
+  },
+  "confirm_handle_exception": {
+    "key": "confirm_handle_exception",
+    "type": "text",
+    "value": "是否确认处理异常"
+  },
+  "confirm_to_colock": {
+    "key": "confirm_to_colock",
+    "type": "text",
+    "value": "{0}是否确认共锁?"
+  },
+  "confirm_to_uncolock": {
+    "key": "confirm_to_uncolock",
+    "type": "text",
+    "value": "{0}是否确认解除共锁?"
+  },
+  "continue_the_ticket": {
+    "key": "continue_the_ticket",
+    "type": "text",
+    "value": "请继续完成作业票"
+  },
+  "create_job_failed": {
+    "key": "create_job_failed",
+    "type": "text",
+    "value": "创建作业失败"
+  },
+  "create_job_name": {
+    "key": "create_job_name",
+    "type": "text",
+    "value": "作业名称"
+  },
+  "create_job_title": {
+    "key": "create_job_title",
+    "type": "text",
+    "value": "新建作业"
+  },
+  "create_sop_job_sop": {
+    "key": "create_sop_job_sop",
+    "type": "text",
+    "value": "SOP"
+  },
+  "create_sop_job_tip": {
+    "key": "create_sop_job_tip",
+    "type": "text",
+    "value": "确定要执行作业{0}吗?"
+  },
+  "create_sop_job_title": {
+    "key": "create_sop_job_title",
+    "type": "text",
+    "value": "新建SOP作业"
+  },
+  "create_sop_name": {
+    "key": "create_sop_name",
+    "type": "text",
+    "value": "SOP名称"
+  },
+  "create_sop_title": {
+    "key": "create_sop_title",
+    "type": "text",
+    "value": "新建SOP"
+  },
+  "current_job_has_cross_job": {
+    "key": "current_job_has_cross_job",
+    "type": "text",
+    "value": "警告!当前作业存在交叉作业,是否继续处理异常"
+  },
+  "current_role_no_user": {
+    "key": "current_role_no_user",
+    "type": "text",
+    "value": "当前角色暂无用户"
+  },
+  "current_slot_has_no_key": {
+    "key": "current_slot_has_no_key",
+    "type": "text",
+    "value": "当前仓位不存在钥匙"
+  },
+  "current_slot_has_no_lock": {
+    "key": "current_slot_has_no_lock",
+    "type": "text",
+    "value": "当前仓位不存在挂锁"
+  },
+  "current_sop_has_job_in_progress": {
+    "key": "current_sop_has_job_in_progress",
+    "type": "text",
+    "value": "当前SOP存在进行中的作业"
+  },
+  "current_ticket_report_lock_take_exception_tip": {
+    "key": "current_ticket_report_lock_take_exception_tip",
+    "type": "text",
+    "value": "当前作业挂锁上报异常,请归还挂锁"
+  },
+  "current_user_has_not_face_data": {
+    "key": "current_user_has_not_face_data",
+    "type": "text",
+    "value": "当前用户不存在人脸数据"
+  },
+  "current_workflow_mode_error": {
+    "key": "current_workflow_mode_error",
+    "type": "text",
+    "value": "当前流程模式错误"
+  },
+  "currently_no_hardware_can_be_report": {
+    "key": "currently_no_hardware_can_be_report",
+    "type": "text",
+    "value": "当前没有硬件可以上报"
+  },
+  "currently_no_job_can_be_report": {
+    "key": "currently_no_job_can_be_report",
+    "type": "text",
+    "value": "当前没有作业可以上报"
+  },
+  "currently_unable_to_lock_together": {
+    "key": "currently_unable_to_lock_together",
+    "type": "text",
+    "value": "当前阶段无法共锁"
+  },
+  "data_content_error": {
+    "key": "data_content_error",
+    "type": "text",
+    "value": "数据内容错误"
+  },
+  "data_decrypt_failed": {
+    "key": "data_decrypt_failed",
+    "type": "text",
+    "value": "数据解密失败"
+  },
+  "data_file_is_corrupted": {
+    "key": "data_file_is_corrupted",
+    "type": "text",
+    "value": "数据文件已损坏"
+  },
+  "data_file_not_exists": {
+    "key": "data_file_not_exists",
+    "type": "text",
+    "value": "数据文件不存在"
+  },
+  "date": {
+    "key": "date",
+    "type": "text",
+    "value": "{0}年{1}月{2}日"
+  },
+  "delete": {
+    "key": "delete",
+    "type": "text",
+    "value": "删除"
+  },
+  "delete_group": {
+    "key": "delete_group",
+    "type": "text",
+    "value": "删除分组"
+  },
+  "delete_success": {
+    "key": "delete_success",
+    "type": "text",
+    "value": "删除成功"
+  },
+  "detail": {
+    "key": "detail",
+    "type": "text",
+    "value": "详情"
+  },
+  "detect_face_tip": {
+    "key": "detect_face_tip",
+    "type": "text",
+    "value": "检测到人脸,即将拍摄"
+  },
+  "detect_port": {
+    "key": "detect_port",
+    "type": "text",
+    "value": "正在扫描设备......"
+  },
+  "detect_slot": {
+    "key": "detect_slot",
+    "type": "text",
+    "value": "检测仓位"
+  },
+  "device_in_detect": {
+    "key": "device_in_detect",
+    "type": "text",
+    "value": "设备识别中"
+  },
+  "do_you_want_to_remove_exception": {
+    "key": "do_you_want_to_remove_exception",
+    "type": "text",
+    "value": "是否确认移除该异常"
+  },
+  "doing_checking": {
+    "key": "doing_checking",
+    "type": "text",
+    "value": "正在验证......"
+  },
+  "doing_login": {
+    "key": "doing_login",
+    "type": "text",
+    "value": "正在登录······"
+  },
+  "done_header": {
+    "key": "done_header",
+    "type": "text",
+    "value": "已处理"
+  },
+  "edit": {
+    "key": "edit",
+    "type": "text",
+    "value": "编辑"
+  },
+  "edit_job_title": {
+    "key": "edit_job_title",
+    "type": "text",
+    "value": "作业详情"
+  },
+  "edit_sop_job_title": {
+    "key": "edit_sop_job_title",
+    "type": "text",
+    "value": "SOP作业详情"
+  },
+  "edit_sop_title": {
+    "key": "edit_sop_title",
+    "type": "text",
+    "value": "SOP详情"
+  },
+  "end": {
+    "key": "end",
+    "type": "text",
+    "value": "结束作业"
+  },
+  "end_job": {
+    "key": "end_job",
+    "type": "text",
+    "value": "结束作业"
+  },
+  "end_time": {
+    "key": "end_time",
+    "type": "text",
+    "value": "结束时间"
+  },
+  "ensure_power_isolation": {
+    "key": "ensure_power_isolation",
+    "type": "text",
+    "value": "能量隔离证实"
+  },
+  "error_date_range_invalid": {
+    "key": "error_date_range_invalid",
+    "type": "text",
+    "value": "开始时间不能晚于结束时间"
+  },
+  "exception_data_not_exists": {
+    "key": "exception_data_not_exists",
+    "type": "text",
+    "value": "异常数据不存在"
+  },
+  "exception_description": {
+    "key": "exception_description",
+    "type": "text",
+    "value": "异常描述:"
+  },
+  "exception_description_tv": {
+    "key": "exception_description_tv",
+    "type": "text",
+    "value": "异常描述"
+  },
+  "exception_detail_title": {
+    "key": "exception_detail_title",
+    "type": "text",
+    "value": "异常详情"
+  },
+  "exception_info": {
+    "key": "exception_info",
+    "type": "text",
+    "value": "异常信息"
+  },
+  "exception_job": {
+    "key": "exception_job",
+    "type": "text",
+    "value": "异常作业"
+  },
+  "exception_job_title": {
+    "key": "exception_job_title",
+    "type": "text",
+    "value": "异常作业"
+  },
+  "exception_lost": {
+    "key": "exception_lost",
+    "type": "text",
+    "value": "异常丢失"
+  },
+  "exception_manage_title": {
+    "key": "exception_manage_title",
+    "type": "text",
+    "value": "异常管理"
+  },
+  "exception_occurrence_time": {
+    "key": "exception_occurrence_time",
+    "type": "text",
+    "value": "异常发生时间:"
+  },
+  "exception_occurrence_time_header": {
+    "key": "exception_occurrence_time_header",
+    "type": "text",
+    "value": "发生时间"
+  },
+  "exception_reason": {
+    "key": "exception_reason",
+    "type": "text",
+    "value": "异常信息"
+  },
+  "exception_release_time": {
+    "key": "exception_release_time",
+    "type": "text",
+    "value": "异常解除时间:"
+  },
+  "exception_report": {
+    "key": "exception_report",
+    "type": "text",
+    "value": "异常上报"
+  },
+  "exception_report_success": {
+    "key": "exception_report_success",
+    "type": "text",
+    "value": "异常上报成功"
+  },
+  "exception_reporter": {
+    "key": "exception_reporter",
+    "type": "text",
+    "value": "上报人:"
+  },
+  "exception_source": {
+    "key": "exception_source",
+    "type": "text",
+    "value": "异常源:"
+  },
+  "exception_source_tv": {
+    "key": "exception_source_tv",
+    "type": "text",
+    "value": "异常源"
+  },
+  "exception_status": {
+    "key": "exception_status",
+    "type": "text",
+    "value": "状态:"
+  },
+  "exception_status_header": {
+    "key": "exception_status_header",
+    "type": "text",
+    "value": "异常状态"
+  },
+  "exception_type": {
+    "key": "exception_type",
+    "type": "text",
+    "value": "异常类型:"
+  },
+  "exception_type_header": {
+    "key": "exception_type_header",
+    "type": "text",
+    "value": "异常类型"
+  },
+  "exception_type_tv": {
+    "key": "exception_type_tv",
+    "type": "text",
+    "value": "异常类型"
+  },
+  "expand_collapse": {
+    "key": "expand_collapse",
+    "type": "text",
+    "value": "展开/折叠"
+  },
+  "face_can_not_process": {
+    "key": "face_can_not_process",
+    "type": "text",
+    "value": "人脸引擎激活失败,识别暂不可用"
+  },
+  "face_detected_do_login": {
+    "key": "face_detected_do_login",
+    "type": "text",
+    "value": "检测到人脸,正在登录······"
+  },
+  "face_login": {
+    "key": "face_login",
+    "type": "text",
+    "value": "人脸登录"
+  },
+  "face_login_failed": {
+    "key": "face_login_failed",
+    "type": "text",
+    "value": "人脸匹配失败,请重试"
+  },
+  "face_login_success": {
+    "key": "face_login_success",
+    "type": "text",
+    "value": "人脸验证通过"
+  },
+  "face_not_set_tip": {
+    "key": "face_not_set_tip",
+    "type": "text",
+    "value": "您尚未设置人脸数据"
+  },
+  "face_set_tip": {
+    "key": "face_set_tip",
+    "type": "text",
+    "value": "您已设置了人脸数据"
+  },
+  "file_not_exists": {
+    "key": "file_not_exists",
+    "type": "text",
+    "value": "文件不存在"
+  },
+  "filter": {
+    "key": "filter",
+    "type": "text",
+    "value": "筛选"
+  },
+  "fingerprint_add_success_tip": {
+    "key": "fingerprint_add_success_tip",
+    "type": "text",
+    "value": "已成功添加指纹数据"
+  },
+  "fingerprint_code": {
+    "key": "fingerprint_code",
+    "type": "text",
+    "value": "指纹编号"
+  },
+  "fingerprint_code_str": {
+    "key": "fingerprint_code_str",
+    "type": "text",
+    "value": "指纹_{0}"
+  },
+  "fingerprint_delete_confirm_tip": {
+    "key": "fingerprint_delete_confirm_tip",
+    "type": "text",
+    "value": "确定要删除{0}吗?"
+  },
+  "fingerprint_delete_selected_confirm_tip": {
+    "key": "fingerprint_delete_selected_confirm_tip",
+    "type": "text",
+    "value": "确定要删除选中的指纹吗?"
+  },
+  "fingerprint_login": {
+    "key": "fingerprint_login",
+    "type": "text",
+    "value": "指纹登录"
+  },
+  "fingerprint_login_failed": {
+    "key": "fingerprint_login_failed",
+    "type": "text",
+    "value": "指纹识别失败,请重试"
+  },
+  "fingerprint_login_success": {
+    "key": "fingerprint_login_success",
+    "type": "text",
+    "value": "指纹验证通过"
+  },
+  "fingerprint_scan_tip": {
+    "key": "fingerprint_scan_tip",
+    "type": "text",
+    "value": "请连续按压{0}次指纹识别区"
+  },
+  "finish_job_tip": {
+    "key": "finish_job_tip",
+    "type": "text",
+    "value": "是否确认结束当前作业"
+  },
+  "finish_the_job": {
+    "key": "finish_the_job",
+    "type": "text",
+    "value": "结束作业"
+  },
+  "get_key_info_fail": {
+    "key": "get_key_info_fail",
+    "type": "text",
+    "value": "获取钥匙信息失败"
+  },
+  "go_locking": {
+    "key": "go_locking",
+    "type": "text",
+    "value": "去上锁"
+  },
+  "go_unlocking": {
+    "key": "go_unlocking",
+    "type": "text",
+    "value": "去解锁"
+  },
+  "group_at_least_has_one_point": {
+    "key": "group_at_least_has_one_point",
+    "type": "text",
+    "value": "每个分组至少需要存在一个点位"
+  },
+  "group_job_in_progress": {
+    "key": "group_job_in_progress",
+    "type": "text",
+    "value": "分组作业进行中"
+  },
+  "group_name_must_not_empty": {
+    "key": "group_name_must_not_empty",
+    "type": "text",
+    "value": "分组名称不能为空"
+  },
+  "handle": {
+    "key": "handle",
+    "type": "text",
+    "value": "处理"
+  },
+  "handle_colock": {
+    "key": "handle_colock",
+    "type": "text",
+    "value": "请确认是否要进行添加共锁"
+  },
+  "handle_exception": {
+    "key": "handle_exception",
+    "type": "text",
+    "value": "处理异常"
+  },
+  "handle_exception_success": {
+    "key": "handle_exception_success",
+    "type": "text",
+    "value": "异常处理成功"
+  },
+  "handle_exception_will_release_all_colock": {
+    "key": "handle_exception_will_release_all_colock",
+    "type": "text",
+    "value": "警告!处理异常将移除所有共锁,请确认是否继续"
+  },
+  "handle_failed": {
+    "key": "handle_failed",
+    "type": "text",
+    "value": "处理失败"
+  },
+  "handle_lock_take_key": {
+    "key": "handle_lock_take_key",
+    "type": "text",
+    "value": "确认获取钥匙进行上锁吗?"
+  },
+  "handle_release_colock": {
+    "key": "handle_release_colock",
+    "type": "text",
+    "value": "请确认是否要进行解除共锁"
+  },
+  "handle_step_confirm": {
+    "key": "handle_step_confirm",
+    "type": "text",
+    "value": "请确认是否完成[{0}]"
+  },
+  "handle_time": {
+    "key": "handle_time",
+    "type": "text",
+    "value": "处理时间:"
+  },
+  "handle_time_custom_time_range": {
+    "key": "handle_time_custom_time_range",
+    "type": "text",
+    "value": "自定义区间"
+  },
+  "handle_time_last_30_days": {
+    "key": "handle_time_last_30_days",
+    "type": "text",
+    "value": "近30天"
+  },
+  "handle_time_last_7_days": {
+    "key": "handle_time_last_7_days",
+    "type": "text",
+    "value": "近7天"
+  },
+  "handle_unknown": {
+    "key": "handle_unknown",
+    "type": "text",
+    "value": "当前处理类型未知,无法处理"
+  },
+  "handle_unlock_take_key": {
+    "key": "handle_unlock_take_key",
+    "type": "text",
+    "value": "确认获取钥匙进行解锁吗?"
+  },
+  "hardware_in_use_tv": {
+    "key": "hardware_in_use_tv",
+    "type": "text",
+    "value": "使用中的硬件"
+  },
+  "hardware_info": {
+    "key": "hardware_info",
+    "type": "text",
+    "value": "硬件信息: {0}"
+  },
+  "hardware_key": {
+    "key": "hardware_key",
+    "type": "text",
+    "value": "钥匙"
+  },
+  "hardware_lock": {
+    "key": "hardware_lock",
+    "type": "text",
+    "value": "挂锁"
+  },
+  "hardware_unknown": {
+    "key": "hardware_unknown",
+    "type": "text",
+    "value": "未知"
+  },
+  "has_job_in_progress": {
+    "key": "has_job_in_progress",
+    "type": "text",
+    "value": "存在正在进行中的作业"
+  },
+  "has_locked": {
+    "key": "has_locked",
+    "type": "text",
+    "value": "已上锁"
+  },
+  "has_user_in_progress_job": {
+    "key": "has_user_in_progress_job",
+    "type": "text",
+    "value": "有用户在进行的作业中"
+  },
+  "home_overview_data_title": {
+    "key": "home_overview_data_title",
+    "type": "text",
+    "value": "总览数据"
+  },
+  "home_realtime_data_title": {
+    "key": "home_realtime_data_title",
+    "type": "text",
+    "value": "实时数据"
+  },
+  "import_str": {
+    "key": "import_str",
+    "type": "text",
+    "value": "导入"
+  },
+  "import_success": {
+    "key": "import_success",
+    "type": "text",
+    "value": "导入成功"
+  },
+  "in_progress_job_manage_title": {
+    "key": "in_progress_job_manage_title",
+    "type": "text",
+    "value": "进行中的作业"
+  },
+  "init_card_registration_step_hint": {
+    "key": "init_card_registration_step_hint",
+    "type": "text",
+    "value": "请在读卡器上刷卡"
+  },
+  "init_card_registration_step_tip": {
+    "key": "init_card_registration_step_tip",
+    "type": "text",
+    "value": "识别并录入卡片"
+  },
+  "init_device_registration_key_and_lock_complete_step_hint": {
+    "key": "init_device_registration_key_and_lock_complete_step_hint",
+    "type": "text",
+    "value": "扫描完成"
+  },
+  "init_device_registration_key_and_lock_step_hint": {
+    "key": "init_device_registration_key_and_lock_step_hint",
+    "type": "text",
+    "value": "请等待系统识别钥匙和挂锁"
+  },
+  "init_device_registration_key_and_lock_step_tip": {
+    "key": "init_device_registration_key_and_lock_step_tip",
+    "type": "text",
+    "value": "识别钥匙和挂锁"
+  },
+  "init_point_rfid_registration_step_hint": {
+    "key": "init_point_rfid_registration_step_hint",
+    "type": "text",
+    "value": "请在读卡器上刷点位RFID标签"
+  },
+  "init_point_rfid_registration_step_tip": {
+    "key": "init_point_rfid_registration_step_tip",
+    "type": "text",
+    "value": "识别并录入点位RFID标签"
+  },
+  "init_set_admin_account_step": {
+    "key": "init_set_admin_account_step",
+    "type": "text",
+    "value": "1"
+  },
+  "init_set_admin_account_step_hint": {
+    "key": "init_set_admin_account_step_hint",
+    "type": "text",
+    "value": "请设置管理员账号密码"
+  },
+  "init_set_admin_account_step_tip": {
+    "key": "init_set_admin_account_step_tip",
+    "type": "text",
+    "value": "设置管理员账号"
+  },
+  "init_set_remote_server_step_hint": {
+    "key": "init_set_remote_server_step_hint",
+    "type": "text",
+    "value": "请设置服务器的地址和端口"
+  },
+  "init_set_remote_server_step_tip": {
+    "key": "init_set_remote_server_step_tip",
+    "type": "text",
+    "value": "配置服务器"
+  },
+  "insert": {
+    "key": "insert",
+    "type": "text",
+    "value": "新增"
+  },
+  "invalid_card": {
+    "key": "invalid_card",
+    "type": "text",
+    "value": "卡片无效"
+  },
+  "invalid_user": {
+    "key": "invalid_user",
+    "type": "text",
+    "value": "用户不存在"
+  },
+  "item_my_todo_complete_time_title": {
+    "key": "item_my_todo_complete_time_title",
+    "type": "text",
+    "value": "完成时间:"
+  },
+  "item_my_todo_current_operation_title": {
+    "key": "item_my_todo_current_operation_title",
+    "type": "text",
+    "value": "当前操作:"
+  },
+  "item_my_todo_current_step_title": {
+    "key": "item_my_todo_current_step_title",
+    "type": "text",
+    "value": "当前步骤:"
+  },
+  "item_my_todo_job_name_title": {
+    "key": "item_my_todo_job_name_title",
+    "type": "text",
+    "value": "相关作业:"
+  },
+  "job_already_finished": {
+    "key": "job_already_finished",
+    "type": "text",
+    "value": "该作业已被结束"
+  },
+  "job_canceled": {
+    "key": "job_canceled",
+    "type": "text",
+    "value": "作业已取消"
+  },
+  "job_card_login_failed": {
+    "key": "job_card_login_failed",
+    "type": "text",
+    "value": "工卡无效"
+  },
+  "job_card_login_success": {
+    "key": "job_card_login_success",
+    "type": "text",
+    "value": "工卡识别成功"
+  },
+  "job_card_not_set_tip": {
+    "key": "job_card_not_set_tip",
+    "type": "text",
+    "value": "您尚未设置工卡"
+  },
+  "job_card_scan_tip": {
+    "key": "job_card_scan_tip",
+    "type": "text",
+    "value": "请在读卡器上读卡"
+  },
+  "job_card_set_tip": {
+    "key": "job_card_set_tip",
+    "type": "text",
+    "value": "您已设置了工卡数据"
+  },
+  "job_create_and_execute_failed": {
+    "key": "job_create_and_execute_failed",
+    "type": "text",
+    "value": "作业执行失败"
+  },
+  "job_create_and_execute_succeed": {
+    "key": "job_create_and_execute_succeed",
+    "type": "text",
+    "value": "作业开始执行"
+  },
+  "job_create_failed": {
+    "key": "job_create_failed",
+    "type": "text",
+    "value": "作业保存失败"
+  },
+  "job_create_succeed": {
+    "key": "job_create_succeed",
+    "type": "text",
+    "value": "作业保存成功"
+  },
+  "job_execute_colocker_colock_status_title": {
+    "key": "job_execute_colocker_colock_status_title",
+    "type": "text",
+    "value": "共锁人员共锁状态"
+  },
+  "job_execute_lock_status_title": {
+    "key": "job_execute_lock_status_title",
+    "type": "text",
+    "value": "隔离点锁定状态"
+  },
+  "job_execute_step_description": {
+    "key": "job_execute_step_description",
+    "type": "text",
+    "value": "操作说明({0})"
+  },
+  "job_execute_tab_title_colock": {
+    "key": "job_execute_tab_title_colock",
+    "type": "text",
+    "value": "共锁"
+  },
+  "job_execute_tab_title_lock": {
+    "key": "job_execute_tab_title_lock",
+    "type": "text",
+    "value": "锁定"
+  },
+  "job_execute_title": {
+    "key": "job_execute_title",
+    "type": "text",
+    "value": "作业执行"
+  },
+  "job_finished": {
+    "key": "job_finished",
+    "type": "text",
+    "value": "作业已结束"
+  },
+  "job_lost": {
+    "key": "job_lost",
+    "type": "text",
+    "value": "作业丢失"
+  },
+  "job_manage_delete_failed": {
+    "key": "job_manage_delete_failed",
+    "type": "text",
+    "value": "无法删除选中的作业"
+  },
+  "job_manage_delete_succeed": {
+    "key": "job_manage_delete_succeed",
+    "type": "text",
+    "value": "删除选中的作业成功"
+  },
+  "job_manage_title": {
+    "key": "job_manage_title",
+    "type": "text",
+    "value": "作业管理"
+  },
+  "job_name": {
+    "key": "job_name",
+    "type": "text",
+    "value": "作业名称"
+  },
+  "job_save_and_execute_tip": {
+    "key": "job_save_and_execute_tip",
+    "type": "text",
+    "value": "确定要执行作业{0}吗?"
+  },
+  "job_save_tip": {
+    "key": "job_save_tip",
+    "type": "text",
+    "value": "确定要保存作业{0}吗?"
+  },
+  "job_status": {
+    "key": "job_status",
+    "type": "text",
+    "value": "作业状态"
+  },
+  "job_workstation": {
+    "key": "job_workstation",
+    "type": "text",
+    "value": "作业区域"
+  },
+  "key_exception_tag": {
+    "key": "key_exception_tag",
+    "type": "text",
+    "value": "该钥匙已被标记异常"
+  },
+  "key_in_use": {
+    "key": "key_in_use",
+    "type": "text",
+    "value": "钥匙正在使用"
+  },
+  "key_info_already_exists": {
+    "key": "key_info_already_exists",
+    "type": "text",
+    "value": "钥匙信息已存在"
+  },
+  "key_is_in_failure_mode": {
+    "key": "key_is_in_failure_mode",
+    "type": "text",
+    "value": "钥匙处于故障模式"
+  },
+  "key_mac": {
+    "key": "key_mac",
+    "type": "text",
+    "value": "钥匙MAC"
+  },
+  "key_manage_delete_failed": {
+    "key": "key_manage_delete_failed",
+    "type": "text",
+    "value": "钥匙删除失败"
+  },
+  "key_manage_delete_succeed": {
+    "key": "key_manage_delete_succeed",
+    "type": "text",
+    "value": "钥匙删除成功"
+  },
+  "key_manage_key_detail_title": {
+    "key": "key_manage_key_detail_title",
+    "type": "text",
+    "value": "钥匙详情"
+  },
+  "key_manage_new_key_title": {
+    "key": "key_manage_new_key_title",
+    "type": "text",
+    "value": "新增钥匙"
+  },
+  "key_manage_title": {
+    "key": "key_manage_title",
+    "type": "text",
+    "value": "钥匙管理"
+  },
+  "key_name": {
+    "key": "key_name",
+    "type": "text",
+    "value": "钥匙名称"
+  },
+  "key_nfc": {
+    "key": "key_nfc",
+    "type": "text",
+    "value": "钥匙NFC"
+  },
+  "key_not_exists": {
+    "key": "key_not_exists",
+    "type": "text",
+    "value": "钥匙不存在"
+  },
+  "key_return_success": {
+    "key": "key_return_success",
+    "type": "text",
+    "value": "钥匙归还成功"
+  },
+  "key_return_tip": {
+    "key": "key_return_tip",
+    "type": "text",
+    "value": "作业票尚未完成,禁止归还钥匙"
+  },
+  "key_take_error_tip": {
+    "key": "key_take_error_tip",
+    "type": "text",
+    "value": "钥匙分配失败,请检查硬件状态"
+  },
+  "loading_data": {
+    "key": "loading_data",
+    "type": "text",
+    "value": "数据加载中"
+  },
+  "loading_device": {
+    "key": "loading_device",
+    "type": "text",
+    "value": "正在加载硬件......"
+  },
+  "loading_msg_get_ticket_status_start": {
+    "key": "loading_msg_get_ticket_status_start",
+    "type": "text",
+    "value": "正在读取钥匙作业票"
+  },
+  "loading_msg_return_key_start": {
+    "key": "loading_msg_return_key_start",
+    "type": "text",
+    "value": "开始连接钥匙,请稍候······"
+  },
+  "lock": {
+    "key": "lock",
+    "type": "text",
+    "value": "挂锁"
+  },
+  "lock_already_exists": {
+    "key": "lock_already_exists",
+    "type": "text",
+    "value": "挂锁信息已存在"
+  },
+  "lock_code": {
+    "key": "lock_code",
+    "type": "text",
+    "value": "挂锁编号"
+  },
+  "lock_exception_tag": {
+    "key": "lock_exception_tag",
+    "type": "text",
+    "value": "该挂锁已被标记异常"
+  },
+  "lock_in_use": {
+    "key": "lock_in_use",
+    "type": "text",
+    "value": "挂锁正在使用中"
+  },
+  "lock_is_not_enough": {
+    "key": "lock_is_not_enough",
+    "type": "text",
+    "value": "锁具数量不足"
+  },
+  "lock_key_return_tip": {
+    "key": "lock_key_return_tip",
+    "type": "text",
+    "value": "作业票尚未完成,是否强制上传数据"
+  },
+  "lock_manage_delete_failed": {
+    "key": "lock_manage_delete_failed",
+    "type": "text",
+    "value": "挂锁删除失败"
+  },
+  "lock_manage_delete_succeed": {
+    "key": "lock_manage_delete_succeed",
+    "type": "text",
+    "value": "挂锁删除成功"
+  },
+  "lock_manage_lock_detail_title": {
+    "key": "lock_manage_lock_detail_title",
+    "type": "text",
+    "value": "挂锁详情"
+  },
+  "lock_manage_new_lock_title": {
+    "key": "lock_manage_new_lock_title",
+    "type": "text",
+    "value": "新增挂锁"
+  },
+  "lock_manage_title": {
+    "key": "lock_manage_title",
+    "type": "text",
+    "value": "挂锁管理"
+  },
+  "lock_name": {
+    "key": "lock_name",
+    "type": "text",
+    "value": "挂锁名称"
+  },
+  "lock_nfc": {
+    "key": "lock_nfc",
+    "type": "text",
+    "value": "挂锁 NFC"
+  },
+  "lock_status": {
+    "key": "lock_status",
+    "type": "text",
+    "value": "上锁状态"
+  },
+  "lock_take_report_fail": {
+    "key": "lock_take_report_fail",
+    "type": "text",
+    "value": "挂锁取出上报失败"
+  },
+  "locked_points_title": {
+    "key": "locked_points_title",
+    "type": "text",
+    "value": "锁定中的点位"
+  },
+  "locked_points_tv": {
+    "key": "locked_points_tv",
+    "type": "text",
+    "value": "锁定中的点位"
+  },
+  "locker": {
+    "key": "locker",
+    "type": "text",
+    "value": "上锁人"
+  },
+  "login": {
+    "key": "login",
+    "type": "text",
+    "value": "登录"
+  },
+  "login_tip": {
+    "key": "login_tip",
+    "type": "text",
+    "value": "请输入用户名和密码或者刷卡进行登录"
+  },
+  "loto": {
+    "key": "loto",
+    "type": "text",
+    "value": "智能锁控系统"
+  },
+  "loto_en": {
+    "key": "loto_en",
+    "type": "text",
+    "value": "Intelligent Lock Control System"
+  },
+  "manage_filter_status": {
+    "key": "manage_filter_status",
+    "type": "text",
+    "value": "状态"
+  },
+  "manage_role_function_permission": {
+    "key": "manage_role_function_permission",
+    "type": "text",
+    "value": "功能权限"
+  },
+  "member_info_title": {
+    "key": "member_info_title",
+    "type": "text",
+    "value": "人员信息"
+  },
+  "move_down": {
+    "key": "move_down",
+    "type": "text",
+    "value": "下移"
+  },
+  "move_up": {
+    "key": "move_up",
+    "type": "text",
+    "value": "上移"
+  },
+  "my_todo_title": {
+    "key": "my_todo_title",
+    "type": "text",
+    "value": "我的待办"
+  },
+  "navigate_to_step": {
+    "key": "navigate_to_step",
+    "type": "text",
+    "value": "跳转到第{0}步"
+  },
+  "new_device": {
+    "key": "new_device",
+    "type": "text",
+    "value": "New"
+  },
+  "new_group": {
+    "key": "new_group",
+    "type": "text",
+    "value": "新分组{0}"
+  },
+  "new_password": {
+    "key": "new_password",
+    "type": "text",
+    "value": "新密码(数字、字母、特殊符号、6-20位)"
+  },
+  "new_password_and_repeat_new_password_not_same": {
+    "key": "new_password_and_repeat_new_password_not_same",
+    "type": "text",
+    "value": "新密码与重复新密码不一致"
+  },
+  "new_password_cannot_be_the_same_as_the_old_password": {
+    "key": "new_password_cannot_be_the_same_as_the_old_password",
+    "type": "text",
+    "value": "新密码与旧密码不能相同"
+  },
+  "next": {
+    "key": "next",
+    "type": "text",
+    "value": "下一步"
+  },
+  "nickname": {
+    "key": "nickname",
+    "type": "text",
+    "value": "姓名"
+  },
+  "no_available_key": {
+    "key": "no_available_key",
+    "type": "text",
+    "value": "暂无可用钥匙"
+  },
+  "no_data": {
+    "key": "no_data",
+    "type": "text",
+    "value": "暂无数据"
+  },
+  "no_goto_step": {
+    "key": "no_goto_step",
+    "type": "text",
+    "value": "无跳转"
+  },
+  "no_permission_to_handle": {
+    "key": "no_permission_to_handle",
+    "type": "text",
+    "value": "您暂无权限操作当前作业票"
+  },
+  "no_response_board_exists": {
+    "key": "no_response_board_exists",
+    "type": "text",
+    "value": "存在未响应的主板"
+  },
+  "normal": {
+    "key": "normal",
+    "type": "text",
+    "value": "正常"
+  },
+  "not_group_can_lock": {
+    "key": "not_group_can_lock",
+    "type": "text",
+    "value": "当前无分组可上锁"
+  },
+  "not_group_can_unlock": {
+    "key": "not_group_can_unlock",
+    "type": "text",
+    "value": "当前无分组可解锁"
+  },
+  "not_in_slot": {
+    "key": "not_in_slot",
+    "type": "text",
+    "value": "未在仓位"
+  },
+  "not_save_tip": {
+    "key": "not_save_tip",
+    "type": "text",
+    "value": "数据还没有保存,您确定要放弃保存,离开当前页面吗?"
+  },
+  "number": {
+    "key": "number",
+    "type": "text",
+    "value": "编号:"
+  },
+  "old_password": {
+    "key": "old_password",
+    "type": "text",
+    "value": "旧密码"
+  },
+  "old_password_error": {
+    "key": "old_password_error",
+    "type": "text",
+    "value": "旧密码错误"
+  },
+  "one_key_cancel": {
+    "key": "one_key_cancel",
+    "type": "text",
+    "value": "一键取消"
+  },
+  "one_key_handle": {
+    "key": "one_key_handle",
+    "type": "text",
+    "value": "一键处理"
+  },
+  "ongoing_job_tv": {
+    "key": "ongoing_job_tv",
+    "type": "text",
+    "value": "进行中的作业"
+  },
+  "only_one_person_allowed": {
+    "key": "only_one_person_allowed",
+    "type": "text",
+    "value": "请保持单人入镜"
+  },
+  "operation": {
+    "key": "operation",
+    "type": "text",
+    "value": "操作"
+  },
+  "password_and_repeat_password_not_same": {
+    "key": "password_and_repeat_password_not_same",
+    "type": "text",
+    "value": "密码与重复密码不一致"
+  },
+  "password_regex_tip": {
+    "key": "password_regex_tip",
+    "type": "text",
+    "value": "密码不符合要求"
+  },
+  "phone": {
+    "key": "phone",
+    "type": "text",
+    "value": "电话"
+  },
+  "please_do_colock": {
+    "key": "please_do_colock",
+    "type": "text",
+    "value": "请共锁人完成共锁"
+  },
+  "please_do_uncolock": {
+    "key": "please_do_uncolock",
+    "type": "text",
+    "value": "请共锁人解除共锁"
+  },
+  "please_done_operation": {
+    "key": "please_done_operation",
+    "type": "text",
+    "value": "请先完成{0}"
+  },
+  "please_go_locking": {
+    "key": "please_go_locking",
+    "type": "text",
+    "value": "请上锁员执行去上锁操作"
+  },
+  "please_go_unlocking": {
+    "key": "please_go_unlocking",
+    "type": "text",
+    "value": "请上锁员执行去解锁操作"
+  },
+  "please_input_account": {
+    "key": "please_input_account",
+    "type": "text",
+    "value": "请输入用户名"
+  },
+  "please_input_admin_username": {
+    "key": "please_input_admin_username",
+    "type": "text",
+    "value": "请输入管理员账号"
+  },
+  "please_input_area": {
+    "key": "please_input_area",
+    "type": "text",
+    "value": "请输入区域"
+  },
+  "please_input_card_code": {
+    "key": "please_input_card_code",
+    "type": "text",
+    "value": "请输入工卡"
+  },
+  "please_input_card_nfc": {
+    "key": "please_input_card_nfc",
+    "type": "text",
+    "value": "请输入卡片 NFC"
+  },
+  "please_input_correct_phone": {
+    "key": "please_input_correct_phone",
+    "type": "text",
+    "value": "请输入正确的手机号"
+  },
+  "please_input_exception_reason": {
+    "key": "please_input_exception_reason",
+    "type": "text",
+    "value": "请输入异常原因"
+  },
+  "please_input_job_name": {
+    "key": "please_input_job_name",
+    "type": "text",
+    "value": "请输入作业名称"
+  },
+  "please_input_key_mac": {
+    "key": "please_input_key_mac",
+    "type": "text",
+    "value": "请输入钥匙MAC"
+  },
+  "please_input_key_name": {
+    "key": "please_input_key_name",
+    "type": "text",
+    "value": "请输入钥匙名称"
+  },
+  "please_input_key_nfc": {
+    "key": "please_input_key_nfc",
+    "type": "text",
+    "value": "请输入钥匙NFC"
+  },
+  "please_input_key_word": {
+    "key": "please_input_key_word",
+    "type": "text",
+    "value": "请输入关键字"
+  },
+  "please_input_lock_code": {
+    "key": "please_input_lock_code",
+    "type": "text",
+    "value": "请输入挂锁编号"
+  },
+  "please_input_lock_nfc": {
+    "key": "please_input_lock_nfc",
+    "type": "text",
+    "value": "请输入挂锁 NFC"
+  },
+  "please_input_new_password": {
+    "key": "please_input_new_password",
+    "type": "text",
+    "value": "请输入新密码"
+  },
+  "please_input_nickname": {
+    "key": "please_input_nickname",
+    "type": "text",
+    "value": "请输入姓名"
+  },
+  "please_input_old_password": {
+    "key": "please_input_old_password",
+    "type": "text",
+    "value": "请输入旧密码"
+  },
+  "please_input_password": {
+    "key": "please_input_password",
+    "type": "text",
+    "value": "请输入密码"
+  },
+  "please_input_permission_characters": {
+    "key": "please_input_permission_characters",
+    "type": "text",
+    "value": "请输入权限字符"
+  },
+  "please_input_phone": {
+    "key": "please_input_phone",
+    "type": "text",
+    "value": "请输入电话"
+  },
+  "please_input_point_function": {
+    "key": "please_input_point_function",
+    "type": "text",
+    "value": "请输入隔离点作用"
+  },
+  "please_input_point_name": {
+    "key": "please_input_point_name",
+    "type": "text",
+    "value": "请输入隔离点名称"
+  },
+  "please_input_remark": {
+    "key": "please_input_remark",
+    "type": "text",
+    "value": "请输入备注"
+  },
+  "please_input_remote_server_address": {
+    "key": "please_input_remote_server_address",
+    "type": "text",
+    "value": "请输入服务地址"
+  },
+  "please_input_repeat_new_password": {
+    "key": "please_input_repeat_new_password",
+    "type": "text",
+    "value": "请重复新密码"
+  },
+  "please_input_repeat_password": {
+    "key": "please_input_repeat_password",
+    "type": "text",
+    "value": "请输入重复密码"
+  },
+  "please_input_rfid": {
+    "key": "please_input_rfid",
+    "type": "text",
+    "value": "请输入 RFID 标签"
+  },
+  "please_input_rfid_code": {
+    "key": "please_input_rfid_code",
+    "type": "text",
+    "value": "请输入 RFID 编号"
+  },
+  "please_input_rfid_tag": {
+    "key": "please_input_rfid_tag",
+    "type": "text",
+    "value": "请输入RFID标签"
+  },
+  "please_input_role_name": {
+    "key": "please_input_role_name",
+    "type": "text",
+    "value": "请输入角色名称"
+  },
+  "please_input_sop_name": {
+    "key": "please_input_sop_name",
+    "type": "text",
+    "value": "请输入SOP名称"
+  },
+  "please_input_step_description": {
+    "key": "please_input_step_description",
+    "type": "text",
+    "value": "请输入步骤操作说明"
+  },
+  "please_input_step_title": {
+    "key": "please_input_step_title",
+    "type": "text",
+    "value": "请填写步骤标题"
+  },
+  "please_input_step_title_short": {
+    "key": "please_input_step_title_short",
+    "type": "text",
+    "value": "请输入步骤标题缩写"
+  },
+  "please_input_username": {
+    "key": "please_input_username",
+    "type": "text",
+    "value": "请输入登录名"
+  },
+  "please_input_workstation_name": {
+    "key": "please_input_workstation_name",
+    "type": "text",
+    "value": "请输入区域名称"
+  },
+  "please_must_select_at_least_one_point": {
+    "key": "please_must_select_at_least_one_point",
+    "type": "text",
+    "value": "您至少需要添加一个点位"
+  },
+  "please_press_fingerprint_again": {
+    "key": "please_press_fingerprint_again",
+    "type": "text",
+    "value": "请再次按压指纹"
+  },
+  "please_re_press_fingerprint_again": {
+    "key": "please_re_press_fingerprint_again",
+    "type": "text",
+    "value": "请重新按压指纹"
+  },
+  "please_return_key_after_locking": {
+    "key": "please_return_key_after_locking",
+    "type": "text",
+    "value": "请上锁员完成上锁后,归还钥匙"
+  },
+  "please_return_key_after_unlocking": {
+    "key": "please_return_key_after_unlocking",
+    "type": "text",
+    "value": "请上锁员完成解锁后,归还钥匙"
+  },
+  "please_scan_face": {
+    "key": "please_scan_face",
+    "type": "text",
+    "value": "请刷脸"
+  },
+  "please_scan_fingerprint": {
+    "key": "please_scan_fingerprint",
+    "type": "text",
+    "value": "请刷指纹"
+  },
+  "please_select_area": {
+    "key": "please_select_area",
+    "type": "text",
+    "value": "请选择区域"
+  },
+  "please_select_card": {
+    "key": "please_select_card",
+    "type": "text",
+    "value": "请选择卡片"
+  },
+  "please_select_card_username": {
+    "key": "please_select_card_username",
+    "type": "text",
+    "value": "请选择用户名称"
+  },
+  "please_select_colocker": {
+    "key": "please_select_colocker",
+    "type": "text",
+    "value": "请选择共锁人"
+  },
+  "please_select_exception_description": {
+    "key": "please_select_exception_description",
+    "type": "text",
+    "value": "请选择异常描述"
+  },
+  "please_select_exception_source": {
+    "key": "please_select_exception_source",
+    "type": "text",
+    "value": "请选择异常源"
+  },
+  "please_select_exception_type": {
+    "key": "please_select_exception_type",
+    "type": "text",
+    "value": "请选择异常类型"
+  },
+  "please_select_flow_mode": {
+    "key": "please_select_flow_mode",
+    "type": "text",
+    "value": "请选择流程模式"
+  },
+  "please_select_group": {
+    "key": "please_select_group",
+    "type": "text",
+    "value": "请选择分组"
+  },
+  "please_select_handle_time": {
+    "key": "please_select_handle_time",
+    "type": "text",
+    "value": "请选择处理时间"
+  },
+  "please_select_job": {
+    "key": "please_select_job",
+    "type": "text",
+    "value": "请选择作业"
+  },
+  "please_select_job_workstation": {
+    "key": "please_select_job_workstation",
+    "type": "text",
+    "value": "请选择作业区域"
+  },
+  "please_select_key": {
+    "key": "please_select_key",
+    "type": "text",
+    "value": "请选择钥匙"
+  },
+  "please_select_lock": {
+    "key": "please_select_lock",
+    "type": "text",
+    "value": "请选择挂锁"
+  },
+  "please_select_locker": {
+    "key": "please_select_locker",
+    "type": "text",
+    "value": "请选择上锁人"
+  },
+  "please_select_member": {
+    "key": "please_select_member",
+    "type": "text",
+    "value": "您可以选择添加人员"
+  },
+  "please_select_point": {
+    "key": "please_select_point",
+    "type": "text",
+    "value": "请选择隔离点"
+  },
+  "please_select_power_type": {
+    "key": "please_select_power_type",
+    "type": "text",
+    "value": "请选择能量源"
+  },
+  "please_select_process_application": {
+    "key": "please_select_process_application",
+    "type": "text",
+    "value": "请选择处理申请"
+  },
+  "please_select_rfid_token": {
+    "key": "please_select_rfid_token",
+    "type": "text",
+    "value": "请选择RFID标签"
+  },
+  "please_select_role": {
+    "key": "please_select_role",
+    "type": "text",
+    "value": "请选择角色"
+  },
+  "please_select_sop": {
+    "key": "please_select_sop",
+    "type": "text",
+    "value": "请选择SOP"
+  },
+  "please_select_sop_workstation": {
+    "key": "please_select_sop_workstation",
+    "type": "text",
+    "value": "请选择SOP区域"
+  },
+  "please_select_start_time": {
+    "key": "please_select_start_time",
+    "type": "text",
+    "value": "请先选择开始时间"
+  },
+  "please_select_status": {
+    "key": "please_select_status",
+    "type": "text",
+    "value": "请选择状态"
+  },
+  "please_select_step_confirm_member": {
+    "key": "please_select_step_confirm_member",
+    "type": "text",
+    "value": "请选择执行确认人员"
+  },
+  "please_select_step_confirm_role": {
+    "key": "please_select_step_confirm_role",
+    "type": "text",
+    "value": "请选择执行确认角色"
+  },
+  "please_select_step_confirm_type": {
+    "key": "please_select_step_confirm_type",
+    "type": "text",
+    "value": "请选择执行确认方式"
+  },
+  "please_select_user": {
+    "key": "please_select_user",
+    "type": "text",
+    "value": "请选择用户"
+  },
+  "please_select_workflow_mode": {
+    "key": "please_select_workflow_mode",
+    "type": "text",
+    "value": "请选择流程模式"
+  },
+  "please_select_workstation": {
+    "key": "please_select_workstation",
+    "type": "text",
+    "value": "请选择区域"
+  },
+  "please_swipe_card": {
+    "key": "please_swipe_card",
+    "type": "text",
+    "value": "请刷卡"
+  },
+  "please_take_out_ready_device_first": {
+    "key": "please_take_out_ready_device_first",
+    "type": "text",
+    "value": "请先取出已开卡扣的设备"
+  },
+  "please_wait_ticket_name_lock_complete": {
+    "key": "please_wait_ticket_name_lock_complete",
+    "type": "text",
+    "value": "请等待[{0}]上锁完成"
+  },
+  "point_detail": {
+    "key": "point_detail",
+    "type": "text",
+    "value": "点位明细"
+  },
+  "point_in_use": {
+    "key": "point_in_use",
+    "type": "text",
+    "value": "点位正在使用无法修改"
+  },
+  "point_info_title": {
+    "key": "point_info_title",
+    "type": "text",
+    "value": "点位信息"
+  },
+  "point_list_title": {
+    "key": "point_list_title",
+    "type": "text",
+    "value": "点位清单"
+  },
+  "point_manage_add_title": {
+    "key": "point_manage_add_title",
+    "type": "text",
+    "value": "添加点位"
+  },
+  "point_manage_delete_failed": {
+    "key": "point_manage_delete_failed",
+    "type": "text",
+    "value": "无法删除隔离点"
+  },
+  "point_manage_delete_succeed": {
+    "key": "point_manage_delete_succeed",
+    "type": "text",
+    "value": "隔离点删除成功"
+  },
+  "point_manage_point_function": {
+    "key": "point_manage_point_function",
+    "type": "text",
+    "value": "隔离点作用"
+  },
+  "point_manage_point_group": {
+    "key": "point_manage_point_group",
+    "type": "text",
+    "value": "分组名称"
+  },
+  "point_manage_point_name": {
+    "key": "point_manage_point_name",
+    "type": "text",
+    "value": "隔离点名称"
+  },
+  "point_manage_point_power_type": {
+    "key": "point_manage_point_power_type",
+    "type": "text",
+    "value": "能量源"
+  },
+  "point_manage_rfid": {
+    "key": "point_manage_rfid",
+    "type": "text",
+    "value": "RFID"
+  },
+  "point_manage_rfid_tag": {
+    "key": "point_manage_rfid_tag",
+    "type": "text",
+    "value": "RFID 标签"
+  },
+  "point_manage_title": {
+    "key": "point_manage_title",
+    "type": "text",
+    "value": "点位管理"
+  },
+  "point_manage_update_title": {
+    "key": "point_manage_update_title",
+    "type": "text",
+    "value": "修改点位"
+  },
+  "point_manage_workstation": {
+    "key": "point_manage_workstation",
+    "type": "text",
+    "value": "区域"
+  },
+  "point_name_tv": {
+    "key": "point_name_tv",
+    "type": "text",
+    "value": "隔离点"
+  },
+  "power_isolation_way": {
+    "key": "power_isolation_way",
+    "type": "text",
+    "value": "确认隔离方式"
+  },
+  "preset_workflow_can_not_delete": {
+    "key": "preset_workflow_can_not_delete",
+    "type": "text",
+    "value": "预设流程模式无法删除"
+  },
+  "previous": {
+    "key": "previous",
+    "type": "text",
+    "value": "上一步"
+  },
+  "process_application_tv": {
+    "key": "process_application_tv",
+    "type": "text",
+    "value": "处理申请"
+  },
+  "quick_entrance_most_set_tip": {
+    "key": "quick_entrance_most_set_tip",
+    "type": "text",
+    "value": "快捷入口最多设置8个"
+  },
+  "quick_entrance_title": {
+    "key": "quick_entrance_title",
+    "type": "text",
+    "value": "快捷入口配置"
+  },
+  "re_recognize": {
+    "key": "re_recognize",
+    "type": "text",
+    "value": "重新识别"
+  },
+  "real_person_verification_required": {
+    "key": "real_person_verification_required",
+    "type": "text",
+    "value": "请保持真人操作"
+  },
+  "recapture": {
+    "key": "recapture",
+    "type": "text",
+    "value": "重拍"
+  },
+  "recognize_work_content": {
+    "key": "recognize_work_content",
+    "type": "text",
+    "value": "识别工作内容"
+  },
+  "recognized_card_rfid": {
+    "key": "recognized_card_rfid",
+    "type": "text",
+    "value": "已识别的卡片RFID"
+  },
+  "recognized_point_rfid": {
+    "key": "recognized_point_rfid",
+    "type": "text",
+    "value": "已识别的点位RFID"
+  },
+  "reduce_colocker": {
+    "key": "reduce_colocker",
+    "type": "text",
+    "value": "减少共锁人({0})"
+  },
+  "register_failed": {
+    "key": "register_failed",
+    "type": "text",
+    "value": "注册失败"
+  },
+  "register_success": {
+    "key": "register_success",
+    "type": "text",
+    "value": "注册成功"
+  },
+  "release_colocker": {
+    "key": "release_colocker",
+    "type": "text",
+    "value": "解除共锁"
+  },
+  "remark": {
+    "key": "remark",
+    "type": "text",
+    "value": "备注"
+  },
+  "repeat_new_password": {
+    "key": "repeat_new_password",
+    "type": "text",
+    "value": "重复新密码(数字、字母、特殊符号、6-20位)"
+  },
+  "repeat_password": {
+    "key": "repeat_password",
+    "type": "text",
+    "value": "重复密码:(数字、字母、特殊符号、6-20位)"
+  },
+  "reset": {
+    "key": "reset",
+    "type": "text",
+    "value": "重置"
+  },
+  "reset_data_tv": {
+    "key": "reset_data_tv",
+    "type": "text",
+    "value": "点击重设"
+  },
+  "reset_password_title": {
+    "key": "reset_password_title",
+    "type": "text",
+    "value": "重置密码"
+  },
+  "reset_user_password_failed": {
+    "key": "reset_user_password_failed",
+    "type": "text",
+    "value": "用户密码重置失败"
+  },
+  "reset_user_password_succeed": {
+    "key": "reset_user_password_succeed",
+    "type": "text",
+    "value": "用户密码重置成功"
+  },
+  "restart_app_after_set": {
+    "key": "restart_app_after_set",
+    "type": "text",
+    "value": "App将在设置完成后重启"
+  },
+  "rfid": {
+    "key": "rfid",
+    "type": "text",
+    "value": "RFID 标签"
+  },
+  "rfid_already_bind": {
+    "key": "rfid_already_bind",
+    "type": "text",
+    "value": "该Rfid标签已被绑定"
+  },
+  "rfid_already_registration": {
+    "key": "rfid_already_registration",
+    "type": "text",
+    "value": "RFID标签已录入"
+  },
+  "rfid_code": {
+    "key": "rfid_code",
+    "type": "text",
+    "value": "RFID 编号"
+  },
+  "rfid_in_use": {
+    "key": "rfid_in_use",
+    "type": "text",
+    "value": "RFID标签使用中,无法修改"
+  },
+  "rfid_name": {
+    "key": "rfid_name",
+    "type": "text",
+    "value": "RFID编号"
+  },
+  "rfid_token_manage_delete_failed": {
+    "key": "rfid_token_manage_delete_failed",
+    "type": "text",
+    "value": "RFID标签删除失败"
+  },
+  "rfid_token_manage_delete_succeed": {
+    "key": "rfid_token_manage_delete_succeed",
+    "type": "text",
+    "value": "RFID标签删除成功"
+  },
+  "rfid_token_manage_new_rfid_token_title": {
+    "key": "rfid_token_manage_new_rfid_token_title",
+    "type": "text",
+    "value": "新增 RFID 标签"
+  },
+  "rfid_token_manage_rfid_token_detail_title": {
+    "key": "rfid_token_manage_rfid_token_detail_title",
+    "type": "text",
+    "value": "RFID标签详情"
+  },
+  "rfid_token_manage_title": {
+    "key": "rfid_token_manage_title",
+    "type": "text",
+    "value": "RFID管理"
+  },
+  "role_in_preset_tip": {
+    "key": "role_in_preset_tip",
+    "type": "text",
+    "value": "预设角色不允许删除"
+  },
+  "role_in_use": {
+    "key": "role_in_use",
+    "type": "text",
+    "value": "角色已有作业在使用"
+  },
+  "role_key_already_exists": {
+    "key": "role_key_already_exists",
+    "type": "text",
+    "value": "该角色权限字符已存在"
+  },
+  "role_manage_add_title": {
+    "key": "role_manage_add_title",
+    "type": "text",
+    "value": "添加角色"
+  },
+  "role_manage_delete_failed": {
+    "key": "role_manage_delete_failed",
+    "type": "text",
+    "value": "无法删除角色"
+  },
+  "role_manage_delete_succeed": {
+    "key": "role_manage_delete_succeed",
+    "type": "text",
+    "value": "角色已删除"
+  },
+  "role_manage_permission_string": {
+    "key": "role_manage_permission_string",
+    "type": "text",
+    "value": "权限字符"
+  },
+  "role_manage_role_name": {
+    "key": "role_manage_role_name",
+    "type": "text",
+    "value": "角色名称"
+  },
+  "role_manage_role_num": {
+    "key": "role_manage_role_num",
+    "type": "text",
+    "value": "角色编号"
+  },
+  "role_manage_title": {
+    "key": "role_manage_title",
+    "type": "text",
+    "value": "角色管理"
+  },
+  "save": {
+    "key": "save",
+    "type": "text",
+    "value": "保存"
+  },
+  "save_and_execute": {
+    "key": "save_and_execute",
+    "type": "text",
+    "value": "保存并执行"
+  },
+  "save_sop_check": {
+    "key": "save_sop_check",
+    "type": "text",
+    "value": "生成SOP"
+  },
+  "save_success": {
+    "key": "save_success",
+    "type": "text",
+    "value": "保存成功!"
+  },
+  "scan_complete_app_restarting": {
+    "key": "scan_complete_app_restarting",
+    "type": "text",
+    "value": "扫描完成,APP将自动重启"
+  },
+  "select": {
+    "key": "select",
+    "type": "text",
+    "value": "选择"
+  },
+  "select_colocker_tip": {
+    "key": "select_colocker_tip",
+    "type": "text",
+    "value": "请在以下人员中选择共锁人"
+  },
+  "select_coloker": {
+    "key": "select_coloker",
+    "type": "text",
+    "value": "请选择共锁人"
+  },
+  "select_group_tip": {
+    "key": "select_group_tip",
+    "type": "text",
+    "value": "点击分组空白区域进行选中"
+  },
+  "select_locker": {
+    "key": "select_locker",
+    "type": "text",
+    "value": "选择上锁人"
+  },
+  "select_locker_tip": {
+    "key": "select_locker_tip",
+    "type": "text",
+    "value": "请在以下人员中选择[{0}]上锁人"
+  },
+  "select_member_title": {
+    "key": "select_member_title",
+    "type": "text",
+    "value": "选择人员"
+  },
+  "select_point_title": {
+    "key": "select_point_title",
+    "type": "text",
+    "value": "选择点位"
+  },
+  "selected_point_already_in_use": {
+    "key": "selected_point_already_in_use",
+    "type": "text",
+    "value": "存在使用中的点位"
+  },
+  "selected_point_info_title": {
+    "key": "selected_point_info_title",
+    "type": "text",
+    "value": "已选择的点位信息"
+  },
+  "selected_quick_entrance": {
+    "key": "selected_quick_entrance",
+    "type": "text",
+    "value": "已配置的快捷入口(最多添加8个快捷入口,可拖拽排序)"
+  },
+  "selected_rfid_in_use": {
+    "key": "selected_rfid_in_use",
+    "type": "text",
+    "value": "存在正在使用的RFID标签"
+  },
+  "send_ticket_fail": {
+    "key": "send_ticket_fail",
+    "type": "text",
+    "value": "作业票下发失败"
+  },
+  "sending_ticket": {
+    "key": "sending_ticket",
+    "type": "text",
+    "value": "工作票下发中······"
+  },
+  "server_address": {
+    "key": "server_address",
+    "type": "text",
+    "value": "服务地址"
+  },
+  "server_address_error": {
+    "key": "server_address_error",
+    "type": "text",
+    "value": "服务器地址错误"
+  },
+  "set_colocker": {
+    "key": "set_colocker",
+    "type": "text",
+    "value": "设置共锁人"
+  },
+  "set_data_tv": {
+    "key": "set_data_tv",
+    "type": "text",
+    "value": "点击设置"
+  },
+  "set_face_title": {
+    "key": "set_face_title",
+    "type": "text",
+    "value": "设置人脸"
+  },
+  "set_fingerprint_title": {
+    "key": "set_fingerprint_title",
+    "type": "text",
+    "value": "设置指纹"
+  },
+  "set_job_card_title": {
+    "key": "set_job_card_title",
+    "type": "text",
+    "value": "设置工卡"
+  },
+  "set_locker": {
+    "key": "set_locker",
+    "type": "text",
+    "value": "设置上锁人"
+  },
+  "set_password": {
+    "key": "set_password",
+    "type": "text",
+    "value": "设置密码:(数字、字母、特殊符号、6-20位)"
+  },
+  "settings": {
+    "key": "settings",
+    "type": "text",
+    "value": "设置"
+  },
+  "show_member_when_selected_sop": {
+    "key": "show_member_when_selected_sop",
+    "type": "text",
+    "value": "选择SOP后,将自动展示SOP的人员信息。"
+  },
+  "show_points_when_selected_sop": {
+    "key": "show_points_when_selected_sop",
+    "type": "text",
+    "value": "选择SOP后,将自动展示SOP的点位信息。"
+  },
+  "shutdown": {
+    "key": "shutdown",
+    "type": "text",
+    "value": "操作停机"
+  },
+  "ski_step": {
+    "key": "ski_step",
+    "type": "text",
+    "value": "跳过该步骤"
+  },
+  "skip_and_complete": {
+    "key": "skip_and_complete",
+    "type": "text",
+    "value": "跳过并完成"
+  },
+  "slot_exception_tag": {
+    "key": "slot_exception_tag",
+    "type": "text",
+    "value": "该锁仓已被标记异常"
+  },
+  "slots_exception_report": {
+    "key": "slots_exception_report",
+    "type": "text",
+    "value": "仓位异常上报"
+  },
+  "slots_manage_title": {
+    "key": "slots_manage_title",
+    "type": "text",
+    "value": "仓位管理"
+  },
+  "sop_create_failed": {
+    "key": "sop_create_failed",
+    "type": "text",
+    "value": "SOP创建失败"
+  },
+  "sop_create_succeed": {
+    "key": "sop_create_succeed",
+    "type": "text",
+    "value": "SOP创建成功"
+  },
+  "sop_job_save_and_execute_failed": {
+    "key": "sop_job_save_and_execute_failed",
+    "type": "text",
+    "value": "SOP作业执行失败"
+  },
+  "sop_job_save_and_execute_succeed": {
+    "key": "sop_job_save_and_execute_succeed",
+    "type": "text",
+    "value": "SOP作业开始执行"
+  },
+  "sop_job_save_failed": {
+    "key": "sop_job_save_failed",
+    "type": "text",
+    "value": "SOP作业保存失败"
+  },
+  "sop_job_save_succeed": {
+    "key": "sop_job_save_succeed",
+    "type": "text",
+    "value": "SOP作业保存成功"
+  },
+  "sop_manage_delete_failed": {
+    "key": "sop_manage_delete_failed",
+    "type": "text",
+    "value": "无法删除选中的SOP"
+  },
+  "sop_manage_delete_succeed": {
+    "key": "sop_manage_delete_succeed",
+    "type": "text",
+    "value": "删除选中的SOP成功"
+  },
+  "sop_manage_sop_name": {
+    "key": "sop_manage_sop_name",
+    "type": "text",
+    "value": "SOP名称"
+  },
+  "sop_manage_title": {
+    "key": "sop_manage_title",
+    "type": "text",
+    "value": "SOP管理"
+  },
+  "sop_manage_workstation": {
+    "key": "sop_manage_workstation",
+    "type": "text",
+    "value": "所属岗位"
+  },
+  "sop_save_failed": {
+    "key": "sop_save_failed",
+    "type": "text",
+    "value": "SOP保存失败"
+  },
+  "sop_save_succeed": {
+    "key": "sop_save_succeed",
+    "type": "text",
+    "value": "SOP保存成功"
+  },
+  "sop_save_tip": {
+    "key": "sop_save_tip",
+    "type": "text",
+    "value": "确定要保存{0}吗?"
+  },
+  "sop_workstation": {
+    "key": "sop_workstation",
+    "type": "text",
+    "value": "SOP区域"
+  },
+  "start": {
+    "key": "start",
+    "type": "text",
+    "value": "开始"
+  },
+  "start_detect_key_slot": {
+    "key": "start_detect_key_slot",
+    "type": "text",
+    "value": "开始检测钥匙仓位"
+  },
+  "start_detect_lock_slot": {
+    "key": "start_detect_lock_slot",
+    "type": "text",
+    "value": "开始检测挂锁仓位"
+  },
+  "start_scan_key_mac": {
+    "key": "start_scan_key_mac",
+    "type": "text",
+    "value": "开始扫描钥匙信息"
+  },
+  "start_time": {
+    "key": "start_time",
+    "type": "text",
+    "value": "开始时间"
+  },
+  "end_time_must_large_then_start_time": {
+    "key": "end_time_must_large_then_start_time",
+    "type": "text",
+    "value": "结束时间必须大于开始时间"
+  },
+  "start_tip": {
+    "key": "start_tip",
+    "type": "text",
+    "value": "根据提示对系统进行初始化"
+  },
+  "start_to_send_ticket": {
+    "key": "start_to_send_ticket",
+    "type": "text",
+    "value": "开始下发工作票······"
+  },
+  "status": {
+    "key": "status",
+    "type": "text",
+    "value": "状态"
+  },
+  "step_confirm_failed": {
+    "key": "step_confirm_failed",
+    "type": "text",
+    "value": "步骤确认失败"
+  },
+  "take_out_key": {
+    "key": "take_out_key",
+    "type": "text",
+    "value": "请取出钥匙"
+  },
+  "take_out_key_tip": {
+    "key": "take_out_key_tip",
+    "type": "text",
+    "value": "请从打开的钥匙仓取出钥匙"
+  },
+  "take_out_lock_tip": {
+    "key": "take_out_lock_tip",
+    "type": "text",
+    "value": "请从打开的锁仓取出锁,还有{0}把待取出"
+  },
+  "take_out_rest_locks": {
+    "key": "take_out_rest_locks",
+    "type": "text",
+    "value": "请取出剩余开启卡扣的挂锁"
+  },
+  "tec_support": {
+    "key": "tec_support",
+    "type": "text",
+    "value": "温州博士安全用品有限公司"
+  },
+  "the_verification_file_not_exists": {
+    "key": "the_verification_file_not_exists",
+    "type": "text",
+    "value": "校验文件不存在"
+  },
+  "ticket_data_error": {
+    "key": "ticket_data_error",
+    "type": "text",
+    "value": "工作票数据损坏"
+  },
+  "ticket_get_failed": {
+    "key": "ticket_get_failed",
+    "type": "text",
+    "value": "作业票获取失败"
+  },
+  "ticket_lost": {
+    "key": "ticket_lost",
+    "type": "text",
+    "value": "作业票不存在"
+  },
+  "time_frame_tv": {
+    "key": "time_frame_tv",
+    "type": "text",
+    "value": "时间范围"
+  },
+  "todo_header": {
+    "key": "todo_header",
+    "type": "text",
+    "value": "处理中"
+  },
+  "turn_off": {
+    "key": "turn_off",
+    "type": "text",
+    "value": "关"
+  },
+  "turn_on": {
+    "key": "turn_on",
+    "type": "text",
+    "value": "开"
+  },
+  "turn_read": {
+    "key": "turn_read",
+    "type": "text",
+    "value": "读"
+  },
+  "uncolock_complete": {
+    "key": "uncolock_complete",
+    "type": "text",
+    "value": "解除共锁成功"
+  },
+  "uncolock_failed": {
+    "key": "uncolock_failed",
+    "type": "text",
+    "value": "解除共锁失败"
+  },
+  "unlock": {
+    "key": "unlock",
+    "type": "text",
+    "value": "解锁"
+  },
+  "unlock_and_restore_switch": {
+    "key": "unlock_and_restore_switch",
+    "type": "text",
+    "value": "拆锁恢复开关"
+  },
+  "unzip": {
+    "key": "unzip",
+    "type": "text",
+    "value": "解压中……{0}"
+  },
+  "update_card_failed": {
+    "key": "update_card_failed",
+    "type": "text",
+    "value": "更新卡片失败"
+  },
+  "update_card_succeed": {
+    "key": "update_card_succeed",
+    "type": "text",
+    "value": "更新卡片成功"
+  },
+  "update_key_failed": {
+    "key": "update_key_failed",
+    "type": "text",
+    "value": "更新钥匙失败"
+  },
+  "update_key_succeed": {
+    "key": "update_key_succeed",
+    "type": "text",
+    "value": "更新钥匙成功"
+  },
+  "update_lock_failed": {
+    "key": "update_lock_failed",
+    "type": "text",
+    "value": "更新挂锁失败"
+  },
+  "update_lock_succeed": {
+    "key": "update_lock_succeed",
+    "type": "text",
+    "value": "更新挂锁成功"
+  },
+  "update_point_failed": {
+    "key": "update_point_failed",
+    "type": "text",
+    "value": "保存点位失败"
+  },
+  "update_point_succeed": {
+    "key": "update_point_succeed",
+    "type": "text",
+    "value": "保存点位成功"
+  },
+  "update_rfid_token_failed": {
+    "key": "update_rfid_token_failed",
+    "type": "text",
+    "value": "更新RFID标签失败"
+  },
+  "update_rfid_token_succeed": {
+    "key": "update_rfid_token_succeed",
+    "type": "text",
+    "value": "更新RFID标签成功"
+  },
+  "update_role_failed": {
+    "key": "update_role_failed",
+    "type": "text",
+    "value": "角色更新失败"
+  },
+  "update_role_succeed": {
+    "key": "update_role_succeed",
+    "type": "text",
+    "value": "角色更新成功"
+  },
+  "update_user_failed": {
+    "key": "update_user_failed",
+    "type": "text",
+    "value": "用户更新失败"
+  },
+  "update_user_succeed": {
+    "key": "update_user_succeed",
+    "type": "text",
+    "value": "用户更新成功"
+  },
+  "update_workstation_failed": {
+    "key": "update_workstation_failed",
+    "type": "text",
+    "value": "更新区域失败"
+  },
+  "update_workstation_succeed": {
+    "key": "update_workstation_succeed",
+    "type": "text",
+    "value": "更新区域成功"
+  },
+  "user_already_exists": {
+    "key": "user_already_exists",
+    "type": "text",
+    "value": "用户已存在"
+  },
+  "user_info_title": {
+    "key": "user_info_title",
+    "type": "text",
+    "value": "个人信息"
+  },
+  "user_manage_area": {
+    "key": "user_manage_area",
+    "type": "text",
+    "value": "区域"
+  },
+  "user_manage_card_code": {
+    "key": "user_manage_card_code",
+    "type": "text",
+    "value": "工卡"
+  },
+  "user_manage_delete_failed": {
+    "key": "user_manage_delete_failed",
+    "type": "text",
+    "value": "无法删除用户"
+  },
+  "user_manage_delete_succeed": {
+    "key": "user_manage_delete_succeed",
+    "type": "text",
+    "value": "用户已删除"
+  },
+  "user_manage_filter_activate": {
+    "key": "user_manage_filter_activate",
+    "type": "text",
+    "value": "正常"
+  },
+  "user_manage_filter_deactivate": {
+    "key": "user_manage_filter_deactivate",
+    "type": "text",
+    "value": "停用"
+  },
+  "user_manage_filter_title": {
+    "key": "user_manage_filter_title",
+    "type": "text",
+    "value": "筛选条件"
+  },
+  "user_manage_new_user_title": {
+    "key": "user_manage_new_user_title",
+    "type": "text",
+    "value": "新增用户"
+  },
+  "user_manage_role": {
+    "key": "user_manage_role",
+    "type": "text",
+    "value": "角色"
+  },
+  "user_manage_title": {
+    "key": "user_manage_title",
+    "type": "text",
+    "value": "用户管理"
+  },
+  "user_manage_user_detail_title": {
+    "key": "user_manage_user_detail_title",
+    "type": "text",
+    "value": "用户详情"
+  },
+  "user_manage_view": {
+    "key": "user_manage_view",
+    "type": "text",
+    "value": "查看"
+  },
+  "user_name": {
+    "key": "user_name",
+    "type": "text",
+    "value": "登录名"
+  },
+  "username": {
+    "key": "username",
+    "type": "text",
+    "value": "用户名称"
+  },
+  "username_or_password_error": {
+    "key": "username_or_password_error",
+    "type": "text",
+    "value": "账号或密码错误"
+  },
+  "username_passowrd_login_success": {
+    "key": "username_passowrd_login_success",
+    "type": "text",
+    "value": "账号密码验证通过"
+  },
+  "username_password_not_exists": {
+    "key": "username_password_not_exists",
+    "type": "text",
+    "value": "账号密码不存在"
+  },
+  "username_regex_tip": {
+    "key": "username_regex_tip",
+    "type": "text",
+    "value": "账号不符合要求"
+  },
+  "verify_failed": {
+    "key": "verify_failed",
+    "type": "text",
+    "value": "验证失败"
+  },
+  "view": {
+    "key": "view",
+    "type": "text",
+    "value": "查看"
+  },
+  "wait_header": {
+    "key": "wait_header",
+    "type": "text",
+    "value": "等待中"
+  },
+  "wait_to_colock": {
+    "key": "wait_to_colock",
+    "type": "text",
+    "value": "待共锁({0})"
+  },
+  "warn": {
+    "key": "warn",
+    "type": "text",
+    "value": "警告"
+  },
+  "welcome_tip": {
+    "key": "welcome_tip",
+    "type": "text",
+    "value": "您好,欢迎您使用"
+  },
+  "workflow_already_exists": {
+    "key": "workflow_already_exists",
+    "type": "text",
+    "value": "流程模式已存在"
+  },
+  "workflow_manage_title": {
+    "key": "workflow_manage_title",
+    "type": "text",
+    "value": "流程模式管理"
+  },
+  "workflow_mode": {
+    "key": "workflow_mode",
+    "type": "text",
+    "value": "流程模式"
+  },
+  "workflow_mode_manage_delete_succeed": {
+    "key": "workflow_mode_manage_delete_succeed",
+    "type": "text",
+    "value": "删除流程模式成功"
+  },
+  "workflow_mode_status_update_failed": {
+    "key": "workflow_mode_status_update_failed",
+    "type": "text",
+    "value": "状态修改失败"
+  },
+  "workflow_mode_status_update_succeed": {
+    "key": "workflow_mode_status_update_succeed",
+    "type": "text",
+    "value": "状态修改成功"
+  },
+  "workflow_name": {
+    "key": "workflow_name",
+    "type": "text",
+    "value": "流程模式名称"
+  },
+  "workflow_setting": {
+    "key": "workflow_setting",
+    "type": "text",
+    "value": "流程设置"
+  },
+  "workflow_step_confirm_member": {
+    "key": "workflow_step_confirm_member",
+    "type": "text",
+    "value": "执行确认人员"
+  },
+  "workflow_step_confirm_role": {
+    "key": "workflow_step_confirm_role",
+    "type": "text",
+    "value": "执行确认角色"
+  },
+  "workflow_step_confirm_type": {
+    "key": "workflow_step_confirm_type",
+    "type": "text",
+    "value": "执行确认方式"
+  },
+  "workflow_step_description": {
+    "key": "workflow_step_description",
+    "type": "text",
+    "value": "步骤操作说明"
+  },
+  "workflow_step_function": {
+    "key": "workflow_step_function",
+    "type": "text",
+    "value": "步骤功能"
+  },
+  "workflow_step_title": {
+    "key": "workflow_step_title",
+    "type": "text",
+    "value": "步骤标题"
+  },
+  "workflow_step_title_short": {
+    "key": "workflow_step_title_short",
+    "type": "text",
+    "value": "步骤标题缩写"
+  },
+  "workstation_already_exists": {
+    "key": "workstation_already_exists",
+    "type": "text",
+    "value": "区域已存在"
+  },
+  "workstation_is_in_bottom": {
+    "key": "workstation_is_in_bottom",
+    "type": "text",
+    "value": "区域已经在底部"
+  },
+  "workstation_is_in_top": {
+    "key": "workstation_is_in_top",
+    "type": "text",
+    "value": "区域已经在顶部"
+  },
+  "workstation_manage_delete_failed": {
+    "key": "workstation_manage_delete_failed",
+    "type": "text",
+    "value": "无法删除区域{0}"
+  },
+  "workstation_manage_delete_succeed": {
+    "key": "workstation_manage_delete_succeed",
+    "type": "text",
+    "value": "删除区域{0}成功"
+  },
+  "workstation_manage_new_workstation": {
+    "key": "workstation_manage_new_workstation",
+    "type": "text",
+    "value": "新增区域"
+  },
+  "workstation_manage_title": {
+    "key": "workstation_manage_title",
+    "type": "text",
+    "value": "区域管理"
+  },
+  "workstation_manage_workstation_name": {
+    "key": "workstation_manage_workstation_name",
+    "type": "text",
+    "value": "区域名称"
+  },
+  "you_are_not_locker_tip": {
+    "key": "you_are_not_locker_tip",
+    "type": "text",
+    "value": "您不是上锁人,无法执行此操作"
+  },
+  "zone": {
+    "key": "zone",
+    "type": "text",
+    "value": "区域范围"
+  },
+  "backup_title": {
+    "key": "backup_title",
+    "type": "text",
+    "value": "备份/还原"
+  },
+  "backup": {
+    "key": "backup",
+    "type": "text",
+    "value": "备份"
+  },
+  "backup_path": {
+    "key": "backup_path",
+    "type": "text",
+    "value": "备份路径"
+  },
+  "maximum_number_of_backups": {
+    "key": "maximum_number_of_backups",
+    "type": "text",
+    "value": "备份数量上限"
+  },
+  "auto_backup": {
+    "key": "auto_backup",
+    "type": "text",
+    "value": "自动备份"
+  },
+  "common_enable": {
+    "key": "common_enable",
+    "type": "text",
+    "value": "启用"
+  },
+  "common_disable": {
+    "key": "common_disable",
+    "type": "text",
+    "value": "停用"
+  },
+  "backup_frequency": {
+    "key": "backup_frequency",
+    "type": "text",
+    "value": "备份频率"
+  },
+  "backup_time": {
+    "key": "backup_time",
+    "type": "text",
+    "value": "备份时间"
+  },
+  "backup_tip": {
+    "key": "backup_tip",
+    "type": "text",
+    "value": "注意:自动备份时必须保证应用处于启动状态。"
+  },
+  "backup_now": {
+    "key": "backup_now",
+    "type": "text",
+    "value": "立即备份"
+  },
+  "backup_range": {
+    "key": "backup_range",
+    "type": "text",
+    "value": "范围:{0}"
+  },
+  "restore": {
+    "key": "restore",
+    "type": "text",
+    "value": "还原"
+  },
+  "common_batch_export": {
+    "key": "common_batch_export",
+    "type": "text",
+    "value": "批量导出"
+  },
+  "common_batch_delete": {
+    "key": "common_batch_delete",
+    "type": "text",
+    "value": "批量删除"
+  },
+  "common_export": {
+    "key": "common_export",
+    "type": "text",
+    "value": "导出"
+  },
+  "MON": {
+    "key": "MON",
+    "type": "text",
+    "value": "星期一"
+  },
+  "TUE": {
+    "key": "TUE",
+    "type": "text",
+    "value": "星期二"
+  },
+  "WED": {
+    "key": "WED",
+    "type": "text",
+    "value": "星期三"
+  },
+  "THU": {
+    "key": "THU",
+    "type": "text",
+    "value": "星期四"
+  },
+  "FRI": {
+    "key": "FRI",
+    "type": "text",
+    "value": "星期五"
+  },
+  "SAT": {
+    "key": "SAT",
+    "type": "text",
+    "value": "星期六"
+  },
+  "SUN": {
+    "key": "SUN",
+    "type": "text",
+    "value": "星期日"
+  },
+  "backup_frequency_every_day": {
+    "key": "backup_frequency_every_day",
+    "type": "text",
+    "value": "每天"
+  },
+  "please_select_backup_frequency": {
+    "key": "please_select_backup_frequency",
+    "type": "text",
+    "value": "请选择备份频率"
+  },
+  "maximumNumberOfBackupsNotCorrect": {
+    "key": "maximumNumberOfBackupsNotCorrect",
+    "type": "text",
+    "value": "请填写正确的备份数量上限"
+  },
+  "please_select_time": {
+    "key": "please_select_time",
+    "type": "text",
+    "value": "请选择时间"
+  },
+  "backup_now_please_wait": {
+    "key": "backup_now_please_wait",
+    "type": "text",
+    "value": "正在备份中,请稍等……"
+  },
+  "backup_success": {
+    "key": "backup_success",
+    "type": "text",
+    "value": "备份成功"
+  },
+  "backup_failed": {
+    "key": "backup_failed",
+    "type": "text",
+    "value": "备份失败"
+  },
+  "delete_backup_file_confirm": {
+    "key": "delete_backup_file_confirm",
+    "type": "text",
+    "value": "是否确认删除该备份,删除后备份无法恢复。"
+  },
+  "delete_selected_backup_file_confirm": {
+    "key": "delete_selected_backup_file_confirm",
+    "type": "text",
+    "value": "是否确认删除选中备份,删除后备份无法恢复。"
+  },
+  "restore_backup_confirm": {
+    "key": "restore_backup_confirm",
+    "type": "text",
+    "value": "还原备份将清除备份日期到当前时间的所有数据,是否确认还原备份?"
+  },
+  "restore_backup_success": {
+    "key": "restore_backup_success",
+    "type": "text",
+    "value": "备份还原成功"
+  },
+  "export_success": {
+    "key": "export_success",
+    "type": "text",
+    "value": "导出成功"
+  },
+  "no_backup_data": {
+    "key": "no_backup_data",
+    "type": "text",
+    "value": "暂无备份数据"
+  },
+  "loading_backup": {
+    "key": "loading_backup",
+    "type": "text",
+    "value": "正在读取备份文件"
+  },
+  "max_backup_tip": {
+    "key": "max_backup_tip",
+    "type": "text",
+    "value": "备份数量已经达到上限,继续备份将移除最老的数据。"
+  },
+  "switch": {
+    "key": "switch",
+    "type": "text",
+    "value": "切换"
+  },
+  "backup_restoring": {
+    "key": "backup_restoring",
+    "type": "text",
+    "value": "备份还原中……"
+  },
+  "point_manage_switch_icon": {
+    "key": "point_manage_switch_icon",
+    "type": "text",
+    "value": "开关图标"
+  },
+  "user_manage": {
+    "key": "user_manage",
+    "type": "text",
+    "value": "用户管理"
+  },
+  "role_manage": {
+    "key": "role_manage",
+    "type": "text",
+    "value": "角色管理"
+  },
+  "workstation_manage": {
+    "key": "workstation_manage",
+    "type": "text",
+    "value": "区域管理"
+  },
+  "point_manage": {
+    "key": "point_manage",
+    "type": "text",
+    "value": "点位管理"
+  },
+  "backup_and_restore": {
+    "key": "backup_and_restore",
+    "type": "text",
+    "value": "备份/还原"
+  },
+  "in_progress_job": {
+    "key": "in_progress_job",
+    "type": "text",
+    "value": "进行中的作业"
+  },
+  "create_sop": {
+    "key": "create_sop",
+    "type": "text",
+    "value": "新建SOP"
+  },
+  "sop_manage": {
+    "key": "sop_manage",
+    "type": "text",
+    "value": "SOP管理"
+  },
+  "create_job": {
+    "key": "create_job",
+    "type": "text",
+    "value": "新建作业"
+  },
+  "job_manage": {
+    "key": "job_manage",
+    "type": "text",
+    "value": "作业管理"
+  },
+  "workflow_manage": {
+    "key": "workflow_manage",
+    "type": "text",
+    "value": "流程模式管理"
+  },
+  "create_sop_job": {
+    "key": "create_sop_job",
+    "type": "text",
+    "value": "新建SOP作业"
+  },
+  "locked_point": {
+    "key": "locked_point",
+    "type": "text",
+    "value": "锁定中的点位"
+  },
+  "slot_manage": {
+    "key": "slot_manage",
+    "type": "text",
+    "value": "仓位管理"
+  },
+  "key_manage": {
+    "key": "key_manage",
+    "type": "text",
+    "value": "钥匙管理"
+  },
+  "lock_manage": {
+    "key": "lock_manage",
+    "type": "text",
+    "value": "挂锁管理"
+  },
+  "card_manage": {
+    "key": "card_manage",
+    "type": "text",
+    "value": "卡片管理"
+  },
+  "rfid_manage": {
+    "key": "rfid_manage",
+    "type": "text",
+    "value": "RFID管理"
+  },
+  "exception_manage": {
+    "key": "exception_manage",
+    "type": "text",
+    "value": "异常管理"
+  },
+  "user_info": {
+    "key": "user_info",
+    "type": "text",
+    "value": "个人信息"
+  },
+  "reset_password": {
+    "key": "reset_password",
+    "type": "text",
+    "value": "重置密码"
+  },
+  "fingerprint_setting": {
+    "key": "fingerprint_setting",
+    "type": "text",
+    "value": "设置指纹"
+  },
+  "face_setting": {
+    "key": "face_setting",
+    "type": "text",
+    "value": "设置人脸"
+  },
+  "card_setting": {
+    "key": "card_setting",
+    "type": "text",
+    "value": "设置工卡"
+  },
+  "logout": {
+    "key": "logout",
+    "type": "text",
+    "value": "退出登录"
+  },
+  "todo_list": {
+    "key": "todo_list",
+    "type": "text",
+    "value": "我的待办"
+  },
+  "hardware_manage": {
+    "key": "hardware_manage",
+    "type": "text",
+    "value": "硬件管理"
+  },
+  "job_ticket_manage": {
+    "key": "job_ticket_manage",
+    "type": "text",
+    "value": "作业管理"
+  },
+  "data_manage": {
+    "key": "data_manage",
+    "type": "text",
+    "value": "数据管理"
+  },
+  "home": {
+    "key": "home",
+    "type": "text",
+    "value": "主页"
+  },
+  "auto_confirm": {
+    "key": "auto_confirm",
+    "type": "text",
+    "value": "自动确认"
+  },
+  "click_confirm": {
+    "key": "click_confirm",
+    "type": "text",
+    "value": "点击确认"
+  },
+  "role_confirm": {
+    "key": "role_confirm",
+    "type": "text",
+    "value": "角色确认"
+  },
+  "admin": {
+    "key": "admin",
+    "type": "text",
+    "value": "超级管理员"
+  },
+  "jtdrawer": {
+    "key": "jtdrawer",
+    "type": "text",
+    "value": "作业管理员"
+  },
+  "jtlocker": {
+    "key": "jtlocker",
+    "type": "text",
+    "value": "作业负责人"
+  },
+  "jtcolocker": {
+    "key": "jtcolocker",
+    "type": "text",
+    "value": "作业参与人"
+  },
+  "jtguard": {
+    "key": "jtguard",
+    "type": "text",
+    "value": "作业观察员"
+  },
+  "sysconfig": {
+    "key": "sysconfig",
+    "type": "text",
+    "value": "系统配置员"
+  },
+  "force_shared_lock": {
+    "key": "force_shared_lock",
+    "type": "text",
+    "value": "强制共享锁模式"
+  },
+  "force_multi_lock": {
+    "key": "force_multi_lock",
+    "type": "text",
+    "value": "强制多锁模式"
+  },
+  "mixed_mode": {
+    "key": "mixed_mode",
+    "type": "text",
+    "value": "混合模式"
+  },
+  "lock_take_key": {
+    "key": "lock_take_key",
+    "type": "text",
+    "value": "启动上锁"
+  },
+  "lock_return_key": {
+    "key": "lock_return_key",
+    "type": "text",
+    "value": "完成上锁"
+  },
+  "unlock_take_key": {
+    "key": "unlock_take_key",
+    "type": "text",
+    "value": "启动解锁"
+  },
+  "unlock_return_key": {
+    "key": "unlock_return_key",
+    "type": "text",
+    "value": "完成解锁"
+  },
+  "release_colock": {
+    "key": "release_colock",
+    "type": "text",
+    "value": "解除共锁"
+  },
+  "unknown": {
+    "key": "unknown",
+    "type": "text",
+    "value": "未知待办"
+  },
+  "not_start": {
+    "key": "not_start",
+    "type": "text",
+    "value": "未开始"
+  },
+  "select_member": {
+    "key": "select_member",
+    "type": "text",
+    "value": "选择人员"
+  },
+  "locking": {
+    "key": "locking",
+    "type": "text",
+    "value": "上锁中"
+  },
+  "colocking": {
+    "key": "colocking",
+    "type": "text",
+    "value": "共锁中"
+  },
+  "unlocking": {
+    "key": "unlocking",
+    "type": "text",
+    "value": "解锁中"
+  },
+  "finished": {
+    "key": "finished",
+    "type": "text",
+    "value": "已结束"
+  },
+  "canceled": {
+    "key": "canceled",
+    "type": "text",
+    "value": "已取消"
+  },
+  "progressing": {
+    "key": "progressing",
+    "type": "text",
+    "value": "进行中"
+  },
+  "hydraulic_pressure": {
+    "key": "hydraulic_pressure",
+    "type": "text",
+    "value": "液压"
+  },
+  "electric_energy": {
+    "key": "electric_energy",
+    "type": "text",
+    "value": "电能"
+  },
+  "potential_energy": {
+    "key": "potential_energy",
+    "type": "text",
+    "value": "势能"
+  },
+  "heat_energy": {
+    "key": "heat_energy",
+    "type": "text",
+    "value": "热能"
+  },
+  "gas": {
+    "key": "gas",
+    "type": "text",
+    "value": "燃气"
+  },
+  "mechanical_energy": {
+    "key": "mechanical_energy",
+    "type": "text",
+    "value": "机械能"
+  },
+  "air_energy": {
+    "key": "air_energy",
+    "type": "text",
+    "value": "空气能"
+  },
+  "apply_master_key": {
+    "key": "apply_master_key",
+    "type": "text",
+    "value": "申请万能钥匙"
+  },
+  "apply_finish_job": {
+    "key": "apply_finish_job",
+    "type": "text",
+    "value": "申请结束作业"
+  },
+  "apply_scrap_slot": {
+    "key": "apply_scrap_slot",
+    "type": "text",
+    "value": "申请报废仓位"
+  },
+  "apply_scrap_lock": {
+    "key": "apply_scrap_lock",
+    "type": "text",
+    "value": "申请报废挂锁"
+  },
+  "apply_scrap_key": {
+    "key": "apply_scrap_key",
+    "type": "text",
+    "value": "申请报废钥匙"
+  },
+  "slot_damage": {
+    "key": "slot_damage",
+    "type": "text",
+    "value": "仓位损坏"
+  },
+  "lock_damage": {
+    "key": "lock_damage",
+    "type": "text",
+    "value": "挂锁损坏"
+  },
+  "key_damage": {
+    "key": "key_damage",
+    "type": "text",
+    "value": "钥匙损坏"
+  },
+  "job_cat_not_exec": {
+    "key": "job_cat_not_exec",
+    "type": "text",
+    "value": "作业票无法执行"
+  },
+  "pending": {
+    "key": "pending",
+    "type": "text",
+    "value": "待处理"
+  },
+  "processed": {
+    "key": "processed",
+    "type": "text",
+    "value": "已处理"
+  },
+  "canceld": {
+    "key": "canceld",
+    "type": "text",
+    "value": "已取消"
+  },
+  "key": {
+    "key": "key",
+    "type": "text",
+    "value": "钥匙"
+  },
+  "slot": {
+    "key": "slot",
+    "type": "text",
+    "value": "仓位"
+  },
+  "job": {
+    "key": "job",
+    "type": "text",
+    "value": "作业"
+  },
+  "job_exception": {
+    "key": "job_exception",
+    "type": "text",
+    "value": "作业异常"
+  },
+  "hardware_exception": {
+    "key": "hardware_exception",
+    "type": "text",
+    "value": "硬件异常"
+  }
+}

+ 5 - 14
app/src/main/java/com/grkj/iscs/ISCSApplication.kt

@@ -5,27 +5,22 @@ import android.app.Application
 import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
-import android.content.res.Configuration
-import android.util.TypedValue
 import ch.qos.logback.classic.Level
 import com.drake.statelayout.StateConfig
 import com.grkj.data.data.EventConstants
-import com.grkj.data.database.BackupScheduler
 import com.grkj.data.database.DbReadyGate
-import com.grkj.data.database.ISCSDatabase
 import com.grkj.data.di.LogicManager
 import com.grkj.iscs.common.GlobalManager
 import com.grkj.iscs.features.splash.activity.SplashActivity
-import com.grkj.ui_base.service.CheckKeyInfoTask
 import com.grkj.shared.model.EventBean
-import com.grkj.shared.utils.ArcSoftUtil
 import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.shared.utils.i18n.LanguageCatalog
 import com.grkj.shared.utils.i18n.LanguageStore
-import com.grkj.shared.utils.i18n.source.AssetsCsvSource
-import com.grkj.shared.utils.i18n.source.FileCsvSource
+import com.grkj.shared.utils.i18n.source.AssetsI18nSource
+import com.grkj.shared.utils.i18n.source.FileI18nSource
 import com.grkj.ui_base.business.ModbusBusinessManager
 import com.grkj.ui_base.config.ISCSConfig
+import com.grkj.ui_base.service.CheckKeyInfoTask
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.ble.BleUtil
 import com.grkj.ui_base.utils.modbus.ModBusController
@@ -41,16 +36,12 @@ import com.sik.sikcore.log.LogUtils
 import com.sik.sikcore.thread.ThreadUtils
 import com.tencent.mmkv.MMKV
 import dagger.hilt.android.HiltAndroidApp
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
 import me.jessyan.autosize.AutoSizeConfig
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import java.util.Locale
 
 
 /**
@@ -94,8 +85,8 @@ class ISCSApplication : Application() {
         I18nManager.init(
             defaultLocale = LanguageStore.resolveEffectiveLocale(this),
             initialSources = arrayOf(
-                AssetsCsvSource(this, "i18n", mergedMode = false),
-                FileCsvSource(this, "i18n", mergedMode = false)
+                AssetsI18nSource(this, "i18n"),
+                FileI18nSource(this, "i18n")
             ),
             eagerLoad = true
         )

+ 5 - 5
shared/src/main/java/com/grkj/shared/utils/i18n/LanguageCatalog.kt

@@ -29,7 +29,7 @@ object LanguageCatalog {
 
     private const val ASSETS_DIR = "i18n"
     private const val FILES_DIR = "i18n"
-    private const val MERGED_FILE = "all.csv"
+    private const val MERGED_FILE = "all.json"
     private const val NAME_KEY = "i18n.language_name"
 
     private val bg = Executors.newSingleThreadExecutor { r -> Thread(r, "lang-catalog").apply { isDaemon = true } }
@@ -65,9 +65,9 @@ object LanguageCatalog {
         val names = runCatching { am.list(ASSETS_DIR)?.toList().orEmpty() }.getOrDefault(emptyList())
 
         // 单语
-        names.filter { it.endsWith(".csv", true) && !it.equals(MERGED_FILE, true) }
+        names.filter { it.endsWith(".json", true) && !it.equals(MERGED_FILE, true) }
             .mapNotNull { fn ->
-                val tag = fn.removeSuffix(".csv")
+                val tag = fn.removeSuffix(".json")
                 if (!isValidTag(tag)) return@mapNotNull null
                 val dn = readDisplayNameFromSingle { am.open("$ASSETS_DIR/$fn") } ?: endonym(tag)
                 LanguageItem(tag, Locale.forLanguageTag(tag), Source.ASSETS, dn)
@@ -94,11 +94,11 @@ object LanguageCatalog {
     private fun scanFiles(context: Context): List<LanguageItem> {
         val out = ArrayList<LanguageItem>(8)
         val dir = File(context.filesDir, FILES_DIR).apply { mkdirs() }
-        val files = dir.listFiles()?.filter { it.isFile && it.name.endsWith(".csv", true) }.orEmpty()
+        val files = dir.listFiles()?.filter { it.isFile && it.name.endsWith(".json", true) }.orEmpty()
 
         // 单语
         files.filter { !it.name.equals(MERGED_FILE, true) }.forEach { f ->
-            val tag = f.name.removeSuffix(".csv")
+            val tag = f.name.removeSuffix(".json")
             if (isValidTag(tag)) {
                 val dn = readDisplayNameFromSingle { FileInputStream(f) } ?: endonym(tag)
                 out += LanguageItem(tag, Locale.forLanguageTag(tag), Source.FILES, dn)

+ 0 - 84
shared/src/main/java/com/grkj/shared/utils/i18n/importer/CsvMerger.kt

@@ -1,84 +0,0 @@
-package com.grkj.shared.utils.i18n.importer
-
-import java.io.BufferedReader
-import java.io.StringReader
-import java.lang.StringBuilder
-
-/**
- * CSV 合并器(单语模式:key,type,comment,value)
- * - 依据 key 合并,保留表头。
- * - 注意:解析器做了近似处理;生产环境强需求可与 CsvUtils 共享 parser。
- */
-object CsvMerger {
-
-    data class Row(val key: String, val type: String, val comment: String, val value: String)
-
-    fun merge(oldCsv: String, newCsv: String, strategy: CsvImporter.MergeStrategy): String {
-        val old = read(oldCsv).associateBy { it.key }.toMutableMap()
-        val inc = read(newCsv)
-        when (strategy) {
-            CsvImporter.MergeStrategy.REPLACE -> return newCsv
-            CsvImporter.MergeStrategy.UPSERT -> {
-                for (r in inc) old[r.key] = r
-            }
-            CsvImporter.MergeStrategy.KEEP_EXISTING -> {
-                for (r in inc) old.putIfAbsent(r.key, r)
-            }
-        }
-        val sb = StringBuilder(oldCsv.length + newCsv.length / 4)
-        sb.append("key,type,comment,value\n")
-        for ((_, v) in old) {
-            sb.append(escape(v.key)).append(',')
-                .append(escape(v.type)).append(',')
-                .append(escape(v.comment)).append(',')
-                .append(escape(v.value)).append('\n')
-        }
-        return sb.toString()
-    }
-
-    private fun read(csv: String): List<Row> {
-        val br = BufferedReader(StringReader(csv))
-        val header = br.readLine() ?: return emptyList()
-        val cols = header.split(',')
-        val res = ArrayList<Row>(1024)
-        br.lineSequence().forEach { line ->
-            if (line.isBlank()) return@forEach
-            val p = splitCsv(line)
-            val row = Row(
-                key = p.getOrElse(0) { "" },
-                type = p.getOrElse(1) { "text" },
-                comment = p.getOrElse(2) { "" },
-                value = p.getOrElse(3) { "" }
-            )
-            if (row.key.isNotBlank()) res.add(row)
-        }
-        return res
-    }
-
-    private fun splitCsv(line: String): List<String> {
-        val out = ArrayList<String>(4)
-        val sb = StringBuilder()
-        var i = 0
-        var inQ = false
-        while (i < line.length) {
-            val c = line[i]
-            when {
-                c == '"' -> {
-                    if (inQ && i + 1 < line.length && line[i + 1] == '"') { sb.append('"'); i++ }
-                    else inQ = !inQ
-                }
-                c == ',' && !inQ -> { out.add(sb.toString()); sb.setLength(0) }
-                else -> sb.append(c)
-            }
-            i++
-        }
-        out.add(sb.toString())
-        return out
-    }
-
-    private fun escape(s: String): String {
-        val need = s.indexOf('"') >= 0 || s.indexOf(',') >= 0 || s.indexOf('\n') >= 0
-        if (!need) return s
-        return "\"" + s.replace("\"", "\"\"") + "\""
-    }
-}

+ 26 - 24
shared/src/main/java/com/grkj/shared/utils/i18n/importer/CsvImporter.kt → shared/src/main/java/com/grkj/shared/utils/i18n/importer/JsonImporter.kt

@@ -3,21 +3,17 @@ package com.grkj.shared.utils.i18n.importer
 import android.content.Context
 import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.shared.utils.i18n.I18nSource
-import com.grkj.shared.utils.i18n.source.FileCsvSource
+import com.grkj.shared.utils.i18n.source.FileI18nSource
 import java.io.File
 import java.io.InputStream
 import java.util.Locale
 import java.util.zip.ZipInputStream
 
 /**
- * CSV/ZIP 导入器
- * - 目标目录:context.filesDir / dirName
- * - 策略:
- *   REPLACE       => 用新文件替换旧文件
- *   UPSERT        => 新 key 覆盖/追加,旧 key 保留(按 key 合并)
- *   KEEP_EXISTING => 仅补全旧文件中缺失的 key
+ * JSON/ZIP 导入器(只认 .json)
+ * 目标目录:context.filesDir/<dirName>
  */
-class CsvImporter(
+class JsonImporter(
     private val context: Context,
     private val dirName: String = "i18n"
 ) {
@@ -26,9 +22,9 @@ class CsvImporter(
 
     private fun dir(): File = File(context.filesDir, dirName).apply { mkdirs() }
 
-    /** 导入单个 CSV(建议文件名 localeTag.csv,例如 zh-CN.csv) */
-    fun importCsv(locale: Locale, input: InputStream, strategy: MergeStrategy): File {
-        val out = File(dir(), "${locale.toLanguageTag()}.csv")
+    /** 导入单个 locale JSON:文件名固定 <locale>.json */
+    fun importJson(locale: Locale, input: InputStream, strategy: MergeStrategy): File {
+        val out = File(dir(), "${locale.toLanguageTag()}.json")
         val tmp = File(out.parentFile, out.name + ".tmp")
         tmp.outputStream().use { input.copyTo(it) }
         applyMerge(out, tmp, strategy)
@@ -37,16 +33,24 @@ class CsvImporter(
         return out
     }
 
-    /**
-     * 导入 ZIP:可包含多个 csv(例如 zh-CN.csv / en-US.csv / all.csv)
-     * - 若同时存在 all.csv 与单语表,建议保留单语表方案(查找更快)。
-     */
+    /** 导入合表 all.json(也可 ZIP 里带) */
+    fun importMerged(input: InputStream, fileName: String = "all.json", strategy: MergeStrategy): File {
+        val out = File(dir(), fileName)
+        val tmp = File(out.parentFile, out.name + ".tmp")
+        tmp.outputStream().use { input.copyTo(it) }
+        applyMerge(out, tmp, strategy)
+        tmp.delete()
+        refreshSource()
+        return out
+    }
+
+    /** 导入 ZIP:只处理 .json(<locale>.json / all.json) */
     fun importZip(zip: InputStream, strategy: MergeStrategy): List<File> {
         val outputs = mutableListOf<File>()
         ZipInputStream(zip).use { zis ->
             var e = zis.nextEntry
             while (e != null) {
-                if (!e.isDirectory && e.name.endsWith(".csv", true)) {
+                if (!e.isDirectory && e.name.endsWith(".json", true)) {
                     val name = e.name.substringAfterLast('/')
                     val out = File(dir(), name)
                     val tmp = File(out.parentFile, "$name.tmp")
@@ -62,22 +66,20 @@ class CsvImporter(
         return outputs
     }
 
-    /** 导入完成后,将 FileCsvSource 置于 sources 列表末尾并 reload(覆盖内置) */
     private fun refreshSource() {
-        // 避免重复添加多个 FileCsvSource:允许调用方自行管理;此处简单追加一次也可。
         I18nManager.addSource(fileSource(), refresh = true)
     }
 
-    private fun fileSource(): I18nSource = FileCsvSource(context, dirName = dirName, mergedMode = false)
+    private fun fileSource(): I18nSource =
+        FileI18nSource(context, dirName = dirName, mergedFileName = "all.json")
 
-    /** 将 tmp 合并到 target(按 strategy) */
     private fun applyMerge(target: File, incoming: File, strategy: MergeStrategy) {
         if (!target.exists() || strategy == MergeStrategy.REPLACE) {
             incoming.copyTo(target, overwrite = true); return
         }
-        val oldCsv = target.readText()
-        val newCsv = incoming.readText()
-        val merged = CsvMerger.merge(oldCsv, newCsv, strategy)
+        val oldText = target.readText()
+        val newText = incoming.readText()
+        val merged = JsonMerger.merge(oldText, newText, strategy)
         target.writeText(merged)
     }
-}
+}

+ 39 - 0
shared/src/main/java/com/grkj/shared/utils/i18n/importer/JsonMerger.kt

@@ -0,0 +1,39 @@
+package com.grkj.shared.utils.i18n.importer
+
+import org.json.JSONObject
+
+/**
+ * JSON 合并器(单语 Map:{ key: EntryLike } 或 合表:{ "xx-XX": { ... } })
+ * - 对于 all.json,请在 importer 层决定:直接 REPLACE or 细粒度合并。
+ *   此处默认同样以 “按 key 合并” 的策略处理顶层对象(需要时可扩展)。
+ */
+object JsonMerger {
+
+    fun merge(oldJson: String, newJson: String, strategy: JsonImporter.MergeStrategy): String {
+        if (oldJson.isBlank()) return normalize(newJson)
+        if (newJson.isBlank()) return normalize(oldJson)
+
+        if (strategy == JsonImporter.MergeStrategy.REPLACE) {
+            return normalize(newJson)
+        }
+
+        val oldObj = JSONObject(oldJson)
+        val newObj = JSONObject(newJson)
+
+        // 顶层合并(既适用于单语 map,也适用于合表 all.json 的顶层 locale map)
+        val result = JSONObject(oldObj.toString()) // clone
+        val it = newObj.keys()
+        while (it.hasNext()) {
+            val k = it.next()
+            when (strategy) {
+                JsonImporter.MergeStrategy.UPSERT -> result.put(k, newObj.get(k))
+                JsonImporter.MergeStrategy.KEEP_EXISTING -> if (!result.has(k)) result.put(k, newObj.get(k))
+                else -> {} // REPLACE 已在上面提前返回
+            }
+        }
+        return result.toString(2)
+    }
+
+    private fun normalize(json: String): String =
+        if (json.isBlank()) "{}" else JSONObject(json).toString(2)
+}

+ 0 - 186
shared/src/main/java/com/grkj/shared/utils/i18n/source/AssetsCsvSource.kt

@@ -1,186 +0,0 @@
-package com.grkj.shared.utils.i18n.source
-
-import android.content.Context
-import com.grkj.shared.utils.i18n.I18nEntry
-import com.grkj.shared.utils.i18n.I18nSource
-import com.grkj.shared.utils.i18n.util.CsvUtils
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.io.BufferedReader
-import java.io.InputStreamReader
-import java.nio.charset.StandardCharsets
-import java.util.Locale
-
-/**
- * 从 assets 目录读取 CSV 词库(更鲁棒:UTF-8、BOM、文件名回退)。
- *
- * dir: assets 子目录(默认 "i18n")
- * mergedMode=false:单语一表(zh-CN.csv)
- * mergedMode=true :合表(all.csv)
- */
-class AssetsCsvSource(
-    private val context: Context,
-    private val dir: String = "i18n",
-    private val mergedMode: Boolean = false,
-    private val mergedFileName: String = "all.csv"
-) : I18nSource {
-    private val logger: Logger = LoggerFactory.getLogger(this::class.java)
-
-    /** —— 新增:可用语言缓存(assets 基本不变,懒加载一次即可) */
-    private val cachedLocales: Set<Locale> by lazy { scanAvailableLocales() }
-
-    override fun load(locale: Locale): Map<String, I18nEntry> {
-        return if (!mergedMode) {
-            // 依次尝试:zh-CN.csv -> zh.csv -> zh_CN.csv -> ZH-CN.csv(大小写/下划线容错)
-            for (name in candidateNames(locale)) {
-                logger.info("语言文本文件:${name}")
-                val path = "$dir/$name"
-                val map = runCatching {
-                    context.assets.open(path).use { input ->
-                        BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use {
-                            CsvUtils.parseSingleLang(it) // 确保 CsvUtils 里做了 BOM/表头大小写处理
-                        }
-                    }
-                }.getOrNull()
-                if (!map.isNullOrEmpty()) return map
-            }
-            emptyMap()
-        } else {
-            val path = "$dir/$mergedFileName"
-            runCatching {
-                context.assets.open(path).use { input ->
-                    BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use {
-                        CsvUtils.parseMerged(it, locale)
-                    }
-                }
-            }.getOrElse { emptyMap() }
-        }
-    }
-
-    /** —— 新增:列出我有哪些语言包 */
-    override fun availableLocales(): Set<Locale> = cachedLocales
-
-    /** —— 可选覆写:更快判断(避免逐个打开) */
-    override fun hasLocale(locale: Locale): Boolean {
-        val tag = locale.toLanguageTag()
-        return cachedLocales.any { it.toLanguageTag().equals(tag, true) }
-    }
-
-    /** 扫描 assets 下现有语言(单表=文件名;合表=CSV 表头) */
-    private fun scanAvailableLocales(): Set<Locale> {
-        return if (!mergedMode) {
-            // 扫描文件名:xx.csv / xx-YY.csv / xx_YY.csv
-            val files = runCatching { context.assets.list(dir)?.toList().orEmpty() }.getOrDefault(emptyList())
-            files.asSequence()
-                .filter { it.endsWith(".csv", true) || it.endsWith(".json", true) }
-                .map { it.substringBeforeLast('.') }
-                .mapNotNull { nameToLocaleOrNull(it) }
-                .toSet()
-        } else {
-            // 嗅探合表第一行表头:key, zh-CN, en-US, ...
-            val path = "$dir/$mergedFileName"
-            runCatching {
-                context.assets.open(path).use { input ->
-                    BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use { br ->
-                        val header = br.readLine()?.trim().orEmpty()
-                        parseLocalesFromHeader(header)
-                    }
-                }
-            }.getOrElse { emptySet() }
-        }
-    }
-
-    /** 解析 CSV 表头中的语言列名(忽略首列 key) */
-    private fun parseLocalesFromHeader(header: String): Set<Locale> {
-        if (header.isBlank()) return emptySet()
-        val cols = header.split(',').map { it.trim().trim('"', '\'') }
-        return cols.drop(1) // 跳过 key
-            .mapNotNull { col -> nameToLocaleOrNull(col) }
-            .toSet()
-    }
-
-    /** 将 "zh-CN" / "zh_CN" / "en" / "EN-us" 这类名字转 Locale,非法则 null */
-    private fun nameToLocaleOrNull(name: String): Locale? {
-        val norm = name.replace('_', '-')
-        val tag = when {
-            // 简单 lang 或 lang-REGION 或 lang-Script-Region
-            Regex("""^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2}|\-\d{3})?$""").matches(norm) -> norm
-            else -> return null
-        }
-        return try { Locale.forLanguageTag(tag) } catch (_: Throwable) { null }
-    }
-
-    /**
-     * 基于 BCP47 解析:忽略脚本/变体,仅提取 language + region,并生成最可能的文件名:
-     * zh-CN.csv → zh_CN.csv → zh.csv
-     */
-    /** 生成优先级:zh-CN.csv → zh_CN.csv →(小写变体)→ zh.csv */
-    /** 生成优先名:lang-Script-Region / lang_Script_Region / lang-Region / lang_Script / lang */
-    private fun candidateNames(locale: Locale): List<String> {
-        val (lang, script, region) = parseLangScriptRegion(locale)
-        val list = mutableListOf<String>()
-        if (lang.isEmpty()) return list
-
-        fun addName(l: String, s: String?, r: String?, sep: Char) {
-            val sb = StringBuilder(l)
-            if (!s.isNullOrEmpty()) sb.append(sep).append(s)
-            if (!r.isNullOrEmpty()) sb.append(sep).append(r)
-            sb.append(".csv")
-            list += sb.toString()
-        }
-
-        // 1) lang-Script-Region(最高优先)
-        if (!script.isNullOrEmpty() && !region.isNullOrEmpty()) {
-            addName(lang, script, region, '-')
-            addName(lang, script, region, '_')
-            // 小写变体也加上,防止资产里用了全小写
-            addName(lang, script.lowercase(), region.lowercase(), '-')
-            addName(lang, script.lowercase(), region.lowercase(), '_')
-        }
-        // 2) lang-Region
-        if (!region.isNullOrEmpty()) {
-            addName(lang, null, region, '-')
-            addName(lang, null, region, '_')
-            addName(lang, null, region.lowercase(), '-')
-            addName(lang, null, region.lowercase(), '_')
-        }
-        // 3) lang-Script
-        if (!script.isNullOrEmpty()) {
-            addName(lang, script, null, '-')
-            addName(lang, script, null, '_')
-            addName(lang, script.lowercase(), null, '-')
-            addName(lang, script.lowercase(), null, '_')
-        }
-        // 4) lang
-        list += "$lang.csv"
-        logger.info("匹配到的语言:${list.joinToString(",")}")
-        return list.distinct()
-    }
-
-    /** 从 Locale 提取 (lang, script, region),遵循 BCP-47:lang 小写、script TitleCase、region 大写 */
-    private fun parseLangScriptRegion(locale: Locale): Triple<String, String?, String?> {
-        // 优先用标准 API
-        var lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
-        var script = locale.script?.let {
-            if (it.isNotBlank()) it.substring(0,1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT)
-            else null
-        }
-        var region = locale.country?.uppercase(Locale.ROOT).orEmpty().ifBlank { null }
-
-        // 有些厂商定制 Locale 会把脚本/地区塞进 variant,额外兜底一次
-        if (script.isNullOrEmpty() || region == null) {
-            val parts = locale.toLanguageTag().replace('_','-').split('-').filter { it.isNotBlank() }
-            if (parts.isNotEmpty()) {
-                lang = parts.first().lowercase(Locale.ROOT)
-                // BCP47:脚本 = 4 个字母,首字母大写;地区=2字母或3数字
-                val sc = parts.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
-                val rg = parts.firstOrNull { (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() }) }
-                if (script.isNullOrEmpty() && sc != null) {
-                    script = sc.substring(0,1).uppercase(Locale.ROOT) + sc.substring(1).lowercase(Locale.ROOT)
-                }
-                if (region == null && rg != null) region = rg.uppercase(Locale.ROOT)
-            }
-        }
-        return Triple(lang, script, region)
-    }
-}

+ 158 - 0
shared/src/main/java/com/grkj/shared/utils/i18n/source/AssetsI18nSource.kt

@@ -0,0 +1,158 @@
+package com.grkj.shared.utils.i18n.source
+
+import android.content.Context
+import com.grkj.shared.utils.i18n.I18nEntry
+import com.grkj.shared.utils.i18n.I18nSource
+import com.grkj.shared.utils.i18n.util.JsonUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import java.io.BufferedReader
+import java.io.InputStreamReader
+import java.nio.charset.StandardCharsets
+import java.util.Locale
+
+/**
+ * 只读 JSON 的 assets 词库:
+ * - 单语:assets/<dir>/<locale>.json   (如 i18n/zh-CN.json)
+ * - 合表:assets/<dir>/all.json        ({ "zh-CN": { ... }, "en-US": { ... } })
+ * 若两者都存在,优先单语文件(查找更快)。
+ */
+class AssetsI18nSource(
+    private val context: Context,
+    private val dir: String = "i18n",
+    private val mergedFileName: String = "all.json"
+) : I18nSource {
+
+    private val logger: Logger = LoggerFactory.getLogger(this::class.java)
+
+    private val cachedLocales: Set<Locale> by lazy { scanAvailableLocales() }
+
+    override fun load(locale: Locale): Map<String, I18nEntry> {
+        // 1) 单语优先:按照候选名匹配 locale.json
+        for (name in candidateNames(locale)) {
+            val path = "$dir/${name.replace(".csv", ".json")}"
+            if (!exists(path)) continue
+            open(path).use { input ->
+                BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use {
+                    return JsonUtils.parseSingleLang(it)
+                }
+            }
+        }
+        // 2) 合表 all.json
+        val mergedPath = "$dir/$mergedFileName"
+        if (exists(mergedPath)) {
+            open(mergedPath).use { input ->
+                BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use {
+                    return JsonUtils.parseMerged(it, locale)
+                }
+            }
+        }
+        return emptyMap()
+    }
+
+    override fun availableLocales(): Set<Locale> = cachedLocales
+
+    override fun hasLocale(locale: Locale): Boolean {
+        val tag = locale.toLanguageTag()
+        return cachedLocales.any { it.toLanguageTag().equals(tag, true) }
+    }
+
+    private fun exists(path: String): Boolean {
+        return runCatching { context.assets.open(path).close(); true }.getOrElse { false }
+    }
+
+    private fun open(path: String) = context.assets.open(path)
+
+    private fun scanAvailableLocales(): Set<Locale> {
+        // assets 目录:列出全部 json
+        val files = runCatching { context.assets.list(dir)?.toList().orEmpty() }.getOrDefault(emptyList())
+        val singleLocales = files.asSequence()
+            .filter { it.endsWith(".json", true) && !it.equals(mergedFileName, true) }
+            .map { it.substringBeforeLast('.') }
+            .mapNotNull { nameToLocaleOrNull(it) }
+            .toSet()
+
+        // 合表额外嗅探
+        val mergedPath = "$dir/$mergedFileName"
+        val mergedLocales = if (exists(mergedPath)) {
+            open(mergedPath).use { input ->
+                BufferedReader(InputStreamReader(input, StandardCharsets.UTF_8)).use { br ->
+                    // 直接让 JsonUtils 选出 map,再取 key 集不太划算,这里简单读取文本做 key 枚举
+                    // 但为省事:直接 parseMerged 用一个虚拟 locale,然后从 chosen 分支推断会丢信息
+                    // 所以这里不走 parseMerged,简单粗暴交给 org.json
+                    try {
+                        val text = br.readText()
+                        val obj = org.json.JSONObject(text)
+                        obj.keys().asSequence().mapNotNull { nameToLocaleOrNull(it) }.toSet()
+                    } catch (_: Throwable) {
+                        emptySet()
+                    }
+                }
+            }
+        } else emptySet()
+
+        val all = (singleLocales + mergedLocales).toSet()
+        logger.info("AssetsI18nSource locales: ${all.joinToString { it.toLanguageTag() }}")
+        return all
+    }
+
+    // ---- 与 CSV 版本一致的候选名生成(只是扩展名换 json) ----
+
+    private fun candidateNames(locale: Locale): List<String> {
+        val (lang, script, region) = parseLangScriptRegion(locale)
+        val list = mutableListOf<String>()
+        if (lang.isEmpty()) return list
+
+        fun addName(l: String, s: String?, r: String?, sep: Char) {
+            val sb = StringBuilder(l)
+            if (!s.isNullOrEmpty()) sb.append(sep).append(s)
+            if (!r.isNullOrEmpty()) sb.append(sep).append(r)
+            sb.append(".json")
+            list += sb.toString()
+        }
+
+        if (!script.isNullOrEmpty() && !region.isNullOrEmpty()) {
+            addName(lang, script, region, '-'); addName(lang, script, region, '_')
+            addName(lang, script.lowercase(), region.lowercase(), '-')
+            addName(lang, script.lowercase(), region.lowercase(), '_')
+        }
+        if (!region.isNullOrEmpty()) {
+            addName(lang, null, region, '-'); addName(lang, null, region, '_')
+            addName(lang, null, region.lowercase(), '-'); addName(lang, null, region.lowercase(), '_')
+        }
+        if (!script.isNullOrEmpty()) {
+            addName(lang, script, null, '-'); addName(lang, script, null, '_')
+            addName(lang, script.lowercase(), null, '-'); addName(lang, script.lowercase(), null, '_')
+        }
+        list += "$lang.json"
+        return list.distinct()
+    }
+
+    private fun nameToLocaleOrNull(name: String): Locale? {
+        val norm = name.replace('_', '-')
+        val tag = when {
+            Regex("""^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2}|\-\d{3})?$""").matches(norm) -> norm
+            else -> return null
+        }
+        return try { Locale.forLanguageTag(tag) } catch (_: Throwable) { null }
+    }
+
+    private fun parseLangScriptRegion(locale: Locale): Triple<String, String?, String?> {
+        var lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
+        var script = locale.script?.let {
+            if (it.isNotBlank()) it.substring(0,1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) else null
+        }
+        var region = locale.country?.uppercase(Locale.ROOT).orEmpty().ifBlank { null }
+        if (script.isNullOrEmpty() || region == null) {
+            val parts = locale.toLanguageTag().replace('_','-').split('-').filter { it.isNotBlank() }
+            if (parts.isNotEmpty()) {
+                lang = parts.first().lowercase(Locale.ROOT)
+                val sc = parts.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
+                val rg = parts.firstOrNull { (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() }) }
+                if (script.isNullOrEmpty() && sc != null) script = sc.substring(0,1).uppercase(Locale.ROOT) + sc.substring(1).lowercase(Locale.ROOT)
+                if (region == null && rg != null) region = rg.uppercase(Locale.ROOT)
+            }
+        }
+        return Triple(lang, script, region)
+    }
+}

+ 0 - 201
shared/src/main/java/com/grkj/shared/utils/i18n/source/FileCsvSource.kt

@@ -1,201 +0,0 @@
-package com.grkj.shared.utils.i18n.source
-
-import android.content.Context
-import com.grkj.shared.utils.i18n.I18nEntry
-import com.grkj.shared.utils.i18n.I18nSource
-import com.grkj.shared.utils.i18n.util.CsvUtils
-import java.io.BufferedReader
-import java.io.File
-import java.io.FileInputStream
-import java.io.InputStreamReader
-import java.nio.charset.StandardCharsets
-import java.util.Locale
-
-/**
- * 从 app 私有 files 目录读取 CSV(导入产物)。
- * 结构:
- *  - 单语:files/i18n/zh-CN.csv / zh.csv
- *  - 合表:files/i18n/all.csv
- */
-class FileCsvSource(
-    private val context: Context,
-    private val dirName: String = "i18n",
-    private val mergedMode: Boolean = false,
-    private val mergedFileName: String = "all.csv"
-) : I18nSource {
-
-    /** —— 新增:扫描时机和缓存(文件会变,别用 lazy 永久缓存) */
-    @Volatile
-    private var lastScanMillis: Long = 0L
-    @Volatile
-    private var lastLocales: Set<Locale> = emptySet()
-    private val SCAN_INTERVAL_MS = 1500L // 1.5s 保护,避免频繁 IO
-
-    private fun dir(): File = File(context.filesDir, dirName).apply { mkdirs() }
-
-    override fun load(locale: Locale): Map<String, I18nEntry> {
-        val dir = File(context.filesDir, dirName).apply { mkdirs() }
-        return if (!mergedMode) {
-            // 同样做文件名回退
-            for (name in candidateNames(locale)) {
-                val f = File(dir, name)
-                if (!f.exists()) continue
-                val map = runCatching {
-                    FileInputStream(f).use { fis ->
-                        BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use {
-                            CsvUtils.parseSingleLang(it)
-                        }
-                    }
-                }.getOrNull()
-                if (!map.isNullOrEmpty()) return map
-            }
-            emptyMap()
-        } else {
-            val f = File(dir, mergedFileName)
-            if (!f.exists()) return emptyMap()
-            runCatching {
-                FileInputStream(f).use { fis ->
-                    BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use {
-                        CsvUtils.parseMerged(it, locale)
-                    }
-                }
-            }.getOrElse { emptyMap() }
-        }
-    }
-
-    /** —— 新增:目录扫描 + 合表头嗅探 */
-    override fun availableLocales(): Set<Locale> {
-        val now = System.currentTimeMillis()
-        if (now - lastScanMillis <= SCAN_INTERVAL_MS) return lastLocales
-
-        val root = dir()
-        val locales = if (!mergedMode) {
-            root.listFiles().orEmpty().asSequence()
-                .filter {
-                    it.isFile && (it.name.endsWith(".csv", true) || it.name.endsWith(
-                        ".json",
-                        true
-                    ))
-                }
-                .map { it.nameWithoutExtension }
-                .mapNotNull { nameToLocaleOrNull(it) }
-                .toSet()
-        } else {
-            val f = File(root, mergedFileName)
-            if (!f.exists()) emptySet()
-            else runCatching {
-                FileInputStream(f).use { fis ->
-                    BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use { br ->
-                        val header = br.readLine()?.trim().orEmpty()
-                        parseLocalesFromHeader(header)
-                    }
-                }
-            }.getOrElse { emptySet() }
-        }
-
-        lastLocales = locales
-        lastScanMillis = now
-        return locales
-    }
-
-    override fun hasLocale(locale: Locale): Boolean {
-        val tag = locale.toLanguageTag()
-        return availableLocales().any { it.toLanguageTag().equals(tag, true) }
-    }
-
-    private fun parseLocalesFromHeader(header: String): Set<Locale> {
-        if (header.isBlank()) return emptySet()
-        val cols = header.split(',').map { it.trim().trim('"', '\'') }
-        return cols.drop(1).mapNotNull { nameToLocaleOrNull(it) }.toSet()
-    }
-
-    private fun nameToLocaleOrNull(name: String): Locale? {
-        val norm = name.replace('_', '-')
-        val tag = when {
-            Regex("""^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2}|\-\d{3})?$""").matches(norm) -> norm
-            else -> return null
-        }
-        return try {
-            Locale.forLanguageTag(tag)
-        } catch (_: Throwable) {
-            null
-        }
-    }
-
-    /**
-     * 基于 BCP47 解析:忽略脚本/变体,仅提取 language + region,并生成最可能的文件名:
-     * zh-CN.csv → zh_CN.csv → zh.csv
-     */
-    /** 生成优先名:lang-Script-Region / lang_Script_Region / lang-Region / lang_Script / lang */
-    private fun candidateNames(locale: Locale): List<String> {
-        val (lang, script, region) = parseLangScriptRegion(locale)
-        val list = mutableListOf<String>()
-        if (lang.isEmpty()) return list
-
-        fun addName(l: String, s: String?, r: String?, sep: Char) {
-            val sb = StringBuilder(l)
-            if (!s.isNullOrEmpty()) sb.append(sep).append(s)
-            if (!r.isNullOrEmpty()) sb.append(sep).append(r)
-            sb.append(".csv")
-            list += sb.toString()
-        }
-
-        // 1) lang-Script-Region(最高优先)
-        if (!script.isNullOrEmpty() && !region.isNullOrEmpty()) {
-            addName(lang, script, region, '-')
-            addName(lang, script, region, '_')
-            // 小写变体也加上,防止资产里用了全小写
-            addName(lang, script.lowercase(), region.lowercase(), '-')
-            addName(lang, script.lowercase(), region.lowercase(), '_')
-        }
-        // 2) lang-Region
-        if (!region.isNullOrEmpty()) {
-            addName(lang, null, region, '-')
-            addName(lang, null, region, '_')
-            addName(lang, null, region.lowercase(), '-')
-            addName(lang, null, region.lowercase(), '_')
-        }
-        // 3) lang-Script
-        if (!script.isNullOrEmpty()) {
-            addName(lang, script, null, '-')
-            addName(lang, script, null, '_')
-            addName(lang, script.lowercase(), null, '-')
-            addName(lang, script.lowercase(), null, '_')
-        }
-        // 4) lang
-        list += "$lang.csv"
-
-        return list.distinct()
-    }
-
-    /** 从 Locale 提取 (lang, script, region),遵循 BCP-47:lang 小写、script TitleCase、region 大写 */
-    private fun parseLangScriptRegion(locale: Locale): Triple<String, String?, String?> {
-        // 优先用标准 API
-        var lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
-        var script = locale.script?.let {
-            if (it.isNotBlank()) it.substring(0, 1).uppercase(Locale.ROOT) + it.substring(1)
-                .lowercase(Locale.ROOT)
-            else null
-        }
-        var region = locale.country?.uppercase(Locale.ROOT).orEmpty().ifBlank { null }
-
-        // 有些厂商定制 Locale 会把脚本/地区塞进 variant,额外兜底一次
-        if (script.isNullOrEmpty() || region == null) {
-            val parts =
-                locale.toLanguageTag().replace('_', '-').split('-').filter { it.isNotBlank() }
-            if (parts.isNotEmpty()) {
-                lang = parts.first().lowercase(Locale.ROOT)
-                // BCP47:脚本 = 4 个字母,首字母大写;地区=2字母或3数字
-                val sc = parts.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
-                val rg =
-                    parts.firstOrNull { (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() }) }
-                if (script.isNullOrEmpty() && sc != null) {
-                    script = sc.substring(0, 1).uppercase(Locale.ROOT) + sc.substring(1)
-                        .lowercase(Locale.ROOT)
-                }
-                if (region == null && rg != null) region = rg.uppercase(Locale.ROOT)
-            }
-        }
-        return Triple(lang, script, region)
-    }
-}

+ 148 - 0
shared/src/main/java/com/grkj/shared/utils/i18n/source/FileI18nSource.kt

@@ -0,0 +1,148 @@
+package com.grkj.shared.utils.i18n.source
+
+import android.content.Context
+import com.grkj.shared.utils.i18n.I18nEntry
+import com.grkj.shared.utils.i18n.I18nSource
+import com.grkj.shared.utils.i18n.util.JsonUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import java.io.BufferedReader
+import java.io.File
+import java.io.FileInputStream
+import java.io.InputStreamReader
+import java.nio.charset.StandardCharsets
+import java.util.Locale
+
+/**
+ * 只读 JSON 的 files 词库:
+ * - 单语:files/<dir>/<locale>.json
+ * - 合表:files/<dir>/all.json
+ * 若两者都存在,优先单语。
+ */
+class FileI18nSource(
+    private val context: Context,
+    private val dirName: String = "i18n",
+    private val mergedFileName: String = "all.json"
+) : I18nSource {
+
+    private val logger: Logger = LoggerFactory.getLogger(this::class.java)
+
+    @Volatile private var lastScanMillis: Long = 0L
+    @Volatile private var lastLocales: Set<Locale> = emptySet()
+    private val SCAN_INTERVAL_MS = 1500L
+
+    private fun dir(): File = File(context.filesDir, dirName).apply { mkdirs() }
+
+    override fun load(locale: Locale): Map<String, I18nEntry> {
+        val root = dir()
+        // 单语优先
+        for (name in candidateNames(locale)) {
+            val f = File(root, name.replace(".csv", ".json"))
+            if (!f.exists()) continue
+            FileInputStream(f).use { fis ->
+                BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use {
+                    return JsonUtils.parseSingleLang(it)
+                }
+            }
+        }
+        // 合表
+        val merged = File(root, mergedFileName)
+        if (merged.exists()) {
+            FileInputStream(merged).use { fis ->
+                BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use {
+                    return JsonUtils.parseMerged(it, locale)
+                }
+            }
+        }
+        return emptyMap()
+    }
+
+    override fun availableLocales(): Set<Locale> {
+        val now = System.currentTimeMillis()
+        if (now - lastScanMillis <= SCAN_INTERVAL_MS) return lastLocales
+        val root = dir()
+        val single = root.listFiles().orEmpty()
+            .filter { it.isFile && it.name.endsWith(".json", true) && !it.name.equals(mergedFileName, true) }
+            .map { it.nameWithoutExtension }
+            .mapNotNull { nameToLocaleOrNull(it) }
+            .toSet()
+        val merged = File(root, mergedFileName)
+        val mergedLocales = if (merged.exists()) {
+            runCatching {
+                FileInputStream(merged).use { fis ->
+                    BufferedReader(InputStreamReader(fis, StandardCharsets.UTF_8)).use { br ->
+                        val obj = org.json.JSONObject(br.readText())
+                        obj.keys().asSequence().mapNotNull { nameToLocaleOrNull(it) }.toSet()
+                    }
+                }
+            }.getOrElse { emptySet() }
+        } else emptySet()
+        val all = (single + mergedLocales).toSet()
+        lastLocales = all
+        lastScanMillis = now
+        logger.info("FileI18nSource locales: ${all.joinToString { it.toLanguageTag() }}")
+        return all
+    }
+
+    override fun hasLocale(locale: Locale): Boolean {
+        val tag = locale.toLanguageTag()
+        return availableLocales().any { it.toLanguageTag().equals(tag, true) }
+    }
+
+    // 复用与 Assets 版一致的工具
+    private fun candidateNames(locale: Locale): List<String> {
+        val (lang, script, region) = parseLangScriptRegion(locale)
+        val list = mutableListOf<String>()
+        if (lang.isEmpty()) return list
+        fun addName(l: String, s: String?, r: String?, sep: Char) {
+            val sb = StringBuilder(l)
+            if (!s.isNullOrEmpty()) sb.append(sep).append(s)
+            if (!r.isNullOrEmpty()) sb.append(sep).append(r)
+            sb.append(".json")
+            list += sb.toString()
+        }
+        if (!script.isNullOrEmpty() && !region.isNullOrEmpty()) {
+            addName(lang, script, region, '-'); addName(lang, script, region, '_')
+            addName(lang, script.lowercase(), region.lowercase(), '-')
+            addName(lang, script.lowercase(), region.lowercase(), '_')
+        }
+        if (!region.isNullOrEmpty()) {
+            addName(lang, null, region, '-'); addName(lang, null, region, '_')
+            addName(lang, null, region.lowercase(), '-'); addName(lang, null, region.lowercase(), '_')
+        }
+        if (!script.isNullOrEmpty()) {
+            addName(lang, script, null, '-'); addName(lang, script, null, '_')
+            addName(lang, script.lowercase(), null, '-'); addName(lang, script.lowercase(), null, '_')
+        }
+        list += "$lang.json"
+        return list.distinct()
+    }
+
+    private fun nameToLocaleOrNull(name: String): Locale? {
+        val norm = name.replace('_', '-')
+        val tag = when {
+            Regex("""^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-[A-Za-z]{2}|\-\d{3})?$""").matches(norm) -> norm
+            else -> return null
+        }
+        return try { Locale.forLanguageTag(tag) } catch (_: Throwable) { null }
+    }
+
+    private fun parseLangScriptRegion(locale: Locale): Triple<String, String?, String?> {
+        var lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
+        var script = locale.script?.let {
+            if (it.isNotBlank()) it.substring(0,1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) else null
+        }
+        var region = locale.country?.uppercase(Locale.ROOT).orEmpty().ifBlank { null }
+        if (script.isNullOrEmpty() || region == null) {
+            val parts = locale.toLanguageTag().replace('_','-').split('-').filter { it.isNotBlank() }
+            if (parts.isNotEmpty()) {
+                lang = parts.first().lowercase(Locale.ROOT)
+                val sc = parts.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
+                val rg = parts.firstOrNull { (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() }) }
+                if (script.isNullOrEmpty() && sc != null) script = sc.substring(0,1).uppercase(Locale.ROOT) + sc.substring(1).lowercase(Locale.ROOT)
+                if (region == null && rg != null) region = rg.uppercase(Locale.ROOT)
+            }
+        }
+        return Triple(lang, script, region)
+    }
+}

+ 0 - 285
shared/src/main/java/com/grkj/shared/utils/i18n/util/CsvUtils.kt

@@ -1,285 +0,0 @@
-package com.grkj.shared.utils.i18n.util
-
-import com.grkj.shared.utils.i18n.I18nEntry
-import com.grkj.shared.utils.i18n.I18nType
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import java.io.BufferedReader
-import java.util.Locale
-
-/**
- * 轻量 CSV 解析(近 RFC4180)
- * - 单语:宽松模式(前三逗号切 key/type/comment,剩余全 value,支持换行)
- * - 合表:按 “语言+脚本+地区” 选择最佳列(BCP-47:zh-Hans-CN > zh-CN > zh-Hans > zh)
- */
-object CsvUtils {
-    private val logger: Logger = LoggerFactory.getLogger(CsvUtils::class.java)
-
-    // --- 基础工具 ---
-    private fun parseLine(line: String): List<String> {
-        val out = ArrayList<String>(8)
-        val sb = StringBuilder(line.length + 4)
-        var i = 0
-        var inQ = false
-        while (i < line.length) {
-            val c = line[i]
-            when {
-                c == '"' -> {
-                    if (inQ && i + 1 < line.length && line[i + 1] == '"') {
-                        sb.append('"'); i++
-                    } else inQ = !inQ
-                }
-                c == ',' && !inQ -> {
-                    out.add(sb.toString()); sb.setLength(0)
-                }
-                else -> sb.append(c)
-            }
-            i++
-        }
-        out.add(sb.toString())
-        return out
-    }
-
-    private fun String.stripBom() = if (startsWith("\uFEFF")) substring(1) else this
-    private fun String.trimCR() = if (isNotEmpty() && last() == '\r') dropLast(1) else this
-
-    private fun isTypeToken(s: String): Boolean =
-        when (s.trim().lowercase(Locale.ROOT)) { "text", "plural", "select" -> true; else -> false }
-
-    /** 返回 [key, type, comment, valueRest];找不到3个逗号时 size < 4 */
-    private fun splitFirst3Commas(raw: String): List<String> {
-        val a = raw.indexOf(',')
-        if (a < 0) return listOf(raw)
-        val b = raw.indexOf(',', a + 1)
-        if (b < 0) return listOf(raw.substring(0, a), raw.substring(a + 1))
-        val c = raw.indexOf(',', b + 1)
-        if (c < 0) return listOf(
-            raw.substring(0, a),
-            raw.substring(a + 1, b),
-            raw.substring(b + 1)
-        )
-        return listOf(
-            raw.substring(0, a),
-            raw.substring(a + 1, b),
-            raw.substring(b + 1, c),
-            raw.substring(c + 1)
-        )
-    }
-
-    // --- 单语:宽松解析(保持你的实现) ---
-    fun parseSingleLang(br: BufferedReader): Map<String, I18nEntry> {
-        val out = LinkedHashMap<String, I18nEntry>(512)
-        var curKey: String? = null
-        var curType: I18nType = I18nType.TEXT
-        var curVal = StringBuilder()
-
-        fun flush() {
-            val k = curKey ?: return
-            out[k] = I18nEntry(k, curType, curVal.toString())
-            curKey = null
-            curVal = StringBuilder()
-        }
-
-        // 读取首行,判断是否为表头
-        val firstRaw0 = br.readLine() ?: return emptyMap()
-        val firstRaw = firstRaw0.stripBom().trimCR()
-        val headCols = parseLine(firstRaw)
-        val idxKey = headCols.indexOfFirst { it.equals("key", true) }
-        val idxType = headCols.indexOfFirst { it.equals("type", true) }
-        val idxComment = headCols.indexOfFirst { it.equals("comment", true) }
-        val idxValueCol = headCols.indexOfFirst { it.equals("value", true) || it.equals("text", true) }
-
-        val hasHeader = idxKey >= 0 && idxType >= 0
-        val valueStartIdx: Int? = when {
-            !hasHeader -> null
-            idxValueCol >= 0 -> idxValueCol             // key,type,comment?,value
-            idxComment >= 0 -> idxComment + 1           // 没有 value 列名 → comment 之后全是 value
-            else -> idxType + 1                          // 只有 key,type → type 之后全是 value
-        }
-
-        // 如果没有表头,把首行当数据行走宽松逻辑
-        if (!hasHeader) {
-            val parts = splitFirst3Commas(firstRaw)
-            val isNew = parts.size >= 3 && parts[0].isNotBlank() && isTypeToken(parts[1])
-            if (isNew) {
-                flush()
-                curKey = parts[0].trim()
-                curType = when (parts[1].trim().lowercase(Locale.ROOT)) {
-                    "plural" -> I18nType.PLURAL
-                    "select" -> I18nType.SELECT
-                    else -> I18nType.TEXT
-                }
-                // 兼容“无 comment + 行尾多逗号”
-                val valueRest = when {
-                    parts.size >= 4 && parts[3].isNotEmpty() -> parts[3]    // 有 comment & 有值
-                    parts.size >= 4 && parts[3].isEmpty() -> parts[2]       // 第四段为空 → 把第三段当 value
-                    else -> parts[2]                                        // 只有三段 → 第三段就是 value
-                }
-                curVal.append(valueRest)
-            }
-        }
-
-        while (true) {
-            val line0 = br.readLine() ?: break
-            val raw = line0.stripBom().trimCR()
-            if (raw.isBlank()) {
-                if (curKey != null) curVal.append('\n')
-                continue
-            }
-
-            if (hasHeader) {
-                // 表头模式:从 valueStartIdx 起把所有列拼为 value,但要去掉末尾的空列(英文 CSV 的“结尾逗号”)
-                val cols = parseLine(raw)
-                val k = cols.getOrNull(idxKey)?.trim().orEmpty()
-                val t = cols.getOrNull(idxType)?.trim().orEmpty()
-                val isNew = k.isNotEmpty() && isTypeToken(t)
-                if (isNew) {
-                    flush()
-                    curKey = k
-                    curType = when (t.lowercase(Locale.ROOT)) {
-                        "plural" -> I18nType.PLURAL
-                        "select" -> I18nType.SELECT
-                        else -> I18nType.TEXT
-                    }
-                    val vs = valueStartIdx ?: (idxType + 1)
-                    val valueCols = cols.drop(vs).toMutableList()
-                    // ★关键:剔除末尾空列(由“行尾逗号”产生)
-                    while (valueCols.isNotEmpty() && valueCols.last().isEmpty()) valueCols.removeLast()
-                    curVal.append(valueCols.joinToString(","))
-                } else if (curKey != null) {
-                    if (curVal.isNotEmpty()) curVal.append('\n')
-                    curVal.append(raw)
-                }
-            } else {
-                // 宽松模式(无表头)
-                val parts = splitFirst3Commas(raw)
-                val isNew = parts.size >= 3 && parts[0].isNotBlank() && isTypeToken(parts[1])
-                if (isNew) {
-                    flush()
-                    curKey = parts[0].trim()
-                    curType = when (parts[1].trim().lowercase(Locale.ROOT)) {
-                        "plural" -> I18nType.PLURAL
-                        "select" -> I18nType.SELECT
-                        else -> I18nType.TEXT
-                    }
-                    val valueRest = when {
-                        parts.size >= 4 && parts[3].isNotEmpty() -> parts[3]
-                        parts.size >= 4 && parts[3].isEmpty() -> parts[2]
-                        else -> parts[2]
-                    }
-                    curVal.append(valueRest)
-                } else if (curKey != null) {
-                    if (curVal.isNotEmpty()) curVal.append('\n')
-                    curVal.append(raw)
-                }
-            }
-        }
-
-        flush()
-        return out
-    }
-
-
-
-    // --- 合表:最佳列匹配(语言+脚本+地区) ---
-    private data class LR(val lang: String, val script: String?, val region: String?)
-
-    /** 从 BCP-47 tag 提取 (lang, script, region):lang 小写、script TitleCase、region 大写 */
-    private fun parseLR(tag: String): LR {
-        val p = tag.replace('_', '-').split('-').filter { it.isNotBlank() }
-        if (p.isEmpty()) return LR("", null, null)
-        val lang = p.first().lowercase(Locale.ROOT)
-        val script = p.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
-            ?.let { it.substring(0, 1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) }
-        val region = p.firstOrNull {
-            (it.length == 2 && it.all { ch -> ch.isLetter() }) ||
-                    (it.length == 3 && it.all { ch -> ch.isDigit() })
-        }?.uppercase(Locale.ROOT)
-        return LR(lang, script, region)
-    }
-
-    private fun localeLR(locale: Locale): LR {
-        // 先用 API,拿不到再用 tag 兜底
-        val lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
-        val script = locale.script?.takeIf { it.isNotBlank() }
-            ?.let { it.substring(0,1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) }
-        val region = locale.country?.takeIf { it.isNotBlank() }?.uppercase(Locale.ROOT)
-        val lr = LR(lang, script, region)
-        return if (lr.lang.isEmpty() || (lr.script == null && lr.region == null)) parseLR(locale.toLanguageTag()) else lr
-    }
-
-    /** 评分:lang 必须一致;命中 region +4,命中 script +2,只有 lang +1;满分 7(lang+script+region) */
-    private fun score(want: LR, got: LR): Int {
-        if (want.lang != got.lang) return -1
-        var s = 1
-        if (want.region != null && want.region == got.region) s += 4
-        if (want.script != null && want.script.equals(got.script, ignoreCase = true)) s += 2
-        return s
-    }
-
-    /** 在 header 里挑选“最优 locale 列” */
-    private fun pickLocaleColumn(headers: List<String>, locale: Locale): Int? {
-        val want = localeLR(locale)
-        var bestIdx: Int? = null
-        var bestScore = -1
-        headers.forEachIndexed { idx, raw ->
-            val lr = parseLR(raw)
-            val sc = score(want, lr)
-            if (sc > bestScore) {
-                bestScore = sc
-                bestIdx = idx
-                if (bestScore >= 7) return@forEachIndexed // 满分提前退出
-            }
-        }
-        return bestIdx
-    }
-
-    /** 合表 CSV:key,type,comment,<localeTag...> */
-    fun parseMerged(br: BufferedReader, locale: Locale): Map<String, I18nEntry> {
-        val headerRaw = br.readLine() ?: return emptyMap()
-        val header = parseLine(headerRaw.stripBom())
-        val idxKey = header.indexOfFirst { it.equals("key", true) }
-        val idxType = header.indexOfFirst { it.equals("type", true) }
-        if (idxKey < 0 || idxType < 0) return emptyMap()
-
-        val idxVal = pickLocaleColumn(header, locale)
-            ?: header.indexOfFirst { it.equals("value", true) || it.equals("text", true) }
-                .takeIf { it != -1 }
-            ?: run {
-                logger.warn("No locale column for ${locale.toLanguageTag()} in header=$header")
-                return emptyMap()
-            }
-
-        val map = LinkedHashMap<String, I18nEntry>(1024)
-        br.lineSequence().forEach { raw ->
-            if (raw.isBlank()) return@forEach
-            val cols = parseLine(raw)
-            val key = cols.getOrNull(idxKey)?.trim().orEmpty()
-            if (key.isEmpty()) return@forEach
-            val type = cols.getOrNull(idxType)?.trim()?.lowercase(Locale.ROOT).orEmpty()
-            val valCol = cols.getOrNull(idxVal).orEmpty()
-            when (type) {
-                "text" -> map[key] = I18nEntry(key, I18nType.TEXT, value = valCol)
-                "plural" -> map[key] = I18nEntry(key, I18nType.PLURAL, plurals = splitPairs(valCol))
-                "select" -> map[key] = I18nEntry(key, I18nType.SELECT, selects = splitPairs(valCol, true))
-            }
-        }
-        logger.info("Merged CSV loaded: ${map.size} keys (locale=${locale.toLanguageTag()}, chosenCol=${header.getOrNull(idxVal)})")
-        return map
-    }
-
-    /** 将 "one=xx|other=yy" 解析为 Map */
-    private fun splitPairs(raw: String, lowerKey: Boolean = false): Map<String, String> {
-        if (raw.isEmpty()) return emptyMap()
-        val out = LinkedHashMap<String, String>(4)
-        val seg = raw.split('|')
-        for (s in seg) {
-            val p = s.split('=', limit = 2)
-            if (p.size == 2) {
-                val k = if (lowerKey) p[0].trim().lowercase(Locale.ROOT) else p[0].trim()
-                out[k] = p[1]
-            }
-        }
-        return out
-    }
-}

+ 210 - 0
shared/src/main/java/com/grkj/shared/utils/i18n/util/JsonUtils.kt

@@ -0,0 +1,210 @@
+package com.grkj.shared.utils.i18n.util
+
+import com.grkj.shared.utils.i18n.I18nEntry
+import com.grkj.shared.utils.i18n.I18nType
+import org.json.JSONObject
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import java.io.BufferedReader
+import java.util.Locale
+
+/**
+ * 轻量 JSON 解析(取代 CsvUtils)
+ * - 单语:文件内容为 { key: I18nEntryLike }
+ * - 合表:文件内容为 { "<bcp47>": { key: I18nEntryLike }, ... },自动挑选最优 locale(lang/script/region)
+ *
+ * I18nEntryLike 形态:
+ *   TEXT  : {"type":"text","value":"..."}
+ *   PLURAL: {"type":"plural","plurals":{"one":"...","other":"..."}}   // 注意 key 区分大小写
+ *   SELECT: {"type":"select","selects":{"male":"...","female":"...","other":"..."}} // key 建议小写
+ */
+object JsonUtils {
+    private val logger: Logger = LoggerFactory.getLogger(JsonUtils::class.java)
+
+    // --------- 公共入口 ---------
+
+    /** 单语 JSON:{ key: I18nEntryLike } */
+    fun parseSingleLang(br: BufferedReader): Map<String, I18nEntry> {
+        val text = br.readTextNoBom()
+        if (text.isBlank()) return emptyMap()
+        val obj = JSONObject(text)
+        val out = LinkedHashMap<String, I18nEntry>(obj.length())
+
+        val names = obj.keys()
+        while (names.hasNext()) {
+            val key = names.next().trim()
+            if (key.isEmpty()) continue
+
+            val v = obj.opt(key)
+            val entry = when (v) {
+                is JSONObject -> jsonToEntry(key, v)
+                is String -> I18nEntry(key, I18nType.TEXT, value = v) // 兼容极简:value 直接是字符串
+                else -> null
+            }
+            if (entry != null) out[key] = entry
+        }
+        logger.info("Single JSON loaded: ${out.size} keys")
+        return out
+    }
+
+    /**
+     * 合表 JSON:{ "<bcp47>": { key: I18nEntryLike }, ... }
+     * 优先匹配 locale;若找不到匹配项,返回空 map。
+     */
+    fun parseMerged(br: BufferedReader, locale: Locale): Map<String, I18nEntry> {
+        val text = br.readTextNoBom()
+        if (text.isBlank()) return emptyMap()
+        val root = JSONObject(text)
+
+        if (root.length() == 0) return emptyMap()
+
+        // 1) 枚举所有顶层语言标签
+        val candidates = mutableListOf<String>()
+        val keys = root.keys()
+        while (keys.hasNext()) {
+            val tag = keys.next()
+            if (tag.isNullOrBlank()) continue
+            candidates += tag
+        }
+        if (candidates.isEmpty()) {
+            logger.warn("Merged JSON has no locale objects at top level")
+            return emptyMap()
+        }
+
+        // 2) 选择最佳 locale
+        val chosen = pickBestLocale(candidates, locale)
+        if (chosen == null) {
+            logger.warn("No compatible locale for ${locale.toLanguageTag()} in ${candidates.joinToString()}")
+            return emptyMap()
+        }
+
+        // 3) 解析该 locale 下的词条
+        val payload = root.optJSONObject(chosen) ?: return emptyMap()
+        val out = LinkedHashMap<String, I18nEntry>(payload.length())
+
+        val names = payload.keys()
+        while (names.hasNext()) {
+            val key = names.next().trim()
+            if (key.isEmpty()) continue
+            val v = payload.opt(key)
+            val entry = when (v) {
+                is JSONObject -> jsonToEntry(key, v)
+                is String -> I18nEntry(key, I18nType.TEXT, value = v)
+                else -> null
+            }
+            if (entry != null) out[key] = entry
+        }
+        logger.info("Merged JSON loaded: ${out.size} keys (locale=${locale.toLanguageTag()}, chosen=$chosen)")
+        return out
+    }
+
+    // --------- 私有工具 ---------
+
+    private fun BufferedReader.readTextNoBom(): String {
+        val sb = StringBuilder(16 * 1024)
+        var first = true
+        while (true) {
+            val line = this.readLine() ?: break
+            if (first) {
+                first = false
+                val s = line.removeBom()
+                sb.append(s)
+            } else {
+                sb.append('\n').append(line)
+            }
+        }
+        return sb.toString()
+    }
+
+    private fun String.removeBom(): String =
+        if (startsWith("\uFEFF")) substring(1) else this
+
+    private fun jsonToEntry(key: String, obj: JSONObject): I18nEntry? {
+        val type = obj.optString("type", "text").lowercase(Locale.ROOT)
+        return when (type) {
+            "text" -> {
+                val v = obj.optString("value", null)
+                I18nEntry(key, I18nType.TEXT, value = v)
+            }
+            "plural" -> {
+                val plurals = obj.optJSONObject("plurals")?.toMap() ?: emptyMap()
+                I18nEntry(key, I18nType.PLURAL, plurals = plurals)
+            }
+            "select" -> {
+                val selects = obj.optJSONObject("selects")?.toMap(lowerKey = true) ?: emptyMap()
+                I18nEntry(key, I18nType.SELECT, selects = selects)
+            }
+            else -> {
+                // 容错:如果没有 type,且有 value/plurals/selects 也能吃下
+                when {
+                    obj.has("value") -> I18nEntry(key, I18nType.TEXT, value = obj.optString("value"))
+                    obj.has("plurals") -> I18nEntry(key, I18nType.PLURAL, plurals = obj.optJSONObject("plurals")?.toMap() ?: emptyMap())
+                    obj.has("selects") -> I18nEntry(key, I18nType.SELECT, selects = obj.optJSONObject("selects")?.toMap(lowerKey = true) ?: emptyMap())
+                    else -> null
+                }
+            }
+        }
+    }
+
+    private fun JSONObject.toMap(lowerKey: Boolean = false): Map<String, String> {
+        val out = LinkedHashMap<String, String>(this.length())
+        val it = this.keys()
+        while (it.hasNext()) {
+            val kRaw = it.next()
+            val k = if (lowerKey) kRaw.lowercase(Locale.ROOT) else kRaw
+            out[k] = this.optString(kRaw, "")
+        }
+        return out
+    }
+
+    // ---- BCP-47 匹配 ----
+
+    private data class LR(val lang: String, val script: String?, val region: String?)
+
+    /** 解析 "zh-Hans-CN" / "en-US" / "zh_CN" → (lang, Script, REGION) */
+    private fun parseLR(tag: String): LR {
+        val p = tag.replace('_', '-').split('-').filter { it.isNotBlank() }
+        if (p.isEmpty()) return LR("", null, null)
+        val lang = p.first().lowercase(Locale.ROOT)
+        val script = p.firstOrNull { it.length == 4 && it.all { ch -> ch.isLetter() } }
+            ?.let { it.substring(0, 1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) }
+        val region = p.firstOrNull {
+            (it.length == 2 && it.all { ch -> ch.isLetter() }) || (it.length == 3 && it.all { ch -> ch.isDigit() })
+        }?.uppercase(Locale.ROOT)
+        return LR(lang, script, region)
+    }
+
+    private fun localeLR(locale: Locale): LR {
+        val lang = locale.language?.lowercase(Locale.ROOT).orEmpty()
+        val script = locale.script?.takeIf { it.isNotBlank() }
+            ?.let { it.substring(0, 1).uppercase(Locale.ROOT) + it.substring(1).lowercase(Locale.ROOT) }
+        val region = locale.country?.takeIf { it.isNotBlank() }?.uppercase(Locale.ROOT)
+        val lr = LR(lang, script, region)
+        return if (lr.lang.isEmpty() || (lr.script == null && lr.region == null)) parseLR(locale.toLanguageTag()) else lr
+    }
+
+    /** 评分:lang 必须一致;命中 region +4,命中 script +2,只有 lang +1;满分 7(lang+script+region) */
+    private fun score(want: LR, got: LR): Int {
+        if (want.lang != got.lang) return -1
+        var s = 1
+        if (want.region != null && want.region == got.region) s += 4
+        if (want.script != null && want.script.equals(got.script, ignoreCase = true)) s += 2
+        return s
+    }
+
+    private fun pickBestLocale(headers: List<String>, locale: Locale): String? {
+        val want = localeLR(locale)
+        var best: String? = null
+        var bestScore = -1
+        headers.forEach { raw ->
+            val lr = parseLR(raw)
+            val sc = score(want, lr)
+            if (sc > bestScore) {
+                bestScore = sc
+                best = raw
+                if (sc >= 7) return raw // 满分提前返回
+            }
+        }
+        return best
+    }
+}