i18n(wizard): translate the first-run wizard (was all hardcoded English)

The first-run wizard predated the i18n system — every label, button, and help
line was hardcoded English. Route them all through TR():

- 62 literals in app_wizard.cpp replaced with TR(). Where a wizard string is a
  parallel of existing content, it reuses the existing key (the whole bootstrap_*
  family, plus theme / language / balance_layout / low_spec_mode / ui_opacity /
  console_scanline / download / retry / cancel) so it inherits their translations
  and stays consistent with Settings. Button labels drop their ##id suffix and use
  TR(key) directly (the app's established TactileButton(TR(...)) pattern; the
  wizard's phase buttons never share a frame, so no id collision).
- 55 new wiz_* English keys in i18n.cpp for the wizard-specific strings, and their
  translations back-filled across all 8 languages (es/de/fr/pt/ru/zh/ja/ko);
  format specifiers (%s, %zu) and newlines preserved. CJK subset rebuilt.

Verified on the sweep: English renders with correct labels in place (all keys
resolve), and a German run shows the reused + new keys translated end-to-end
(Darstellung / Acryl-Glaseffekte / Verschlüsseln & Weiter …).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 01:41:18 -05:00
parent 758ea06ab7
commit 09e0b962c3
11 changed files with 581 additions and 84 deletions

View File

@@ -464,6 +464,63 @@ void I18n::loadBuiltinEnglish()
strings_["tt_reduce_motion"] = "Disable animated transitions and balance lerp for accessibility";
strings_["ago"] = "ago";
strings_["wizard_daemon_start_failed"] = "Failed to start daemon \xe2\x80\x94 it will be retried automatically";
// First-run wizard (app_wizard.cpp). Bootstrap/appearance labels reuse existing keys; these are
// the wizard-specific strings.
strings_["wiz_welcome_title"] = "Welcome to ObsidianDragon!";
strings_["wiz_welcome_sub"] = "A few quick choices and your full node is ready.";
strings_["wiz_step1"] = "Step 1";
strings_["wiz_step2"] = "Step 2";
strings_["wiz_step3"] = "Step 3";
strings_["wiz_appearance"] = "Appearance";
strings_["wiz_theme_builtin"] = "Built-in";
strings_["wiz_theme_custom"] = "Custom";
strings_["wiz_theme_invalid"] = " (invalid)";
strings_["wiz_lowspec_desc"] = "Disable all heavy visual effects";
strings_["wiz_acrylic"] = "Acrylic glass effects";
strings_["wiz_acrylic_desc"] = "Translucent blur on panels (Off disables)";
strings_["wiz_level"] = "Level:";
strings_["wiz_off"] = "Off";
strings_["wiz_theme_effects"] = "Theme visual effects";
strings_["wiz_theme_effects_desc"] = "Animated borders, color wash";
strings_["wiz_ui_opacity_desc"] = "Card & sidebar transparency (1.0 = solid)";
strings_["wiz_scanline_desc"] = "CRT scanline effect in console";
strings_["wiz_bootstrap"] = "Bootstrap";
strings_["wiz_bootstrap_desc"] = "Download a blockchain bootstrap to dramatically speed up initial sync.\n\nYour existing wallet.dat will NOT be modified or replaced.";
strings_["wiz_skip"] = "Skip";
strings_["wiz_bootstrap_failed"] = "Bootstrap failed";
strings_["wiz_download_failed"] = "Download Failed";
strings_["wiz_ext_daemon_running"] = "External daemon running";
strings_["wiz_ext_daemon_warning"] = "It must be stopped before downloading a bootstrap, otherwise chain data could be corrupted.";
strings_["wiz_stop_daemon"] = "Stop Daemon";
strings_["wiz_daemon_sending_stop"] = "Sending stop command...";
strings_["wiz_daemon_waiting_stop"] = "Waiting for daemon to shut down...";
strings_["wiz_daemon_stopped_ok"] = "Daemon stopped.";
strings_["wiz_daemon_stop_failed"] = "Daemon did not stop \xe2\x80\x94 try manually.";
strings_["wiz_encryption"] = "Encryption";
strings_["wiz_pin_title"] = "Quick-Unlock PIN";
strings_["wiz_already_encrypted"] = "Wallet is already encrypted";
strings_["wiz_already_encrypted_desc"] = "Your wallet is protected with a passphrase. No further action is needed.";
strings_["wiz_continue"] = "Continue";
strings_["wiz_encrypt_desc"] = "Encrypt your wallet to protect private keys with a passphrase.";
strings_["wiz_encrypt_warning"] = "If you lose your passphrase, you lose access to your funds.";
strings_["wiz_passphrase"] = "Passphrase:";
strings_["wiz_confirm"] = "Confirm:";
strings_["wiz_strength_weak"] = "Weak";
strings_["wiz_strength_fair"] = "Fair";
strings_["wiz_strength_good"] = "Good";
strings_["wiz_strength_strong"] = "Strong";
strings_["wiz_strength"] = "Strength: %s";
strings_["wiz_pass_too_short"] = "Passphrase must be at least 8 characters (%zu/8)";
strings_["wiz_pass_mismatch"] = "Passphrases do not match";
strings_["wiz_pass_spaces"] = "Passphrase has leading/trailing spaces \xe2\x80\x94 remove them";
strings_["wiz_encrypt_continue"] = "Encrypt & Continue";
strings_["wiz_encrypt_bg"] = "Encryption will complete in the background";
strings_["wiz_skip_confirm"] = "Continue WITHOUT encryption? Keys will be stored unencrypted \xe2\x80\x94 click Skip again to confirm.";
strings_["wiz_pin_optional"] = "Quick-Unlock PIN (optional)";
strings_["wiz_pin_label"] = "PIN (4-8 digits):";
strings_["wiz_pin_confirm"] = "Confirm PIN:";
strings_["wiz_pin_invalid"] = "PIN must be 4-8 digits";
strings_["wiz_pin_mismatch"] = "PINs do not match";
strings_["settings_data_dir"] = "Data Dir:";
strings_["settings_wallet_size_label"] = "Wallet Size:";
strings_["settings_debug_changed"] = "Debug categories changed \xe2\x80\x94 restart daemon to apply";