i18n(chat): translate chat note-buffer status strings (8 languages)

The status-bar chat-buffer indicator was hardcoded English. Add semantic keys
(chat_buffer_sending[_one]/preparing/loading/ready) to the English source and
route chatBufferStatusText() through TR()+snprintf like the other counted
strings — a singular/plural pair for the send count, %d/%d for the buffer
fill. Translate all five into de/es/fr/ja/ko/pt/ru/zh (additive JSON edits,
format specifiers preserved so the runtime overlay accepts them), and rebuild
the CJK subset font for the two new glyphs (버퍼's 퍼 U+D37C, 缓冲's 冲 U+51B2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-20 22:22:59 -05:00
parent b0a4333cdf
commit c68889d276
11 changed files with 60 additions and 7 deletions

Binary file not shown.

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "Minimal", "chat_bubble_minimal": "Minimal",
"chat_bubble_rounded": "Abgerundet", "chat_bubble_rounded": "Abgerundet",
"chat_bubble_square": "Eckig", "chat_bubble_square": "Eckig",
"chat_buffer_loading": "Chat-Puffer: …",
"chat_buffer_preparing": "Chat-Puffer: bereite %d/%d vor…",
"chat_buffer_ready": "Chat-Puffer: %d/%d bereit",
"chat_buffer_sending": "Chat: sende %d Nachrichten…",
"chat_buffer_sending_one": "Chat: sende %d Nachricht…",
"chat_cancel": "Abbrechen", "chat_cancel": "Abbrechen",
"chat_contact_added": "Kontakt hinzugefügt benenne ihn in Kontakte um", "chat_contact_added": "Kontakt hinzugefügt benenne ihn in Kontakte um",
"chat_contact_request": "kontaktanfrage", "chat_contact_request": "kontaktanfrage",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "Mínima", "chat_bubble_minimal": "Mínima",
"chat_bubble_rounded": "Redondeada", "chat_bubble_rounded": "Redondeada",
"chat_bubble_square": "Cuadrada", "chat_bubble_square": "Cuadrada",
"chat_buffer_loading": "Búfer de chat: …",
"chat_buffer_preparing": "Búfer de chat: preparando %d/%d…",
"chat_buffer_ready": "Búfer de chat: %d/%d listos",
"chat_buffer_sending": "Chat: enviando %d mensajes…",
"chat_buffer_sending_one": "Chat: enviando %d mensaje…",
"chat_cancel": "Cancelar", "chat_cancel": "Cancelar",
"chat_contact_added": "Contacto añadido: renómbralo en Contactos", "chat_contact_added": "Contacto añadido: renómbralo en Contactos",
"chat_contact_request": "solicitud de contacto", "chat_contact_request": "solicitud de contacto",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "Minimale", "chat_bubble_minimal": "Minimale",
"chat_bubble_rounded": "Arrondie", "chat_bubble_rounded": "Arrondie",
"chat_bubble_square": "Carrée", "chat_bubble_square": "Carrée",
"chat_buffer_loading": "Tampon de chat: …",
"chat_buffer_preparing": "Tampon de chat: préparation %d/%d…",
"chat_buffer_ready": "Tampon de chat: %d/%d prêts",
"chat_buffer_sending": "Chat: envoi de %d messages…",
"chat_buffer_sending_one": "Chat: envoi de %d message…",
"chat_cancel": "Annuler", "chat_cancel": "Annuler",
"chat_contact_added": "Contact ajouté — renommez-le dans Contacts", "chat_contact_added": "Contact ajouté — renommez-le dans Contacts",
"chat_contact_request": "demande de contact", "chat_contact_request": "demande de contact",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "ミニマル", "chat_bubble_minimal": "ミニマル",
"chat_bubble_rounded": "角丸", "chat_bubble_rounded": "角丸",
"chat_bubble_square": "角ばった", "chat_bubble_square": "角ばった",
"chat_buffer_loading": "チャットバッファ:…",
"chat_buffer_preparing": "チャットバッファ:%d/%d を準備中…",
"chat_buffer_ready": "チャットバッファ:%d/%d 準備完了",
"chat_buffer_sending": "チャット:%d 件のメッセージを送信中…",
"chat_buffer_sending_one": "チャット:%d 件のメッセージを送信中…",
"chat_cancel": "キャンセル", "chat_cancel": "キャンセル",
"chat_contact_added": "連絡先を追加しました — 連絡先で名前を変更できます", "chat_contact_added": "連絡先を追加しました — 連絡先で名前を変更できます",
"chat_contact_request": "連絡リクエスト", "chat_contact_request": "連絡リクエスト",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "미니멀", "chat_bubble_minimal": "미니멀",
"chat_bubble_rounded": "둥근", "chat_bubble_rounded": "둥근",
"chat_bubble_square": "각진", "chat_bubble_square": "각진",
"chat_buffer_loading": "채팅 버퍼: …",
"chat_buffer_preparing": "채팅 버퍼: %d/%d 준비 중…",
"chat_buffer_ready": "채팅 버퍼: %d/%d 준비됨",
"chat_buffer_sending": "채팅: 메시지 %d개 보내는 중…",
"chat_buffer_sending_one": "채팅: 메시지 %d개 보내는 중…",
"chat_cancel": "취소", "chat_cancel": "취소",
"chat_contact_added": "연락처 추가됨 — 연락처에서 이름을 변경하세요", "chat_contact_added": "연락처 추가됨 — 연락처에서 이름을 변경하세요",
"chat_contact_request": "연락 요청", "chat_contact_request": "연락 요청",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "Mínimo", "chat_bubble_minimal": "Mínimo",
"chat_bubble_rounded": "Arredondado", "chat_bubble_rounded": "Arredondado",
"chat_bubble_square": "Quadrado", "chat_bubble_square": "Quadrado",
"chat_buffer_loading": "Buffer de chat: …",
"chat_buffer_preparing": "Buffer de chat: preparando %d/%d…",
"chat_buffer_ready": "Buffer de chat: %d/%d prontos",
"chat_buffer_sending": "Chat: enviando %d mensagens…",
"chat_buffer_sending_one": "Chat: enviando %d mensagem…",
"chat_cancel": "Cancelar", "chat_cancel": "Cancelar",
"chat_contact_added": "Contato adicionado — renomeie em Contatos", "chat_contact_added": "Contato adicionado — renomeie em Contatos",
"chat_contact_request": "solicitação de contato", "chat_contact_request": "solicitação de contato",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "Минимальный", "chat_bubble_minimal": "Минимальный",
"chat_bubble_rounded": "Скруглённый", "chat_bubble_rounded": "Скруглённый",
"chat_bubble_square": "Прямоугольный", "chat_bubble_square": "Прямоугольный",
"chat_buffer_loading": "Буфер чата: …",
"chat_buffer_preparing": "Буфер чата: подготовка %d/%d…",
"chat_buffer_ready": "Буфер чата: %d/%d готово",
"chat_buffer_sending": "Чат: отправка %d сообщений…",
"chat_buffer_sending_one": "Чат: отправка %d сообщения…",
"chat_cancel": "Отмена", "chat_cancel": "Отмена",
"chat_contact_added": "Контакт добавлен — переименуйте его в Контактах", "chat_contact_added": "Контакт добавлен — переименуйте его в Контактах",
"chat_contact_request": "запрос контакта", "chat_contact_request": "запрос контакта",

View File

@@ -146,6 +146,11 @@
"chat_bubble_minimal": "极简", "chat_bubble_minimal": "极简",
"chat_bubble_rounded": "圆角", "chat_bubble_rounded": "圆角",
"chat_bubble_square": "方形", "chat_bubble_square": "方形",
"chat_buffer_loading": "聊天缓冲:…",
"chat_buffer_preparing": "聊天缓冲:正在准备 %d/%d…",
"chat_buffer_ready": "聊天缓冲:%d/%d 已就绪",
"chat_buffer_sending": "聊天:正在发送 %d 条消息…",
"chat_buffer_sending_one": "聊天:正在发送 %d 条消息…",
"chat_cancel": "取消", "chat_cancel": "取消",
"chat_contact_added": "已添加联系人——可在联系人中重命名", "chat_contact_added": "已添加联系人——可在联系人中重命名",
"chat_contact_request": "联系人请求", "chat_contact_request": "联系人请求",

View File

@@ -3177,14 +3177,20 @@ std::string App::chatBufferStatusText() {
if (!chat::hushChatFeatureEnabledAtBuild() || !chat_service_.hasIdentity()) return ""; if (!chat::hushChatFeatureEnabledAtBuild() || !chat_service_.hasIdentity()) return "";
const int queued = static_cast<int>(chat_send_queue_.size()); const int queued = static_cast<int>(chat_send_queue_.size());
const int verified = std::max(0, std::min(chat_verified_note_budget_, kChatBufferTarget)); const int verified = std::max(0, std::min(chat_verified_note_budget_, kChatBufferTarget));
const std::string tgt = std::to_string(kChatBufferTarget); const int target = static_cast<int>(kChatBufferTarget);
if (queued > 0) char buf[128];
return "Chat: sending " + std::to_string(queued) + (queued == 1 ? " message…" : " messages…"); if (queued > 0) {
if (chat_split_outstanding_) snprintf(buf, sizeof(buf), TR(queued == 1 ? "chat_buffer_sending_one" : "chat_buffer_sending"), queued);
return "Chat buffer: preparing " + std::to_string(verified) + "/" + tgt + ""; return buf;
}
if (chat_split_outstanding_) {
snprintf(buf, sizeof(buf), TR("chat_buffer_preparing"), verified, target);
return buf;
}
if (!chat_note_model_seen_) if (!chat_note_model_seen_)
return "Chat buffer: …"; return TR("chat_buffer_loading");
return "Chat buffer: " + std::to_string(verified) + "/" + tgt + " ready"; snprintf(buf, sizeof(buf), TR("chat_buffer_ready"), verified, target);
return buf;
} }
bool App::isTransientVerifiedFundsError(const std::string& error) { bool App::isTransientVerifiedFundsError(const std::string& error) {

View File

@@ -266,6 +266,13 @@ void I18n::loadBuiltinEnglish()
strings_["chat_rename"] = "Rename contact"; strings_["chat_rename"] = "Rename contact";
strings_["chat_rename_hint"] = "Contact name"; strings_["chat_rename_hint"] = "Contact name";
strings_["chat_renamed"] = "Contact renamed"; strings_["chat_renamed"] = "Contact renamed";
// Chat note-buffer status (status bar, while the Chat tab is active). %d are counts;
// keep the format specifiers intact in translations.
strings_["chat_buffer_sending_one"] = "Chat: sending %d message\xE2\x80\xA6";
strings_["chat_buffer_sending"] = "Chat: sending %d messages\xE2\x80\xA6";
strings_["chat_buffer_preparing"] = "Chat buffer: preparing %d/%d\xE2\x80\xA6";
strings_["chat_buffer_loading"] = "Chat buffer: \xE2\x80\xA6";
strings_["chat_buffer_ready"] = "Chat buffer: %d/%d ready";
// Chat customization (gear modal + Settings → Chat & Contacts) // Chat customization (gear modal + Settings → Chat & Contacts)
strings_["chat_settings_title"] = "Chat settings"; strings_["chat_settings_title"] = "Chat settings";
strings_["chat_settings_tip"] = "Chat customization"; strings_["chat_settings_tip"] = "Chat customization";