From 7a202ae8fcfa91df06d0acd248c3d8bd8a07c4db Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 22 Dec 2019 14:07:23 +0100 Subject: [PATCH] DeskCalc: fix translation of key labels The labels were never actually translated, only marked for use in catalogs. Moreover, all the keys were sent as a single string, which is unconvenient for translation and requires useless parsing in the code. Use an array of strings instead, which is simpler. There is a change to the archiving format, instead of storing the whole keymap, only its name is stored. For backwards compatibility, if we detect "ln" at the start of the string we use scientific mode. Change-Id: I566d8d51e8ac6e780fc25207aad1dfa7ff737988 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2049 Reviewed-by: waddlesplash --- src/apps/deskcalc/CalcView.cpp | 135 +++++++++++++++++++++++---------- src/apps/deskcalc/CalcView.h | 4 +- 2 files changed, 99 insertions(+), 40 deletions(-) diff --git a/src/apps/deskcalc/CalcView.cpp b/src/apps/deskcalc/CalcView.cpp index f684fd686b..b138c482d9 100644 --- a/src/apps/deskcalc/CalcView.cpp +++ b/src/apps/deskcalc/CalcView.cpp @@ -78,22 +78,86 @@ static const float kMinimumHeightScientific = 200.0f; static const float kMaximumHeightScientific = 400.0f; // basic mode keypad layout (default) -const char *kKeypadDescriptionBasic = B_TRANSLATE_MARK( - "7 8 9 ( ) \n" - "4 5 6 * / \n" - "1 2 3 + - \n" - "0 . BS = C \n"); +const char *kKeypadDescriptionBasic[] = { + B_TRANSLATE_MARK("7"), + B_TRANSLATE_MARK("8"), + B_TRANSLATE_MARK("9"), + B_TRANSLATE_MARK("("), + B_TRANSLATE_MARK(")"), + "\n", + B_TRANSLATE_MARK("4"), + B_TRANSLATE_MARK("5"), + B_TRANSLATE_MARK("6"), + B_TRANSLATE_MARK("*"), + B_TRANSLATE_MARK("/"), + "\n", + B_TRANSLATE_MARK("1"), + B_TRANSLATE_MARK("2"), + B_TRANSLATE_MARK("3"), + B_TRANSLATE_MARK("+"), + B_TRANSLATE_MARK("-"), + "\n", + B_TRANSLATE_MARK("0"), + B_TRANSLATE_MARK("."), + B_TRANSLATE_MARK("BS"), + B_TRANSLATE_MARK("="), + B_TRANSLATE_MARK("C"), + "\n", + NULL +}; // scientific mode keypad layout -const char *kKeypadDescriptionScientific = B_TRANSLATE_MARK( - "ln sin cos tan π \n" - "log asin acos atan sqrt \n" - "exp sinh cosh tanh cbrt \n" - "! ceil floor E ^ \n" - "7 8 9 ( ) \n" - "4 5 6 * / \n" - "1 2 3 + - \n" - "0 . BS = C \n"); +const char *kKeypadDescriptionScientific[] = { + B_TRANSLATE_MARK("ln"), + B_TRANSLATE_MARK("sin"), + B_TRANSLATE_MARK("cos"), + B_TRANSLATE_MARK("tan"), + B_TRANSLATE_MARK("π"), + "\n", + B_TRANSLATE_MARK("log"), + B_TRANSLATE_MARK("asin"), + B_TRANSLATE_MARK("acos"), + B_TRANSLATE_MARK("atan"), + B_TRANSLATE_MARK("sqrt"), + "\n", + B_TRANSLATE_MARK("exp"), + B_TRANSLATE_MARK("sinh"), + B_TRANSLATE_MARK("cosh"), + B_TRANSLATE_MARK("tanh"), + B_TRANSLATE_MARK("cbrt"), + "\n", + B_TRANSLATE_MARK("!"), + B_TRANSLATE_MARK("ceil"), + B_TRANSLATE_MARK("floor"), + B_TRANSLATE_MARK("E"), + B_TRANSLATE_MARK("^"), + "\n", + B_TRANSLATE_MARK("7"), + B_TRANSLATE_MARK("8"), + B_TRANSLATE_MARK("9"), + B_TRANSLATE_MARK("("), + B_TRANSLATE_MARK(")"), + "\n", + B_TRANSLATE_MARK("4"), + B_TRANSLATE_MARK("5"), + B_TRANSLATE_MARK("6"), + B_TRANSLATE_MARK("*"), + B_TRANSLATE_MARK("/"), + "\n", + B_TRANSLATE_MARK("1"), + B_TRANSLATE_MARK("2"), + B_TRANSLATE_MARK("3"), + B_TRANSLATE_MARK("+"), + B_TRANSLATE_MARK("-"), + "\n", + B_TRANSLATE_MARK("0"), + B_TRANSLATE_MARK("."), + B_TRANSLATE_MARK("BS"), + B_TRANSLATE_MARK("="), + B_TRANSLATE_MARK("C"), + "\n", + NULL +}; enum { @@ -135,7 +199,7 @@ CalcView::CalcView(BRect frame, rgb_color rgbBaseColor, BMessage* settings) fWidth(1), fHeight(1), - fKeypadDescription(strdup(kKeypadDescriptionBasic)), + fKeypadDescription(kKeypadDescriptionBasic), fKeypad(NULL), #ifdef __HAIKU__ @@ -174,7 +238,7 @@ CalcView::CalcView(BMessage* archive) fWidth(1), fHeight(1), - fKeypadDescription(strdup(kKeypadDescriptionBasic)), + fKeypadDescription(kKeypadDescriptionBasic), fKeypad(NULL), #ifdef __HAIKU__ @@ -203,7 +267,6 @@ CalcView::~CalcView() { delete[] fKeypad; delete fOptions; - free(fKeypadDescription); delete fEvaluateMessageRunner; delete_sem(fEvaluateSemaphore); } @@ -866,7 +929,9 @@ CalcView::SaveSettings(BMessage* archive) const // record calculator description if (ret == B_OK) - ret = archive->AddString("calcDesc", fKeypadDescription); + ret = archive->AddString("calcDesc", + fKeypadDescription == kKeypadDescriptionBasic + ? "basic" : "scientific"); return ret; } @@ -982,8 +1047,7 @@ CalcView::SetKeypadMode(uint8 mode) case KEYPAD_MODE_SCIENTIFIC: { - free(fKeypadDescription); - fKeypadDescription = strdup(kKeypadDescriptionScientific); + fKeypadDescription = kKeypadDescriptionScientific; fRows = 8; _ParseCalcDesc(fKeypadDescription); @@ -1012,8 +1076,7 @@ CalcView::SetKeypadMode(uint8 mode) case KEYPAD_MODE_BASIC: default: { - free(fKeypadDescription); - fKeypadDescription = strdup(kKeypadDescriptionBasic); + fKeypadDescription = kKeypadDescriptionBasic; fRows = 4; _ParseCalcDesc(fKeypadDescription); @@ -1101,13 +1164,12 @@ CalcView::_LoadSettings(BMessage* archive) return B_BAD_VALUE; // record calculator description - const char* calcDesc; - if (archive->FindString("calcDesc", &calcDesc) < B_OK) - calcDesc = kKeypadDescriptionBasic; - - // save calculator description for reference - free(fKeypadDescription); - fKeypadDescription = strdup(calcDesc); + BString calcDesc; + archive->FindString("calcDesc", &calcDesc); + if (calcDesc == "scientific" || calcDesc.StartsWith("ln")) + fKeypadDescription = kKeypadDescriptionScientific; + else + fKeypadDescription = kKeypadDescriptionBasic; // read grid dimensions if (archive->FindInt16("cols", &fColumns) < B_OK) @@ -1163,21 +1225,20 @@ CalcView::_LoadSettings(BMessage* archive) void -CalcView::_ParseCalcDesc(const char* keypadDescription) +CalcView::_ParseCalcDesc(const char** keypadDescription) { // TODO: should calculate dimensions from desc here! fKeypad = new CalcKey[fRows * fColumns]; // scan through calculator description and assemble keypad CalcKey* key = fKeypad; - const char* p = keypadDescription; + for (int i = 0; const char* p = keypadDescription[i]; i++) { + // Move to next row as needed + if (strcmp(p, "\n") == 0) + continue; - while (*p != 0) { // copy label - char* l = key->label; - while (!isspace(*p)) - *l++ = *p++; - *l = '\0'; + strlcpy(key->label, B_TRANSLATE_NOCOLLECT(p), sizeof(key->label)); // set code if (strcmp(key->label, "=") == 0) @@ -1198,8 +1259,6 @@ CalcView::_ParseCalcDesc(const char* keypadDescription) fExpressionTextView->AddKeypadLabel(key->label); // advance - while (isspace(*p)) - ++p; key++; } } diff --git a/src/apps/deskcalc/CalcView.h b/src/apps/deskcalc/CalcView.h index 323d8cb130..ed61313309 100644 --- a/src/apps/deskcalc/CalcView.h +++ b/src/apps/deskcalc/CalcView.h @@ -101,7 +101,7 @@ class CalcView : public BView { static status_t _EvaluateThread(void* data); void _Init(BMessage* settings); status_t _LoadSettings(BMessage* archive); - void _ParseCalcDesc(const char* keypadDescription); + void _ParseCalcDesc(const char** keypadDescription); void _PressKey(int key); void _PressKey(const char* label); @@ -144,7 +144,7 @@ class CalcView : public BView { // keypad grid struct CalcKey; - char* fKeypadDescription; + const char** fKeypadDescription; CalcKey* fKeypad; // icon