From b75801f5c4b61bee522341b4e4fb039c0460f4d6 Mon Sep 17 00:00:00 2001 From: DanS Date: Mon, 6 Jul 2026 23:36:56 -0500 Subject: [PATCH] i18n(chat): translate the chat send/receive toasts into all 8 languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The HushChat UI labels were already translated, but the send-path notifications (not-connected, no-z-address, waiting-for-reply, compose failures, contact-request queued, lite busy) were still hardcoded English. Route all eight call sites in app_network.cpp through TR() with seven new keys (the three "no z-address" variants unified into chat_toast_no_zaddr), add the English fallbacks in i18n.cpp, and translate the keys into de/es/fr/ ja/ko/pt/ru/zh — reusing each file's existing chat_* terminology (z-address, contact request, message) for consistency. Additive only (950 -> 957 keys per language). CJK subset font rebuilt to cover the new zh/ja/ko glyphs. Co-Authored-By: Claude Opus 4.8 (1M context) --- res/fonts/NotoSansCJK-Subset.ttf | Bin 520548 -> 522576 bytes res/lang/de.json | 7 +++++++ res/lang/es.json | 7 +++++++ res/lang/fr.json | 7 +++++++ res/lang/ja.json | 7 +++++++ res/lang/ko.json | 7 +++++++ res/lang/pt.json | 7 +++++++ res/lang/ru.json | 7 +++++++ res/lang/zh.json | 7 +++++++ src/app_network.cpp | 18 +++++++++--------- src/util/i18n.cpp | 7 +++++++ 11 files changed, 72 insertions(+), 9 deletions(-) diff --git a/res/fonts/NotoSansCJK-Subset.ttf b/res/fonts/NotoSansCJK-Subset.ttf index 0a4b888967260d62fc912222e0e217e6528963f9..e24cba4799d492ec1d42ba19829d2358a6ee274e 100644 GIT binary patch delta 21098 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 { - ui::Notifications::instance().error("A send is already in progress, or no wallet is open."); + ui::Notifications::instance().error(TR("chat_toast_lite_busy")); return false; } return true; @@ -2607,19 +2607,19 @@ void App::sendChatMessage(const std::string& conversationId, const std::string& if (!m.peer_public_key_hex.empty()) peerPubKey = m.peer_public_key_hex; } if (peerPubKey.empty()) { - ui::Notifications::instance().info("Waiting for the contact to reply before you can message them."); + ui::Notifications::instance().info(TR("chat_toast_waiting_reply")); return; } const std::string myReply = chatReplyZaddr(); if (myReply.empty()) { - ui::Notifications::instance().error("No z-address available to send chat from."); + ui::Notifications::instance().error(TR("chat_toast_no_zaddr")); return; } chat::OutgoingChatMemos memos; if (chat_service_.composeMessage(myReply, peerPubKey, peerZaddr, conversationId, text, memos) != chat::ChatComposeStatus::Ok) { - ui::Notifications::instance().error("Could not compose the message (too long?)."); + ui::Notifications::instance().error(TR("chat_toast_compose_failed")); return; } const bool submitted = broadcastChatMemos(memos); @@ -2644,7 +2644,7 @@ void App::startChatConversation(const std::string& peerZaddr, const std::string& if (peerZaddr.empty() || text.empty()) return; const std::string myReply = chatReplyZaddr(); if (myReply.empty()) { - ui::Notifications::instance().error("No z-address available to send chat from."); + ui::Notifications::instance().error(TR("chat_toast_no_zaddr")); return; } @@ -2652,7 +2652,7 @@ void App::startChatConversation(const std::string& peerZaddr, const std::string& chat::OutgoingChatMemos memos; if (chat_service_.composeContactRequest(myReply, peerZaddr, cid, text, memos) != chat::ChatComposeStatus::Ok) { - ui::Notifications::instance().error("Could not compose the contact request (invalid address / text?)."); + ui::Notifications::instance().error(TR("chat_toast_request_compose_failed")); return; } const bool submitted = broadcastChatMemos(memos); @@ -2668,7 +2668,7 @@ void App::startChatConversation(const std::string& peerZaddr, const std::string& echo.payload_position = 0; echo.delivery = submitted ? chat::ChatDelivery::Sent : chat::ChatDelivery::Failed; chat_service_.recordOutgoing(echo); - if (submitted) ui::Notifications::instance().success("Contact request queued."); + if (submitted) ui::Notifications::instance().success(TR("chat_toast_request_queued")); } // HushChat (lite variant): the full-node harvest works off z_viewtransaction, but the lite wallet's diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index 078bdfa..90f7906 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -226,6 +226,13 @@ void I18n::loadBuiltinEnglish() strings_["chat_new_message"] = "Message"; strings_["chat_new_send"] = "Send request"; strings_["chat_cancel"] = "Cancel"; + strings_["chat_toast_not_connected"] = "Not connected — chat message not sent."; + strings_["chat_toast_no_zaddr"] = "No z-address available to send chat from."; + strings_["chat_toast_lite_busy"] = "A send is already in progress, or no wallet is open."; + strings_["chat_toast_waiting_reply"] = "Waiting for the contact to reply before you can message them."; + strings_["chat_toast_compose_failed"] = "Could not compose the message (too long?)."; + strings_["chat_toast_request_compose_failed"] = "Could not compose the contact request (invalid address / text?)."; + strings_["chat_toast_request_queued"] = "Contact request queued."; strings_["contacts_search_placeholder"] = "Search contacts..."; strings_["contacts_search_no_match"] = "No matching contacts"; strings_["address_book_confirm_delete"] = "Confirm delete?";