feat: phase 2 — i18n messages EN/FR (--lang, AM_LANG/LANG, catalogue tr/tr_fmt, REPL lang) (closes #74)

This commit is contained in:
2026-08-18 15:46:51 -04:00
parent 4c7866a25a
commit 7f4d74f811
19 changed files with 852 additions and 47 deletions
+27 -7
View File
@@ -119,12 +119,25 @@ pub fn report_md(app: &App, days: u32) -> String {
}
let sessions = crate::sessions::load(app).map(|s| s.sessions.len()).unwrap_or(0);
let top_rows = top(app, None).unwrap_or_default();
let mut md = format!(
"# Rapport agent-manager — {days} derniers jours\n\n- Lancements : {total_launches}\n- Échecs : {failures}\n- Changements (install/update/uninstall) : {changes}\n- Durée cumulée : {}s\n- Sessions enregistrées : {sessions}\n",
duration
);
// Issue #74: the report follows the active language.
let md = if app.lang().is_en() {
format!(
"# agent-manager report — last {days} days\n\n- Launches: {total_launches}\n- Failures: {failures}\n- Changes (install/update/uninstall): {changes}\n- Cumulative duration: {}s\n- Recorded sessions: {sessions}\n",
duration
)
} else {
format!(
"# Rapport agent-manager — {days} derniers jours\n\n- Lancements : {total_launches}\n- Échecs : {failures}\n- Changements (install/update/uninstall) : {changes}\n- Durée cumulée : {}s\n- Sessions enregistrées : {sessions}\n",
duration
)
};
let mut md = md;
if !top_rows.is_empty() {
md.push_str("\n## Top agents\n\n| Agent | Lancements | Durée | Échecs |\n|---|---|---|---|\n");
md.push_str(if app.lang().is_en() {
"\n## Top agents\n\n| Agent | Launches | Duration | Failures |\n|---|---|---|---|\n"
} else {
"\n## Top agents\n\n| Agent | Lancements | Durée | Échecs |\n|---|---|---|---|\n"
});
for r in &top_rows {
md.push_str(&format!(
"| {} | {} | {}s | {} |\n",
@@ -137,8 +150,15 @@ pub fn report_md(app: &App, days: u32) -> String {
if !rows.is_empty() {
let t = crate::costs::totals(&rows);
md.push_str(&format!(
"\n## Coûts estimés\n\n- Sessions facturées : {}\n- Tokens : {} in / {} out\n- Coût estimé : ${:.4}\n",
t.sessions, t.tokens_in, t.tokens_out, t.cost_usd
"{}\n\n- {}: {}\n- {}: {} in / {} out\n- {}: ${:.4}\n",
if app.lang().is_en() { "\n## Estimated costs" } else { "\n## Coûts estimés" },
if app.lang().is_en() { "Billed sessions" } else { "Sessions facturées" },
t.sessions,
if app.lang().is_en() { "Tokens" } else { "Tokens" },
t.tokens_in,
t.tokens_out,
if app.lang().is_en() { "Estimated cost" } else { "Coût estimé" },
t.cost_usd
));
}
}