From 4116949ea55232c53eeaac0fc7bb4e169dfc36dc Mon Sep 17 00:00:00 2001 From: Louis Delbosc Date: Fri, 2 Dec 2022 21:49:55 +0100 Subject: [PATCH] Add translation for boolean value in toggle columns for text cell (#364) --- app/client/widgets/NTextBox.ts | 5 ++++- app/common/ValueFormatter.ts | 17 +++++++++++++---- static/locales/en.client.json | 4 ++++ static/locales/fr.client.json | 4 ++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/client/widgets/NTextBox.ts b/app/client/widgets/NTextBox.ts index 807a6ae5..854685f5 100644 --- a/app/client/widgets/NTextBox.ts +++ b/app/client/widgets/NTextBox.ts @@ -9,6 +9,9 @@ import { cssIconBackground, icon } from 'app/client/ui2018/icons'; import { gristLink } from 'app/client/ui2018/links'; import { NewAbstractWidget, Options } from 'app/client/widgets/NewAbstractWidget'; import { Computed, dom, DomArg, DomContents, fromKo, Observable, styled } from 'grainjs'; +import {makeT} from 'app/client/lib/localization'; + +const t = makeT('NTextBox'); /** * TextBox - The most basic widget for displaying text information. @@ -62,7 +65,7 @@ export class NTextBox extends NewAbstractWidget { return dom('div.field_clip', dom.style('text-align', this.alignment), dom.cls('text_wrapping', this.wrapping), - dom.domComputed((use) => use(row._isAddRow) ? null : makeLinks(use(this.valueFormatter).formatAny(use(value)))) + dom.domComputed((use) => use(row._isAddRow) ? null : makeLinks(use(this.valueFormatter).formatAny(use(value), t))) ); } } diff --git a/app/common/ValueFormatter.ts b/app/common/ValueFormatter.ts index 9ff05f27..8216fc60 100644 --- a/app/common/ValueFormatter.ts +++ b/app/common/ValueFormatter.ts @@ -79,19 +79,28 @@ export class BaseFormatter { * Formats using this.format() if a value is of the right type for this formatter, or using * AnyFormatter otherwise. This method the recommended API. There is no need to override it. */ - public formatAny(value: any): string { - return this.isRightType(value) ? this.format(value) : formatUnknown(value); + public formatAny(value: any, translate?: (val: string) => string): string { + return this.isRightType(value) ? this.format(value, translate) : formatUnknown(value); } /** * Formats a value that matches the type of this formatter. This should be overridden by derived * classes to handle values in formatter-specific ways. */ - protected format(value: any): string { + protected format(value: any, _translate?: (val: string) => string): string { return String(value); } } +export class BoolFormatter extends BaseFormatter { + public format(value: boolean | 0 | 1, translate?: (val: string) => string): string { + if (typeof value === 'boolean' && translate) { + return translate(String(value)); + } + return super.format(value, translate); + } +} + class AnyFormatter extends BaseFormatter { public format(value: any): string { return formatUnknown(value); @@ -265,7 +274,7 @@ class ReferenceListFormatter extends ReferenceFormatter { const formatters: { [name: string]: typeof BaseFormatter } = { Numeric: NumericFormatter, Int: IntFormatter, - Bool: BaseFormatter, + Bool: BoolFormatter, Date: DateFormatter, DateTime: DateTimeFormatter, Ref: ReferenceFormatter, diff --git a/static/locales/en.client.json b/static/locales/en.client.json index f3a6e5d0..3faeb2f3 100644 --- a/static/locales/en.client.json +++ b/static/locales/en.client.json @@ -354,6 +354,10 @@ "GiveFeedback": "Give feedback", "NoNotifications": "No notifications" }, + "NTextBox": { + "false": "false", + "true": "true" + }, "OnBoardingPopups": { "Finish": "Finish", "Next": "Next" diff --git a/static/locales/fr.client.json b/static/locales/fr.client.json index 416fa144..a1b97cec 100644 --- a/static/locales/fr.client.json +++ b/static/locales/fr.client.json @@ -351,6 +351,10 @@ "GiveFeedback": "Donnez votre avis", "NoNotifications": "Aucune notification" }, + "NTextBox": { + "false": "faux", + "true": "vrai" + }, "OnBoardingPopups": { "Finish": "Terminer", "Next": "Suivant"