[[ t('exp_page_hint') ]]
[[ t('btn_add_expense') ]]
[[ t('exp_add_row_hint') ]]
[[ t('exp_all_categories_added') ]]
[[ t('exp_entry_flow_hint') ]]
[[ expCategoryTitle(row.category) ]]
[[ expCategoryDesc(row.category) ]]
[[ t('exp_remove_line') ]]
[[ t('exp_total') ]]: ¥[[ formatMoney(expTotal) ]]
[[ t('btn_save') ]]
[[ t('alert_select_proj_month') ]]
[[ t('card_exp_history') ]]
[[ expCategoryTitle(row.category) ]]
¥[[ formatMoney(row.amount) ]]
[[ t('empty_no_data') ]]
[[ t('proj_list_title') ]]
[[ filteredProjects.length ]]
[[ row.name || '—' ]]
[[ t('proj_row_selected') ]]
[[ row.code ]]
·
[[ row.start_date ]]
—
[[ trPhase(row.phase) ]]
[[ t('proj_active') ]]
[[ t('proj_completed') ]]
[[ t('proj_paused') ]]
D [[ milestoneDelayText(row.demo_delay_days) ]]
R [[ milestoneDelayText(row.release_delay_days) ]]
—
[[ t('btn_edit') ]]
[[ t('btn_delete') ]]
[[ projDetailTitle ]]
[[ projParticipants.length ]]
[[ t('btn_add_project_member') ]]
[[ t('proj_detail_empty') ]]
[[ t('proj_detail_empty_hint') ]]
[[ ms.label ]]
[[ ms.planned ]]
→
[[ ms.actual || '—' ]]
[[ milestoneDelayText(ms.delay) ]]
[[ (row.employee_name != null && String(row.employee_name).trim()) ? row.employee_name : (row.name != null && String(row.name).trim() ? row.name : '—') ]]
[[ row.employee_role != null && String(row.employee_role).trim() ? trRole(row.employee_role) : (row.role != null && String(row.role).trim() ? trRole(row.role) : '—') ]]
[[ (row.member_status || row.status)==='active' ? t('status_active') : t('status_inactive') ]]
[[ row.participation_start || '—' ]]
[[ row.participation_end ]]
[[ t('proj_participation_ongoing') ]]
[[ t('btn_edit') ]]
[[ t('btn_remove_member') ]]