feat: comprehensive i18n coverage — all static text + auto-translate toasts
CI / lint (push) Failing after 18s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 9s

Locale files expanded to 300+ keys covering all sections:
- Header menu, sidebar, search, viewer, editor, AI toolbar
- Config modal (all sections), help modal, dashboard, graph, mermaid
- Context menus, offline UI, palette, auth, shares, backups
- All toasts and confirmations

Automatic data-i18n tagging in index.html (177 attributes)
via Python script — handles all user-facing static text nodes.
Zero concatenation errors verified.

i18n.js: added tr() reverse-lookup function
(French text → key → current locale translation)

ui.js: showToast() now auto-translates via tr()
— all 24 existing toast call sites benefit automatically
This commit is contained in:
2026-06-18 14:01:37 -04:00
parent f85482214e
commit f91a386566
5 changed files with 774 additions and 198 deletions
+24
View File
@@ -51,6 +51,30 @@ export function t(key, params) {
return s;
}
// ── Reverse-lookup cache (French text → key) ────────────────────────────
let _reverseCache = null;
function _buildReverseCache() {
_reverseCache = {};
for (const [k, v] of Object.entries(_fallbackStrings)) {
if (k.startsWith('_')) continue;
// Prefer shorter keys when multiple keys map to the same French text
if (!_reverseCache[v] || k.length < _reverseCache[v].length) {
_reverseCache[v] = k;
}
}
}
/** Translate a French string to the current locale by reverse lookup.
* "Paramètres client sauvegardés" → fr: same, en: "Client settings saved".
* If the string is not found in the FR locale, returns it unchanged. */
export function tr(frenchText) {
if (!frenchText || _currentLocale === 'fr') return frenchText;
if (!_reverseCache) _buildReverseCache();
var key = _reverseCache[frenchText];
return key ? t(key) : frenchText;
}
/** Change locale and re-translate the entire DOM.
* Persists to localStorage. */
export async function setLocale(locale) {