i18n(chat): translate the chat send/receive toasts into all 8 languages
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) <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "Wähle eine Unterhaltung aus, um sie anzuzeigen.",
|
||||
"chat_send": "Senden",
|
||||
"chat_send_failed": "nicht gesendet",
|
||||
"chat_toast_compose_failed": "Nachricht konnte nicht erstellt werden (zu lang?).",
|
||||
"chat_toast_lite_busy": "Es wird bereits gesendet, oder es ist keine Wallet geöffnet.",
|
||||
"chat_toast_no_zaddr": "Keine z-Adresse verfügbar, um den Chat zu senden.",
|
||||
"chat_toast_not_connected": "Nicht verbunden – Nachricht nicht gesendet.",
|
||||
"chat_toast_request_compose_failed": "Kontaktanfrage konnte nicht erstellt werden (ungültige Adresse / ungültiger Text?).",
|
||||
"chat_toast_request_queued": "Kontaktanfrage in Warteschlange.",
|
||||
"chat_toast_waiting_reply": "Warte auf die Antwort des Kontakts, bevor du ihm schreiben kannst.",
|
||||
"chat_waiting_reply": "Warte auf die Antwort dieses Kontakts – sobald er antwortet, kannst du ihm schreiben.",
|
||||
"chat_you": "Du",
|
||||
"choose_icon": "Symbol wählen",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "Selecciona una conversación para verla.",
|
||||
"chat_send": "Enviar",
|
||||
"chat_send_failed": "no enviado",
|
||||
"chat_toast_compose_failed": "No se pudo componer el mensaje (¿demasiado largo?).",
|
||||
"chat_toast_lite_busy": "Ya hay un envío en curso, o no hay ningún monedero abierto.",
|
||||
"chat_toast_no_zaddr": "No hay ninguna dirección z disponible desde la que enviar el chat.",
|
||||
"chat_toast_not_connected": "Sin conexión: mensaje de chat no enviado.",
|
||||
"chat_toast_request_compose_failed": "No se pudo componer la solicitud de contacto (¿dirección o texto no válidos?).",
|
||||
"chat_toast_request_queued": "Solicitud de contacto en cola.",
|
||||
"chat_toast_waiting_reply": "Espera a que este contacto responda antes de poder escribirle.",
|
||||
"chat_waiting_reply": "Esperando a que este contacto responda: podrás escribirle una vez lo haga.",
|
||||
"chat_you": "Tú",
|
||||
"choose_icon": "Elegir Icono",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "Sélectionnez une conversation pour l'afficher.",
|
||||
"chat_send": "Envoyer",
|
||||
"chat_send_failed": "non envoyé",
|
||||
"chat_toast_compose_failed": "Impossible de composer le message (trop long ?).",
|
||||
"chat_toast_lite_busy": "Un envoi est déjà en cours, ou aucun portefeuille n'est ouvert.",
|
||||
"chat_toast_no_zaddr": "Aucune adresse Z disponible pour envoyer le message.",
|
||||
"chat_toast_not_connected": "Non connecté — message non envoyé.",
|
||||
"chat_toast_request_compose_failed": "Impossible de composer la demande de contact (adresse / texte invalide ?).",
|
||||
"chat_toast_request_queued": "Demande de contact mise en file d'attente.",
|
||||
"chat_toast_waiting_reply": "En attente de la réponse de ce contact avant de pouvoir lui écrire.",
|
||||
"chat_waiting_reply": "En attente de la réponse de ce contact — vous pourrez lui écrire dès qu'il aura répondu.",
|
||||
"chat_you": "Vous",
|
||||
"choose_icon": "Choisir une icône",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "表示する会話を選択してください。",
|
||||
"chat_send": "送信",
|
||||
"chat_send_failed": "未送信",
|
||||
"chat_toast_compose_failed": "メッセージを作成できませんでした(長すぎませんか?)。",
|
||||
"chat_toast_lite_busy": "すでに送信処理が進行中か、ウォレットが開かれていません。",
|
||||
"chat_toast_no_zaddr": "送信元に使えるZアドレスがありません。",
|
||||
"chat_toast_not_connected": "未接続 — チャットメッセージは送信されませんでした。",
|
||||
"chat_toast_request_compose_failed": "連絡リクエストを作成できませんでした(アドレスまたはテキストが無効?)。",
|
||||
"chat_toast_request_queued": "連絡リクエストを送信待ちに追加しました。",
|
||||
"chat_toast_waiting_reply": "メッセージを送るには、この相手からの返信を待つ必要があります。",
|
||||
"chat_waiting_reply": "この相手からの返信を待っています — 返信があればメッセージを送れます。",
|
||||
"chat_you": "自分",
|
||||
"choose_icon": "アイコンを選択",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "볼 대화를 선택하세요.",
|
||||
"chat_send": "전송",
|
||||
"chat_send_failed": "전송 안 됨",
|
||||
"chat_toast_compose_failed": "메시지를 작성할 수 없습니다 (너무 긴가요?).",
|
||||
"chat_toast_lite_busy": "이미 전송이 진행 중이거나 열린 지갑이 없습니다.",
|
||||
"chat_toast_no_zaddr": "채팅을 보낼 z-주소가 없습니다.",
|
||||
"chat_toast_not_connected": "연결되지 않음 — 채팅 메시지가 전송되지 않았습니다.",
|
||||
"chat_toast_request_compose_failed": "연락 요청을 작성할 수 없습니다 (잘못된 주소 / 텍스트?).",
|
||||
"chat_toast_request_queued": "연락 요청이 대기열에 추가되었습니다.",
|
||||
"chat_toast_waiting_reply": "상대방이 답장해야 메시지를 보낼 수 있습니다.",
|
||||
"chat_waiting_reply": "상대방의 답장을 기다리는 중입니다 — 답장하면 메시지를 보낼 수 있습니다.",
|
||||
"chat_you": "나",
|
||||
"choose_icon": "아이콘 선택",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "Selecione uma conversa para visualizá-la.",
|
||||
"chat_send": "Enviar",
|
||||
"chat_send_failed": "não enviada",
|
||||
"chat_toast_compose_failed": "Não foi possível compor a mensagem (muito longa?).",
|
||||
"chat_toast_lite_busy": "Já há um envio em andamento, ou nenhuma carteira está aberta.",
|
||||
"chat_toast_no_zaddr": "Nenhum endereço-z disponível para enviar o chat.",
|
||||
"chat_toast_not_connected": "Não conectado — mensagem de chat não enviada.",
|
||||
"chat_toast_request_compose_failed": "Não foi possível compor a solicitação de contato (endereço / texto inválido?).",
|
||||
"chat_toast_request_queued": "Solicitação de contato na fila.",
|
||||
"chat_toast_waiting_reply": "Aguardando a resposta do contato antes que você possa enviar mensagens a ele.",
|
||||
"chat_waiting_reply": "Aguardando a resposta deste contato — você poderá enviar mensagens assim que ele responder.",
|
||||
"chat_you": "Você",
|
||||
"choose_icon": "Escolher Ícone",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "Выберите переписку для просмотра.",
|
||||
"chat_send": "Отправить",
|
||||
"chat_send_failed": "не отправлено",
|
||||
"chat_toast_compose_failed": "Не удалось составить сообщение (слишком длинное?).",
|
||||
"chat_toast_lite_busy": "Отправка уже выполняется, или кошелёк не открыт.",
|
||||
"chat_toast_no_zaddr": "Нет доступного Z-адреса для отправки сообщений.",
|
||||
"chat_toast_not_connected": "Нет подключения — сообщение не отправлено.",
|
||||
"chat_toast_request_compose_failed": "Не удалось составить запрос контакта (неверный адрес / текст?).",
|
||||
"chat_toast_request_queued": "Запрос контакта поставлен в очередь.",
|
||||
"chat_toast_waiting_reply": "Ожидание ответа от контакта — вы сможете писать ему только после этого.",
|
||||
"chat_waiting_reply": "Ожидание ответа от контакта — вы сможете писать ему, как только он ответит.",
|
||||
"chat_you": "Вы",
|
||||
"choose_icon": "Выбрать иконку",
|
||||
|
||||
@@ -123,6 +123,13 @@
|
||||
"chat_select_hint": "选择一个对话以查看。",
|
||||
"chat_send": "发送",
|
||||
"chat_send_failed": "未发送",
|
||||
"chat_toast_compose_failed": "无法编写该消息(内容过长?)。",
|
||||
"chat_toast_lite_busy": "已有发送正在进行中,或未打开任何钱包。",
|
||||
"chat_toast_no_zaddr": "没有可用于发送聊天的 z 地址。",
|
||||
"chat_toast_not_connected": "未连接——聊天消息未发送。",
|
||||
"chat_toast_request_compose_failed": "无法编写联系人请求(地址或文本无效?)。",
|
||||
"chat_toast_request_queued": "联系人请求已排队。",
|
||||
"chat_toast_waiting_reply": "等待该联系人回复——对方回复后您即可向其发送消息。",
|
||||
"chat_waiting_reply": "等待该联系人回复——对方回复后您即可向其发送消息。",
|
||||
"chat_you": "我",
|
||||
"choose_icon": "选择图标",
|
||||
|
||||
@@ -2543,12 +2543,12 @@ bool App::broadcastChatMemos(const chat::OutgoingChatMemos& memos)
|
||||
}
|
||||
|
||||
if (!state_.connected || !rpc_ || !worker_) {
|
||||
ui::Notifications::instance().error("Not connected — chat message not sent.");
|
||||
ui::Notifications::instance().error(TR("chat_toast_not_connected"));
|
||||
return false;
|
||||
}
|
||||
const std::string from = chatReplyZaddr(); // spendable + advertised as the reply-to address
|
||||
if (from.empty()) {
|
||||
ui::Notifications::instance().error("No spendable z-address to send chat from.");
|
||||
ui::Notifications::instance().error(TR("chat_toast_no_zaddr"));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2588,7 +2588,7 @@ bool App::broadcastChatMemosLite(const chat::OutgoingChatMemos& memos)
|
||||
req.recipients.push_back(std::move(recipient));
|
||||
}
|
||||
if (!lite_wallet_->sendTransaction(req)) {
|
||||
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
|
||||
|
||||
@@ -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?";
|
||||
|
||||
Reference in New Issue
Block a user