From 5aa5f10fdb386d716d86066b5e392037ffe13914 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Wed, 24 Mar 2021 11:46:19 +0200 Subject: Fixes for dynamic language switching IssueID #192 --- src/lang.c | 36 +++++++++++++++++++++++++----------- src/ui/documentwidget.c | 2 +- src/ui/labelwidget.c | 3 +++ 3 files changed, 29 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/lang.c b/src/lang.c index f85d193a..60eee06a 100644 --- a/src/lang.c +++ b/src/lang.c @@ -66,16 +66,24 @@ void setCurrent_Lang(const char *language) { load_Lang_(d, language); } -iRangecc range_Lang(iRangecc msgId) { +static iBool find_Lang_(iRangecc msgId, iRangecc *str_out) { const iLang *d = &lang_; size_t pos; const iMsgStr key = { .id = msgId }; if (locate_SortedArray(d->messages, &key, &pos)) { - return ((const iMsgStr *) at_SortedArray(d->messages, pos))->str; + *str_out = ((const iMsgStr *) at_SortedArray(d->messages, pos))->str; + return iTrue; } fprintf(stderr, "[Lang] missing: %s\n", cstr_Rangecc(msgId)); fflush(stderr); -// iAssert(iFalse); - return msgId; + // iAssert(iFalse); + *str_out = msgId; + return iFalse; +} + +iRangecc range_Lang(iRangecc msgId) { + iRangecc str; + find_Lang_(msgId, &str); + return str; } const char *cstr_Lang(const char *msgId) { @@ -96,13 +104,19 @@ void translate_Lang(iString *textWithIds) { id.start += 2; id.end = strchr(id.start, '}'); iAssert(id.end != NULL); - const size_t idLen = size_Range(&id); - const iRangecc replacement = range_Lang(id); - const size_t startPos = id.start - cstr_String(textWithIds) - 2; - /* Replace it. */ - remove_Block(&textWithIds->chars, startPos, idLen + 3); - insertData_Block(&textWithIds->chars, startPos, replacement.start, size_Range(&replacement)); - pos = cstr_String(textWithIds) + startPos + size_Range(&replacement); + const size_t idLen = size_Range(&id); + iRangecc replacement; + const size_t startPos = id.start - cstr_String(textWithIds) - 2; + if (find_Lang_(id, &replacement)) { + /* Replace it. */ + remove_Block(&textWithIds->chars, startPos, idLen + 3); + insertData_Block(&textWithIds->chars, startPos, replacement.start, size_Range(&replacement)); + pos = cstr_String(textWithIds) + startPos + size_Range(&replacement); + } + else { + remove_Block(&textWithIds->chars, startPos, 1); /* skip on subsequent attempts */ + pos = cstr_String(textWithIds) + startPos + idLen; + } } } diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 139f622c..3d8d4f12 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -2089,7 +2089,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) size_PtrArray(links)), (iMenuItem[]){ { "${cancel}", 0, 0, NULL }, - { format_CStr(isPlural ? "dlg.import.add.many" : "dlg.import.add", + { format_CStr(cstr_Lang(isPlural ? "dlg.import.add.many" : "dlg.import.add"), uiTextAction_ColorEscape, size_PtrArray(links)), 0, diff --git a/src/ui/labelwidget.c b/src/ui/labelwidget.c index 6e8208c4..c34ae3cf 100644 --- a/src/ui/labelwidget.c +++ b/src/ui/labelwidget.c @@ -86,7 +86,10 @@ static iBool processEvent_LabelWidget_(iLabelWidget *d, const SDL_Event *ev) { updateSize_LabelWidget(d); } else if (isCommand_UserEvent(ev, "lang.changed")) { + const iChar oldIcon = d->icon; /* icon will be retained */ setText_LabelWidget(d, &d->srcLabel); + checkIcon_LabelWidget(d); /* strip it */ + d->icon = oldIcon; return iFalse; } else if (isCommand_UserEvent(ev, "bindings.changed")) { -- cgit v1.2.3