From 8a2c457ab914375bce51bde782b764e1dcdcab4f Mon Sep 17 00:00:00 2001 From: Philip Okugbe <16838612+Philipinho@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:35:26 +0100 Subject: [PATCH 1/2] feat: kanban group editing (#2322) * feat: support opening property menu directly on options panel * refactor: expose group-by property from useKanbanColumns * feat: rename kanban group by clicking column name * feat: edit group-by property from kanban column menu * fix: license-gate base and kanban inserts * fix: add missing bases strings to en-US translation file --- .../public/locales/en-US/translation.json | 138 +++++++++++++++++- .../ee/base/components/kanban/base-kanban.tsx | 3 +- .../kanban/kanban-column-header.tsx | 28 ++-- .../components/kanban/kanban-column-menu.tsx | 119 +++++++++++++++ .../components/kanban/kanban-column-title.tsx | 113 ++++++++++++++ .../base/components/kanban/kanban-column.tsx | 5 +- .../components/property/property-menu.tsx | 10 +- .../src/ee/base/hooks/use-kanban-columns.ts | 7 +- .../src/ee/base/styles/kanban.module.css | 15 ++ .../base-embed/insert-base-embed.ts | 9 +- .../groups/more-inserts-group.tsx | 59 ++++++-- .../components/slash-menu/command-list.tsx | 22 ++- .../components/slash-menu/menu-items.ts | 2 + .../slash-menu/slash-menu.module.css | 5 +- .../editor/components/slash-menu/types.ts | 1 + 15 files changed, 484 insertions(+), 52 deletions(-) create mode 100644 apps/client/src/ee/base/components/kanban/kanban-column-menu.tsx create mode 100644 apps/client/src/ee/base/components/kanban/kanban-column-title.tsx diff --git a/apps/client/public/locales/en-US/translation.json b/apps/client/public/locales/en-US/translation.json index c23b4e2d3..18c981434 100644 --- a/apps/client/public/locales/en-US/translation.json +++ b/apps/client/public/locales/en-US/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Create property", "Hide properties": "Hide properties", "Find a property type": "Find a property type", - "Properties": "Properties" + "Properties": "Properties", + "A property with this name already exists": "A property with this name already exists", + "Add card": "Add card", + "Add filter": "Add filter", + "Add option": "Add option", + "Add sort": "Add sort", + "Add view": "Add view", + "All data in this column will be lost.": "All data in this column will be lost.", + "Allow multiple people": "Allow multiple people", + "Alphabetize": "Alphabetize", + "Are you sure you want to delete": "Are you sure you want to delete", + "Ascending": "Ascending", + "Base deleted": "Base deleted", + "Base name": "Base name", + "Base table": "Base table", + "Card properties": "Card properties", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Cells longer than the Text limit will be truncated and the extra content permanently lost.", + "Checkbox": "Checkbox", + "Checked by default": "Checked by default", + "Choose a property": "Choose a property", + "Clear selection": "Clear selection", + "Column options": "Column options", + "Comma, period": "Comma, period", + "Complete": "Complete", + "Contains": "Contains", + "Copy link to view": "Copy link to view", + "Create a status property": "Create a status property", + "Created at": "Created at", + "Currency": "Currency", + "Decimal places": "Decimal places", + "Default value": "Default value", + "Delete property": "Delete property", + "Delete view": "Delete view", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Descending", + "Discard": "Discard", + "Doesn't contain": "Doesn't contain", + "Done": "Done", + "Edit formula": "Edit formula", + "Edit property": "Edit property", + "Export CSV": "Export CSV", + "Failed to load base": "Failed to load base", + "False": "False", + "File": "File", + "Filter and sort changes are visible only to you": "Filter and sort changes are visible only to you", + "Filter by": "Filter by", + "Formula": "Formula", + "Get started with": "Get started with", + "Greater than": "Greater than", + "Group by": "Group by", + "Group this board by a select or status property.": "Group this board by a select or status property.", + "Hide all": "Hide all", + "Hide group": "Hide group", + "In Progress": "In Progress", + "In progress": "In progress", + "Include time": "Include time", + "Insert a kanban board on this page": "Insert a kanban board on this page", + "Insert an inline base on this page": "Insert an inline base on this page", + "Is": "Is", + "Is after": "Is after", + "Is any of": "Is any of", + "Is before": "Is before", + "Is empty": "Is empty", + "Is none of": "Is none of", + "Is not": "Is not", + "Is not empty": "Is not empty", + "Is on or after": "Is on or after", + "Is on or before": "Is on or before", + "Is within": "Is within", + "Keep editing": "Keep editing", + "Last edited at": "Last edited at", + "Last edited by": "Last edited by", + "Less than": "Less than", + "Link copied to clipboard": "Link copied to clipboard", + "Local": "Local", + "Long text": "Long text", + "Moved card to {{column}}": "Moved card to {{column}}", + "Moved column to {{column}}": "Moved column to {{column}}", + "Multi-select": "Multi-select", + "New row": "New row", + "Next month": "Next month", + "Next week": "Next week", + "Next year": "Next year", + "No filters applied": "No filters applied", + "No match": "No match", + "No options for this property type": "No options for this property type", + "No sorts applied": "No sorts applied", + "No value": "No value", + "None": "None", + "Not started": "Not started", + "Number": "Number", + "One month ago": "One month ago", + "One month from now": "One month from now", + "One week ago": "One week ago", + "One week from now": "One week from now", + "Open as page": "Open as page", + "Options": "Options", + "Past month": "Past month", + "Past week": "Past week", + "Past year": "Past year", + "Percent": "Percent", + "Period, comma": "Period, comma", + "Person": "Person", + "Please enter a valid email": "Please enter a valid email", + "Progress": "Progress", + "Property options": "Property options", + "Relative": "Relative", + "Rename property": "Rename property", + "Reset": "Reset", + "Save for everyone": "Save for everyone", + "Select": "Select", + "Select a property": "Select a property", + "Select all loaded rows": "Select all loaded rows", + "Show all": "Show all", + "Sort": "Sort", + "Sort by": "Sort by", + "Space, comma": "Space, comma", + "Space, period": "Space, period", + "This board has no grouping property yet.": "This board has no grouping property yet.", + "This month": "This month", + "This year": "This year", + "Thousands and decimal separators": "Thousands and decimal separators", + "Time format": "Time format", + "To Do": "To Do", + "Tomorrow": "Tomorrow", + "True": "True", + "Unsaved changes": "Unsaved changes", + "Untitled base": "Untitled base", + "URL": "URL", + "Value": "Value", + "View updated for everyone": "View updated for everyone", + "You have unsaved changes. Do you want to discard them?": "You have unsaved changes. Do you want to discard them?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/src/ee/base/components/kanban/base-kanban.tsx b/apps/client/src/ee/base/components/kanban/base-kanban.tsx index 2ad2df93b..f19f37d6b 100644 --- a/apps/client/src/ee/base/components/kanban/base-kanban.tsx +++ b/apps/client/src/ee/base/components/kanban/base-kanban.tsx @@ -30,7 +30,7 @@ type BaseKanbanProps = { export function BaseKanban({ base, view, pageId, embedded, editable, viewFilter }: BaseKanbanProps) { const { t } = useTranslation(); - const { groupByPropertyId, columns, hasValidGroupBy } = useKanbanColumns(base, view); + const { groupByPropertyId, groupByProperty, columns, hasValidGroupBy } = useKanbanColumns(base, view); const updateView = useUpdateViewMutation(); const moveCard = useKanbanMoveCardMutation(); const { openRow } = useRowDetailModal(pageId); @@ -201,6 +201,7 @@ export function BaseKanban({ base, view, pageId, embedded, editable, viewFilter column={column} viewFilter={viewFilter} groupByPropertyId={groupByPropertyId!} + groupByProperty={groupByProperty} canEdit={editable} onOpenRow={handleOpenRow} onHide={hideColumn} diff --git a/apps/client/src/ee/base/components/kanban/kanban-column-header.tsx b/apps/client/src/ee/base/components/kanban/kanban-column-header.tsx index 3e53080f5..830a00a16 100644 --- a/apps/client/src/ee/base/components/kanban/kanban-column-header.tsx +++ b/apps/client/src/ee/base/components/kanban/kanban-column-header.tsx @@ -1,24 +1,27 @@ import { useRef } from "react"; import { useTranslation } from "react-i18next"; -import { ActionIcon, Menu, Text } from "@mantine/core"; -import { IconDots, IconPlus, IconGripVertical } from "@tabler/icons-react"; +import { ActionIcon, Text } from "@mantine/core"; +import { IconPlus, IconGripVertical } from "@tabler/icons-react"; import clsx from "clsx"; -import { KanbanColumn } from "@/ee/base/types/base.types"; +import { IBaseProperty, KanbanColumn } from "@/ee/base/types/base.types"; import { choiceColor } from "@/ee/base/components/cells/choice-color"; import { useKanbanColumnDnd } from "@/ee/base/hooks/use-kanban-column-dnd"; import { BaseDropEdgeIndicator } from "@/ee/base/components/grid/base-drop-edge-indicator"; +import { KanbanColumnTitle } from "@/ee/base/components/kanban/kanban-column-title"; +import { KanbanColumnMenu } from "@/ee/base/components/kanban/kanban-column-menu"; import classes from "@/ee/base/styles/kanban.module.css"; type KanbanColumnHeaderProps = { column: KanbanColumn; pageId: string; + property: IBaseProperty | undefined; count?: string; canEdit: boolean; onHide: () => void; onAddCard: () => void; }; -export function KanbanColumnHeader({ column, pageId, count, canEdit, onHide, onAddCard }: KanbanColumnHeaderProps) { +export function KanbanColumnHeader({ column, pageId, property, count, canEdit, onHide, onAddCard }: KanbanColumnHeaderProps) { const { t } = useTranslation(); const dotColor = column.color ? choiceColor(column.color).color as string @@ -49,22 +52,13 @@ export function KanbanColumnHeader({ column, pageId, count, canEdit, onHide, onA background: dotColor, }} /> - - {column.isNoValue ? t("No value") : column.name} - + {count !== undefined && {count}} {canEdit && ( <> - - - - - - - - {t("Hide group")} - - + {property && ( + + )} diff --git a/apps/client/src/ee/base/components/kanban/kanban-column-menu.tsx b/apps/client/src/ee/base/components/kanban/kanban-column-menu.tsx new file mode 100644 index 000000000..be2e88f76 --- /dev/null +++ b/apps/client/src/ee/base/components/kanban/kanban-column-menu.tsx @@ -0,0 +1,119 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { ActionIcon, Popover, Stack } from "@mantine/core"; +import { IconDots, IconEyeOff, IconSettings } from "@tabler/icons-react"; +import { useAtom } from "jotai"; +import { + propertyMenuCloseRequestAtomFamily, + propertyMenuDirtyAtomFamily, +} from "@/ee/base/atoms/base-atoms"; +import { IBaseProperty } from "@/ee/base/types/base.types"; +import { + MenuItem, + PropertyMenuContent, +} from "@/ee/base/components/property/property-menu"; + +type KanbanColumnMenuProps = { + property: IBaseProperty; + pageId: string; + onHide: () => void; +}; + +export function KanbanColumnMenu({ property, pageId, onHide }: KanbanColumnMenuProps) { + const { t } = useTranslation(); + const [opened, setOpened] = useState(false); + const [view, setView] = useState<"menu" | "property">("menu"); + const [dirty, setDirty] = useAtom(propertyMenuDirtyAtomFamily(pageId)) as unknown as [boolean, (val: boolean) => void]; + const [closeRequest, setCloseRequest] = useAtom(propertyMenuCloseRequestAtomFamily(pageId)) as unknown as [number, (val: number) => void]; + + const handleClose = useCallback(() => { + setOpened(false); + setView("menu"); + }, []); + + const wasOpenedRef = useRef(opened); + useEffect(() => { + if (wasOpenedRef.current && !opened) setDirty(false); + wasOpenedRef.current = opened; + }, [opened, setDirty]); + + const handleOpenChange = useCallback( + (next: boolean) => { + if (next) return; + if (dirty) { + setCloseRequest(closeRequest + 1); + } else { + handleClose(); + } + }, + [dirty, closeRequest, setCloseRequest, handleClose], + ); + + const toggle = useCallback(() => { + if (opened) { + handleOpenChange(false); + } else if (!dirty) { + setOpened(true); + } + }, [opened, dirty, handleOpenChange]); + + return ( + + + + + + + e.stopPropagation()} + onKeyDown={(e) => e.stopPropagation()} + > + {view === "menu" ? ( + + } + label={t("Edit property")} + onClick={() => setView("property")} + /> + } + label={t("Hide group")} + onClick={() => { + handleClose(); + onHide(); + }} + /> + + ) : ( + + )} + + + ); +} diff --git a/apps/client/src/ee/base/components/kanban/kanban-column-title.tsx b/apps/client/src/ee/base/components/kanban/kanban-column-title.tsx new file mode 100644 index 000000000..fe13996ed --- /dev/null +++ b/apps/client/src/ee/base/components/kanban/kanban-column-title.tsx @@ -0,0 +1,113 @@ +import { useCallback, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Button, Group, Popover, Text, TextInput, UnstyledButton } from "@mantine/core"; +import { IBaseProperty, KanbanColumn, SelectTypeOptions } from "@/ee/base/types/base.types"; +import { useUpdatePropertyMutation } from "@/ee/base/queries/base-property-query"; +import classes from "@/ee/base/styles/kanban.module.css"; + +type KanbanColumnTitleProps = { + column: KanbanColumn; + property: IBaseProperty | undefined; + pageId: string; + canEdit: boolean; +}; + +export function KanbanColumnTitle({ column, property, pageId, canEdit }: KanbanColumnTitleProps) { + const { t } = useTranslation(); + const [opened, setOpened] = useState(false); + const [draft, setDraft] = useState(""); + const updateProperty = useUpdatePropertyMutation(); + + const commit = useCallback(() => { + setOpened(false); + const name = draft.trim(); + const options = property?.typeOptions as SelectTypeOptions | undefined; + if (!property || !options || !name || name === column.name) return; + if (!options.choices.some((c) => c.id === column.key)) return; + updateProperty.mutate({ + propertyId: property.id, + pageId, + typeOptions: { + ...options, + choices: options.choices.map((c) => + c.id === column.key ? { ...c, name } : c, + ), + }, + }); + }, [draft, property, column.name, column.key, pageId, updateProperty]); + + const toggle = useCallback(() => { + if (opened) { + commit(); + } else { + setDraft(column.name); + setOpened(true); + } + }, [opened, commit, column.name]); + + const cancel = useCallback(() => setOpened(false), []); + + if (!canEdit || column.isNoValue || !property) { + return ( + + {column.isNoValue ? t("No value") : column.name} + + ); + } + + return ( + { + if (!next) commit(); + }} + position="bottom-start" + shadow="md" + width={240} + withinPortal + trapFocus + returnFocus + closeOnClickOutside + closeOnEscape={false} + > + + + + {column.name} + + + + e.stopPropagation()} + onKeyDown={(e) => { + if (e.key === "Escape") { + e.preventDefault(); + e.stopPropagation(); + cancel(); + } + }} + > + + e.currentTarget.select()} + onChange={(e) => setDraft(e.currentTarget.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + commit(); + } + }} + /> + + + + + ); +} diff --git a/apps/client/src/ee/base/components/kanban/kanban-column.tsx b/apps/client/src/ee/base/components/kanban/kanban-column.tsx index 95c1a1858..9975f4f66 100644 --- a/apps/client/src/ee/base/components/kanban/kanban-column.tsx +++ b/apps/client/src/ee/base/components/kanban/kanban-column.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useRef } from "react"; import { generateJitteredKeyBetween } from "fractional-indexing-jittered"; import { dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter"; -import { type IBase, type IBaseRow, type IBaseView, type FilterGroup, type KanbanColumn as KanbanColumnType, KANBAN_CARD_DRAG_TYPE } from "@/ee/base/types/base.types"; +import { type IBase, type IBaseProperty, type IBaseRow, type IBaseView, type FilterGroup, type KanbanColumn as KanbanColumnType, KANBAN_CARD_DRAG_TYPE } from "@/ee/base/types/base.types"; import { buildColumnFilter } from "@/ee/base/services/kanban-column-filter"; import { formatKanbanCount } from "@/ee/base/services/format-kanban-count"; import { useKanbanColumnAutoScroll } from "@/ee/base/hooks/use-kanban-autoscroll"; @@ -19,6 +19,7 @@ type KanbanColumnProps = { column: KanbanColumnType; viewFilter: FilterGroup | undefined; groupByPropertyId: string; + groupByProperty: IBaseProperty | undefined; canEdit: boolean; onOpenRow: (rowId: string) => void; onHide: (columnKey: string) => void; @@ -33,6 +34,7 @@ export function KanbanColumn({ column, viewFilter, groupByPropertyId, + groupByProperty, canEdit, onOpenRow, onHide, @@ -139,6 +141,7 @@ export function KanbanColumn({ onHide(column.key)} diff --git a/apps/client/src/ee/base/components/property/property-menu.tsx b/apps/client/src/ee/base/components/property/property-menu.tsx index 0ef1e9c48..492339904 100644 --- a/apps/client/src/ee/base/components/property/property-menu.tsx +++ b/apps/client/src/ee/base/components/property/property-menu.tsx @@ -53,6 +53,7 @@ type PropertyMenuContentProps = { onDirtyChange?: (dirty: boolean) => void; onEditFormula?: () => void; pageId: string; + initialPanel?: "main" | "options"; }; type MenuPanel = @@ -96,9 +97,10 @@ export function PropertyMenuContent({ onDirtyChange, onEditFormula, pageId, + initialPanel, }: PropertyMenuContentProps) { const { t } = useTranslation(); - const [panel, setPanel] = useState("main"); + const [panel, setPanel] = useState(initialPanel ?? "main"); const [renameValue, setRenameValue] = useState(property.name); const renameInputRef = useRef(null); const [optionsDirty, setOptionsDirty] = useState(false); @@ -117,12 +119,12 @@ export function PropertyMenuContent({ useEffect(() => { if (opened) { - setPanel("main"); + setPanel(initialPanel ?? "main"); setRenameValue(property.name); setOptionsDirty(false); setPendingTargetType(null); } - }, [opened, property.name]); + }, [opened, property.name, initialPanel]); useEffect(() => { if (panel === "rename") { @@ -463,7 +465,7 @@ export function PropertyMenuContent({ PropertyMenuContent.displayName = "PropertyMenuContent"; -function MenuItem({ +export function MenuItem({ icon, label, rightIcon, diff --git a/apps/client/src/ee/base/hooks/use-kanban-columns.ts b/apps/client/src/ee/base/hooks/use-kanban-columns.ts index 493da5ab8..df7ee9213 100644 --- a/apps/client/src/ee/base/hooks/use-kanban-columns.ts +++ b/apps/client/src/ee/base/hooks/use-kanban-columns.ts @@ -1,5 +1,5 @@ import { useMemo } from "react"; -import { IBase, IBaseView, KanbanColumn, NO_VALUE_CHOICE_ID, SelectTypeOptions } from "@/ee/base/types/base.types"; +import { IBase, IBaseProperty, IBaseView, KanbanColumn, NO_VALUE_CHOICE_ID, SelectTypeOptions } from "@/ee/base/types/base.types"; export type KanbanGroup = KanbanColumn & { hidden: boolean }; @@ -8,6 +8,7 @@ export function useKanbanColumns( view: IBaseView | undefined, ): { groupByPropertyId: string | undefined; + groupByProperty: IBaseProperty | undefined; columns: KanbanColumn[]; allGroups: KanbanGroup[]; hasValidGroupBy: boolean; @@ -18,7 +19,7 @@ export function useKanbanColumns( const groupable = prop && (prop.type === "select" || prop.type === "status"); if (!groupable || !prop || !view) { - return { groupByPropertyId, columns: [], allGroups: [], hasValidGroupBy: false }; + return { groupByPropertyId, groupByProperty: undefined, columns: [], allGroups: [], hasValidGroupBy: false }; } const typeOptions = prop.typeOptions as SelectTypeOptions; @@ -47,6 +48,6 @@ export function useKanbanColumns( }); const columns: KanbanColumn[] = allGroups.filter((g) => !g.hidden); - return { groupByPropertyId, columns, allGroups, hasValidGroupBy: true }; + return { groupByPropertyId, groupByProperty: prop, columns, allGroups, hasValidGroupBy: true }; }, [base, view]); } diff --git a/apps/client/src/ee/base/styles/kanban.module.css b/apps/client/src/ee/base/styles/kanban.module.css index 915188c73..c6aaa1ddd 100644 --- a/apps/client/src/ee/base/styles/kanban.module.css +++ b/apps/client/src/ee/base/styles/kanban.module.css @@ -76,6 +76,21 @@ cursor: grabbing; } +.columnTitleButton { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + padding: 2px 6px; + margin: -2px -6px; + border-radius: 6px; + cursor: pointer; +} + +.columnTitleButton:hover { + background: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5)); +} + .cardList { display: flex; flex-direction: column; diff --git a/apps/client/src/features/editor/components/base-embed/insert-base-embed.ts b/apps/client/src/features/editor/components/base-embed/insert-base-embed.ts index 8ef1fd500..107ed9576 100644 --- a/apps/client/src/features/editor/components/base-embed/insert-base-embed.ts +++ b/apps/client/src/features/editor/components/base-embed/insert-base-embed.ts @@ -2,6 +2,8 @@ import type { Editor, Range } from "@tiptap/core"; import { v7 as uuid7 } from "uuid"; import { notifications } from "@mantine/notifications"; import api from "@/lib/api-client"; +import i18n from "@/i18n.ts"; +import { getApiErrorMessage } from "@/lib/api-error"; function findBaseEmbedPlaceholderPos( editor: Editor, @@ -50,7 +52,7 @@ export async function insertBaseEmbedBlock( return true; }) .run(); - } catch { + } catch (err) { const pos = findBaseEmbedPlaceholderPos(editor, pendingKey); if (pos !== null) { editor @@ -62,6 +64,9 @@ export async function insertBaseEmbedBlock( }) .run(); } - notifications.show({ message: "Failed to create base", color: "red" }); + notifications.show({ + message: getApiErrorMessage(err, i18n.t("Failed to create base")), + color: "red", + }); } } diff --git a/apps/client/src/features/editor/components/fixed-toolbar/groups/more-inserts-group.tsx b/apps/client/src/features/editor/components/fixed-toolbar/groups/more-inserts-group.tsx index 2e414b217..b12f609cf 100644 --- a/apps/client/src/features/editor/components/fixed-toolbar/groups/more-inserts-group.tsx +++ b/apps/client/src/features/editor/components/fixed-toolbar/groups/more-inserts-group.tsx @@ -1,6 +1,6 @@ import { FC } from "react"; import type { Editor } from "@tiptap/react"; -import { ActionIcon, Menu, Tooltip } from "@mantine/core"; +import { ActionIcon, Badge, Menu, Tooltip } from "@mantine/core"; import { IconAppWindow, IconCalendar, @@ -32,6 +32,9 @@ import { } from "@/components/icons"; import { useTranslation } from "react-i18next"; import { insertBaseEmbedBlock } from "@/features/editor/components/base-embed/insert-base-embed"; +import { useHasFeature } from "@/ee/hooks/use-feature"; +import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; interface Props { editor: Editor; @@ -40,6 +43,8 @@ interface Props { export const MoreInsertsGroup: FC = ({ editor, templateMode }) => { const { t, i18n } = useTranslation(); + const hasBases = useHasFeature(Feature.BASES); + const upgradeLabel = useUpgradeLabel(); const setEmbed = (provider: string) => editor.chain().focus().setEmbed({ provider }).run(); @@ -106,20 +111,48 @@ export const MoreInsertsGroup: FC = ({ editor, templateMode }) => { )} {!templateMode && ( - } - onClick={() => insertBaseEmbedBlock(editor)} - > - {t("Base (Inline)")} - + + } + aria-disabled={!hasBases} + closeMenuOnClick={hasBases} + style={{ opacity: hasBases ? undefined : 0.7 }} + rightSection={ + !hasBases && ( + + {t("Upgrade")} + + ) + } + onClick={() => { + if (hasBases) insertBaseEmbedBlock(editor); + }} + > + {t("Base (Inline)")} + + )} {!templateMode && ( - } - onClick={() => insertBaseEmbedBlock(editor, { template: "kanban" })} - > - {t("Kanban")} - + + } + aria-disabled={!hasBases} + closeMenuOnClick={hasBases} + style={{ opacity: hasBases ? undefined : 0.7 }} + rightSection={ + !hasBases && ( + + {t("Upgrade")} + + ) + } + onClick={() => { + if (hasBases) insertBaseEmbedBlock(editor, { template: "kanban" }); + }} + > + {t("Kanban")} + + )} diff --git a/apps/client/src/features/editor/components/slash-menu/command-list.tsx b/apps/client/src/features/editor/components/slash-menu/command-list.tsx index d645e404f..885c056e2 100644 --- a/apps/client/src/features/editor/components/slash-menu/command-list.tsx +++ b/apps/client/src/features/editor/components/slash-menu/command-list.tsx @@ -10,6 +10,7 @@ import { Paper, ScrollArea, Text, + Tooltip, UnstyledButton, VisuallyHidden, } from "@mantine/core"; @@ -18,6 +19,7 @@ import clsx from "clsx"; import { useTranslation } from "react-i18next"; import { useHasFeature } from "@/ee/hooks/use-feature"; import { Feature } from "@/ee/features"; +import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; const CommandList = ({ items, @@ -37,11 +39,12 @@ const CommandList = ({ const [selectionAnnouncement, setSelectionAnnouncement] = useState(""); const hasBases = useHasFeature(Feature.BASES); - // Title must match the "Base (Inline)" item in menu-items.ts. Without the - // bases entitlement the item stays visible but disabled; an expired license - // the client can't detect falls through to a handled create failure. + const upgradeLabel = useUpgradeLabel(); + // Without the bases entitlement the item stays visible but inert; an + // expired license the client can't detect falls through to a handled + // create failure. const isItemDisabled = (item: SlashMenuItemType) => - !hasBases && item.title === "Base (Inline)"; + !hasBases && item.requiresBases === true; const flatItems = useMemo(() => { return Object.values(items).flat(); @@ -152,18 +155,22 @@ const CommandList = ({ const itemIndex = flatIndex; const disabled = isItemDisabled(item); return ( + selectItem(itemIndex)} className={clsx(classes.menuBtn, { [classes.selectedItem]: itemIndex === selectedIndex, - [classes.disabledItem]: disabled, + [classes.gatedItem]: disabled, })} > @@ -188,6 +195,7 @@ const CommandList = ({ )} + ); })} diff --git a/apps/client/src/features/editor/components/slash-menu/menu-items.ts b/apps/client/src/features/editor/components/slash-menu/menu-items.ts index 352bdb84c..0327acdde 100644 --- a/apps/client/src/features/editor/components/slash-menu/menu-items.ts +++ b/apps/client/src/features/editor/components/slash-menu/menu-items.ts @@ -366,6 +366,7 @@ const CommandGroups: SlashMenuGroupedItemsType = { description: "Insert an inline base on this page", searchTerms: ["base", "database", "table", "grid", "spreadsheet"], icon: IconTable, + requiresBases: true, command: ({ editor, range }: CommandProps) => { insertBaseEmbedBlock(editor, { range }); }, @@ -375,6 +376,7 @@ const CommandGroups: SlashMenuGroupedItemsType = { description: "Insert a kanban board on this page", searchTerms: ["kanban", "board", "cards", "status", "task", "database"], icon: IconLayoutKanban, + requiresBases: true, command: ({ editor, range }: CommandProps) => { insertBaseEmbedBlock(editor, { range, template: "kanban" }); }, diff --git a/apps/client/src/features/editor/components/slash-menu/slash-menu.module.css b/apps/client/src/features/editor/components/slash-menu/slash-menu.module.css index 24ad3ecc0..5ffe1e591 100644 --- a/apps/client/src/features/editor/components/slash-menu/slash-menu.module.css +++ b/apps/client/src/features/editor/components/slash-menu/slash-menu.module.css @@ -26,7 +26,6 @@ } } -.disabledItem { - opacity: 0.45; - cursor: not-allowed; +.gatedItem { + opacity: 0.7; } diff --git a/apps/client/src/features/editor/components/slash-menu/types.ts b/apps/client/src/features/editor/components/slash-menu/types.ts index cf5bd3e42..07e1f6a4f 100644 --- a/apps/client/src/features/editor/components/slash-menu/types.ts +++ b/apps/client/src/features/editor/components/slash-menu/types.ts @@ -21,6 +21,7 @@ export type SlashMenuItemType = { searchTerms: string[]; command: (props: CommandProps) => void; disable?: (editor: ReturnType) => boolean; + requiresBases?: true; }; export type SlashMenuGroupedItemsType = { From 4132dd597c956a27423607d008708c0e214690da Mon Sep 17 00:00:00 2001 From: Philip Okugbe <16838612+Philipinho@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:57:07 +0100 Subject: [PATCH 2/2] New Crowdin updates (#2323) --- .../public/locales/de-DE/translation.json | 138 +++++++++++++++++- .../public/locales/es-ES/translation.json | 138 +++++++++++++++++- .../public/locales/fr-FR/translation.json | 138 +++++++++++++++++- .../public/locales/it-IT/translation.json | 138 +++++++++++++++++- .../public/locales/ja-JP/translation.json | 138 +++++++++++++++++- .../public/locales/ko-KR/translation.json | 138 +++++++++++++++++- .../public/locales/nl-NL/translation.json | 138 +++++++++++++++++- .../public/locales/pt-BR/translation.json | 138 +++++++++++++++++- .../public/locales/ru-RU/translation.json | 138 +++++++++++++++++- .../public/locales/uk-UA/translation.json | 138 +++++++++++++++++- .../public/locales/zh-CN/translation.json | 138 +++++++++++++++++- 11 files changed, 1507 insertions(+), 11 deletions(-) diff --git a/apps/client/public/locales/de-DE/translation.json b/apps/client/public/locales/de-DE/translation.json index 19896cf35..f067ecc27 100644 --- a/apps/client/public/locales/de-DE/translation.json +++ b/apps/client/public/locales/de-DE/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Eigenschaft erstellen", "Hide properties": "Eigenschaften ausblenden", "Find a property type": "Einen Eigenschaftstyp finden", - "Properties": "Eigenschaften" + "Properties": "Eigenschaften", + "A property with this name already exists": "Eine Eigenschaft mit diesem Namen existiert bereits", + "Add card": "Karte hinzufügen", + "Add filter": "Filter hinzufügen", + "Add option": "Option hinzufügen", + "Add sort": "Sortierung hinzufügen", + "Add view": "Ansicht hinzufügen", + "All data in this column will be lost.": "Alle Daten in dieser Spalte gehen verloren.", + "Allow multiple people": "Mehrere Personen zulassen", + "Alphabetize": "Alphabetisch sortieren", + "Are you sure you want to delete": "Sind Sie sicher, dass Sie löschen möchten", + "Ascending": "Aufsteigend", + "Base deleted": "Base gelöscht", + "Base name": "Base-Name", + "Base table": "Base-Tabelle", + "Card properties": "Karteneigenschaften", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Zellen, die das Textlimit überschreiten, werden abgeschnitten und der zusätzliche Inhalt geht dauerhaft verloren.", + "Checkbox": "Kontrollkästchen", + "Checked by default": "Standardmäßig aktiviert", + "Choose a property": "Wählen Sie eine Eigenschaft", + "Clear selection": "Auswahl aufheben", + "Column options": "Spaltenoptionen", + "Comma, period": "Komma, Punkt", + "Complete": "Abgeschlossen", + "Contains": "Enthält", + "Copy link to view": "Link zur Ansicht kopieren", + "Create a status property": "Eine Statuseigenschaft erstellen", + "Created at": "Erstellt am", + "Currency": "Währung", + "Decimal places": "Dezimalstellen", + "Default value": "Standardwert", + "Delete property": "Eigenschaft löschen", + "Delete view": "Ansicht löschen", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Absteigend", + "Discard": "Verwerfen", + "Doesn't contain": "Enthält nicht", + "Done": "Fertig", + "Edit formula": "Formel bearbeiten", + "Edit property": "Eigenschaft bearbeiten", + "Export CSV": "CSV exportieren", + "Failed to load base": "Base konnte nicht geladen werden", + "False": "Falsch", + "File": "Datei", + "Filter and sort changes are visible only to you": "Änderungen an Filtern und Sortierungen sind nur für Sie sichtbar", + "Filter by": "Filtern nach", + "Formula": "Formel", + "Get started with": "Erste Schritte mit", + "Greater than": "Größer als", + "Group by": "Gruppieren nach", + "Group this board by a select or status property.": "Gruppieren Sie dieses Board nach einer Auswahl- oder Statuseigenschaft.", + "Hide all": "Alle ausblenden", + "Hide group": "Gruppe ausblenden", + "In Progress": "In Bearbeitung", + "In progress": "In Bearbeitung", + "Include time": "Uhrzeit einschließen", + "Insert a kanban board on this page": "Fügen Sie ein Kanban-Board auf dieser Seite ein", + "Insert an inline base on this page": "Fügen Sie eine Inline-Base auf dieser Seite ein", + "Is": "Ist", + "Is after": "Ist nach", + "Is any of": "Ist eines von", + "Is before": "Ist vor", + "Is empty": "Ist leer", + "Is none of": "Ist keines von", + "Is not": "Ist nicht", + "Is not empty": "Ist nicht leer", + "Is on or after": "Ist am oder nach", + "Is on or before": "Ist am oder vor", + "Is within": "Ist innerhalb von", + "Keep editing": "Weiter bearbeiten", + "Last edited at": "Zuletzt bearbeitet am", + "Last edited by": "Zuletzt bearbeitet von", + "Less than": "Kleiner als", + "Link copied to clipboard": "Link in die Zwischenablage kopiert", + "Local": "Lokal", + "Long text": "Langer Text", + "Moved card to {{column}}": "Karte nach {{column}} verschoben", + "Moved column to {{column}}": "Spalte nach {{column}} verschoben", + "Multi-select": "Mehrfachauswahl", + "New row": "Neue Zeile", + "Next month": "Nächster Monat", + "Next week": "Nächste Woche", + "Next year": "Nächstes Jahr", + "No filters applied": "Keine Filter angewendet", + "No match": "Keine Übereinstimmung", + "No options for this property type": "Keine Optionen für diesen Eigenschaftstyp", + "No sorts applied": "Keine Sortierungen angewendet", + "No value": "Kein Wert", + "None": "Keine", + "Not started": "Nicht begonnen", + "Number": "Zahl", + "One month ago": "Vor einem Monat", + "One month from now": "In einem Monat", + "One week ago": "Vor einer Woche", + "One week from now": "In einer Woche", + "Open as page": "Als Seite öffnen", + "Options": "Optionen", + "Past month": "Letzter Monat", + "Past week": "Letzte Woche", + "Past year": "Letztes Jahr", + "Percent": "Prozent", + "Period, comma": "Punkt, Komma", + "Person": "Person", + "Please enter a valid email": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "Progress": "Fortschritt", + "Property options": "Eigenschaftsoptionen", + "Relative": "Relativ", + "Rename property": "Eigenschaft umbenennen", + "Reset": "Zurücksetzen", + "Save for everyone": "Für alle speichern", + "Select": "Auswahl", + "Select a property": "Eigenschaft auswählen", + "Select all loaded rows": "Alle geladenen Zeilen auswählen", + "Show all": "Alle anzeigen", + "Sort": "Sortieren", + "Sort by": "Sortieren nach", + "Space, comma": "Leerzeichen, Komma", + "Space, period": "Leerzeichen, Punkt", + "This board has no grouping property yet.": "Dieses Board hat noch keine Gruppierungseigenschaft.", + "This month": "Diesen Monat", + "This year": "Dieses Jahr", + "Thousands and decimal separators": "Tausender- und Dezimaltrennzeichen", + "Time format": "Zeitformat", + "To Do": "Zu erledigen", + "Tomorrow": "Morgen", + "True": "Wahr", + "Unsaved changes": "Nicht gespeicherte Änderungen", + "Untitled base": "Unbenannte Base", + "URL": "URL", + "Value": "Wert", + "View updated for everyone": "Ansicht für alle aktualisiert", + "You have unsaved changes. Do you want to discard them?": "Sie haben nicht gespeicherte Änderungen. Möchten Sie sie verwerfen?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/es-ES/translation.json b/apps/client/public/locales/es-ES/translation.json index a1207211e..fd834a2c6 100644 --- a/apps/client/public/locales/es-ES/translation.json +++ b/apps/client/public/locales/es-ES/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Crear propiedad", "Hide properties": "Ocultar propiedades", "Find a property type": "Buscar un tipo de propiedad", - "Properties": "Propiedades" + "Properties": "Propiedades", + "A property with this name already exists": "Ya existe una propiedad con este nombre", + "Add card": "Agregar tarjeta", + "Add filter": "Agregar filtro", + "Add option": "Agregar opción", + "Add sort": "Agregar orden", + "Add view": "Agregar vista", + "All data in this column will be lost.": "Todos los datos de esta columna se perderán.", + "Allow multiple people": "Permitir varias personas", + "Alphabetize": "Ordenar alfabéticamente", + "Are you sure you want to delete": "¿Está seguro de que desea eliminar", + "Ascending": "Ascendente", + "Base deleted": "Base eliminada", + "Base name": "Nombre de la base", + "Base table": "Tabla base", + "Card properties": "Propiedades de la tarjeta", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Las celdas más largas que el límite de texto se truncarán y el contenido adicional se perderá permanentemente.", + "Checkbox": "Casilla de verificación", + "Checked by default": "Marcado por defecto", + "Choose a property": "Seleccione una propiedad", + "Clear selection": "Borrar selección", + "Column options": "Opciones de columna", + "Comma, period": "Coma, punto", + "Complete": "Completo", + "Contains": "Contiene", + "Copy link to view": "Copiar enlace a la vista", + "Create a status property": "Crear una propiedad de estado", + "Created at": "Creado el", + "Currency": "Moneda", + "Decimal places": "Decimales", + "Default value": "Valor predeterminado", + "Delete property": "Eliminar propiedad", + "Delete view": "Eliminar vista", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Descendente", + "Discard": "Descartar", + "Doesn't contain": "No contiene", + "Done": "Hecho", + "Edit formula": "Editar fórmula", + "Edit property": "Editar propiedad", + "Export CSV": "Exportar CSV", + "Failed to load base": "No se pudo cargar la base", + "False": "Falso", + "File": "Archivo", + "Filter and sort changes are visible only to you": "Los cambios de filtro y ordenación solo son visibles para usted", + "Filter by": "Filtrar por", + "Formula": "Fórmula", + "Get started with": "Comenzar con", + "Greater than": "Mayor que", + "Group by": "Agrupar por", + "Group this board by a select or status property.": "Agrupe este tablero por una propiedad de selección o estado.", + "Hide all": "Ocultar todo", + "Hide group": "Ocultar grupo", + "In Progress": "En curso", + "In progress": "En curso", + "Include time": "Incluir hora", + "Insert a kanban board on this page": "Insertar un tablero kanban en esta página", + "Insert an inline base on this page": "Insertar una base integrada en esta página", + "Is": "Es", + "Is after": "Es posterior a", + "Is any of": "Es cualquiera de", + "Is before": "Es anterior a", + "Is empty": "Está vacío", + "Is none of": "No es ninguno de", + "Is not": "No es", + "Is not empty": "No está vacío", + "Is on or after": "Es en o después de", + "Is on or before": "Es en o antes de", + "Is within": "Está dentro de", + "Keep editing": "Seguir editando", + "Last edited at": "Última edición el", + "Last edited by": "Última edición por", + "Less than": "Menor que", + "Link copied to clipboard": "Enlace copiado al portapapeles", + "Local": "Local", + "Long text": "Texto largo", + "Moved card to {{column}}": "Tarjeta movida a {{column}}", + "Moved column to {{column}}": "Columna movida a {{column}}", + "Multi-select": "Selección múltiple", + "New row": "Nueva fila", + "Next month": "Próximo mes", + "Next week": "Próxima semana", + "Next year": "Próximo año", + "No filters applied": "No hay filtros aplicados", + "No match": "Sin coincidencias", + "No options for this property type": "No hay opciones para este tipo de propiedad", + "No sorts applied": "No hay ordenaciones aplicadas", + "No value": "Sin valor", + "None": "Ninguno", + "Not started": "No iniciado", + "Number": "Número", + "One month ago": "Hace un mes", + "One month from now": "Dentro de un mes", + "One week ago": "Hace una semana", + "One week from now": "Dentro de una semana", + "Open as page": "Abrir como página", + "Options": "Opciones", + "Past month": "Último mes", + "Past week": "Última semana", + "Past year": "Último año", + "Percent": "Porcentaje", + "Period, comma": "Punto, coma", + "Person": "Persona", + "Please enter a valid email": "Por favor, introduzca un correo electrónico válido", + "Progress": "Progreso", + "Property options": "Opciones de propiedad", + "Relative": "Relativo", + "Rename property": "Renombrar propiedad", + "Reset": "Restablecer", + "Save for everyone": "Guardar para todos", + "Select": "Selección", + "Select a property": "Seleccionar una propiedad", + "Select all loaded rows": "Seleccionar todas las filas cargadas", + "Show all": "Mostrar todo", + "Sort": "Ordenar", + "Sort by": "Ordenar por", + "Space, comma": "Espacio, coma", + "Space, period": "Espacio, punto", + "This board has no grouping property yet.": "Este tablero aún no tiene una propiedad de agrupación.", + "This month": "Este mes", + "This year": "Este año", + "Thousands and decimal separators": "Separadores de miles y decimales", + "Time format": "Formato de hora", + "To Do": "Por hacer", + "Tomorrow": "Mañana", + "True": "Verdadero", + "Unsaved changes": "Cambios no guardados", + "Untitled base": "Base sin título", + "URL": "URL", + "Value": "Valor", + "View updated for everyone": "Vista actualizada para todos", + "You have unsaved changes. Do you want to discard them?": "Tiene cambios no guardados. ¿Quiere descartarlos?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/fr-FR/translation.json b/apps/client/public/locales/fr-FR/translation.json index c218d936f..04ebbc6ad 100644 --- a/apps/client/public/locales/fr-FR/translation.json +++ b/apps/client/public/locales/fr-FR/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Créer une propriété", "Hide properties": "Masquer les propriétés", "Find a property type": "Rechercher un type de propriété", - "Properties": "Propriétés" + "Properties": "Propriétés", + "A property with this name already exists": "Une propriété portant ce nom existe déjà", + "Add card": "Ajouter une carte", + "Add filter": "Ajouter un filtre", + "Add option": "Ajouter une option", + "Add sort": "Ajouter un tri", + "Add view": "Ajouter une vue", + "All data in this column will be lost.": "Toutes les données de cette colonne seront perdues.", + "Allow multiple people": "Autoriser plusieurs personnes", + "Alphabetize": "Trier par ordre alphabétique", + "Are you sure you want to delete": "Êtes-vous sûr de vouloir supprimer", + "Ascending": "Croissant", + "Base deleted": "Base supprimée", + "Base name": "Nom de la base", + "Base table": "Table de base", + "Card properties": "Propriétés de la carte", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Les cellules dépassant la limite de texte seront tronquées et le contenu supplémentaire sera définitivement perdu.", + "Checkbox": "Case à cocher", + "Checked by default": "Coché par défaut", + "Choose a property": "Choisir une propriété", + "Clear selection": "Effacer la sélection", + "Column options": "Options de la colonne", + "Comma, period": "Virgule, point", + "Complete": "Terminé", + "Contains": "Contient", + "Copy link to view": "Copier le lien vers la vue", + "Create a status property": "Créer une propriété de statut", + "Created at": "Créé le", + "Currency": "Devise", + "Decimal places": "Décimales", + "Default value": "Valeur par défaut", + "Delete property": "Supprimer la propriété", + "Delete view": "Supprimer la vue", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Décroissant", + "Discard": "Ignorer", + "Doesn't contain": "Ne contient pas", + "Done": "Terminé", + "Edit formula": "Modifier la formule", + "Edit property": "Modifier la propriété", + "Export CSV": "Exporter en CSV", + "Failed to load base": "Échec du chargement de la base", + "False": "Faux", + "File": "Fichier", + "Filter and sort changes are visible only to you": "Les modifications de filtre et de tri ne sont visibles que par vous", + "Filter by": "Filtrer par", + "Formula": "Formule", + "Get started with": "Commencer avec", + "Greater than": "Supérieur à", + "Group by": "Grouper par", + "Group this board by a select or status property.": "Groupez ce tableau par une propriété de sélection ou de statut.", + "Hide all": "Tout masquer", + "Hide group": "Masquer le groupe", + "In Progress": "En cours", + "In progress": "En cours", + "Include time": "Inclure l'heure", + "Insert a kanban board on this page": "Insérer un tableau kanban sur cette page", + "Insert an inline base on this page": "Insérer une base intégrée sur cette page", + "Is": "Est", + "Is after": "Est après", + "Is any of": "Est l'un de", + "Is before": "Est avant", + "Is empty": "Est vide", + "Is none of": "N'est aucun de", + "Is not": "N'est pas", + "Is not empty": "N'est pas vide", + "Is on or after": "Est le ou après le", + "Is on or before": "Est le ou avant le", + "Is within": "Est dans la plage", + "Keep editing": "Continuer la modification", + "Last edited at": "Dernière modification le", + "Last edited by": "Dernière modification par", + "Less than": "Inférieur à", + "Link copied to clipboard": "Lien copié dans le presse-papiers", + "Local": "Local", + "Long text": "Texte long", + "Moved card to {{column}}": "Carte déplacée vers {{column}}", + "Moved column to {{column}}": "Colonne déplacée vers {{column}}", + "Multi-select": "Sélection multiple", + "New row": "Nouvelle ligne", + "Next month": "Le mois prochain", + "Next week": "La semaine prochaine", + "Next year": "L'année prochaine", + "No filters applied": "Aucun filtre appliqué", + "No match": "Aucune correspondance", + "No options for this property type": "Aucune option pour ce type de propriété", + "No sorts applied": "Aucun tri appliqué", + "No value": "Aucune valeur", + "None": "Aucun", + "Not started": "Non commencé", + "Number": "Nombre", + "One month ago": "Il y a un mois", + "One month from now": "Dans un mois", + "One week ago": "Il y a une semaine", + "One week from now": "Dans une semaine", + "Open as page": "Ouvrir comme page", + "Options": "Options", + "Past month": "Le mois dernier", + "Past week": "La semaine dernière", + "Past year": "L'année dernière", + "Percent": "Pourcentage", + "Period, comma": "Point, virgule", + "Person": "Personne", + "Please enter a valid email": "Veuillez entrer une adresse e-mail valide", + "Progress": "Progression", + "Property options": "Options de la propriété", + "Relative": "Relatif", + "Rename property": "Renommer la propriété", + "Reset": "Réinitialiser", + "Save for everyone": "Enregistrer pour tout le monde", + "Select": "Sélection", + "Select a property": "Sélectionner une propriété", + "Select all loaded rows": "Sélectionner toutes les lignes chargées", + "Show all": "Tout afficher", + "Sort": "Trier", + "Sort by": "Trier par", + "Space, comma": "Espace, virgule", + "Space, period": "Espace, point", + "This board has no grouping property yet.": "Ce tableau n'a pas encore de propriété de groupement.", + "This month": "Ce mois-ci", + "This year": "Cette année", + "Thousands and decimal separators": "Séparateurs des milliers et des décimales", + "Time format": "Format de l'heure", + "To Do": "À faire", + "Tomorrow": "Demain", + "True": "Vrai", + "Unsaved changes": "Modifications non enregistrées", + "Untitled base": "Base sans titre", + "URL": "URL", + "Value": "Valeur", + "View updated for everyone": "Vue mise à jour pour tout le monde", + "You have unsaved changes. Do you want to discard them?": "Vous avez des modifications non enregistrées. Voulez-vous les ignorer ?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/it-IT/translation.json b/apps/client/public/locales/it-IT/translation.json index b6ecb70d6..e3aaa82ce 100644 --- a/apps/client/public/locales/it-IT/translation.json +++ b/apps/client/public/locales/it-IT/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Crea proprietà", "Hide properties": "Nascondi proprietà", "Find a property type": "Trova un tipo di proprietà", - "Properties": "Proprietà" + "Properties": "Proprietà", + "A property with this name already exists": "Esiste già una proprietà con questo nome", + "Add card": "Aggiungi scheda", + "Add filter": "Aggiungi filtro", + "Add option": "Aggiungi opzione", + "Add sort": "Aggiungi ordinamento", + "Add view": "Aggiungi vista", + "All data in this column will be lost.": "Tutti i dati in questa colonna andranno persi.", + "Allow multiple people": "Consenti più persone", + "Alphabetize": "Ordina alfabeticamente", + "Are you sure you want to delete": "Sei sicuro di voler eliminare", + "Ascending": "Crescente", + "Base deleted": "Base eliminata", + "Base name": "Nome della base", + "Base table": "Tabella della base", + "Card properties": "Proprietà della scheda", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Le celle più lunghe del limite del testo verranno troncate e il contenuto aggiuntivo andrà perso in modo permanente.", + "Checkbox": "Casella di controllo", + "Checked by default": "Selezionata per impostazione predefinita", + "Choose a property": "Scegli una proprietà", + "Clear selection": "Cancella selezione", + "Column options": "Opzioni della colonna", + "Comma, period": "Virgola, punto", + "Complete": "Completato", + "Contains": "Contiene", + "Copy link to view": "Copia link alla vista", + "Create a status property": "Crea una proprietà di stato", + "Created at": "Creato il", + "Currency": "Valuta", + "Decimal places": "Posizioni decimali", + "Default value": "Valore predefinito", + "Delete property": "Elimina proprietà", + "Delete view": "Elimina vista", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Decrescente", + "Discard": "Ignora", + "Doesn't contain": "Non contiene", + "Done": "Fatto", + "Edit formula": "Modifica formula", + "Edit property": "Modifica proprietà", + "Export CSV": "Esporta CSV", + "Failed to load base": "Impossibile caricare la base", + "False": "Falso", + "File": "File", + "Filter and sort changes are visible only to you": "Le modifiche a filtri e ordinamenti sono visibili solo a te", + "Filter by": "Filtra per", + "Formula": "Formula", + "Get started with": "Inizia con", + "Greater than": "Maggiore di", + "Group by": "Raggruppa per", + "Group this board by a select or status property.": "Raggruppa questa bacheca per una proprietà di selezione o di stato.", + "Hide all": "Nascondi tutto", + "Hide group": "Nascondi gruppo", + "In Progress": "In corso", + "In progress": "In corso", + "Include time": "Includi ora", + "Insert a kanban board on this page": "Inserisci una bacheca kanban in questa pagina", + "Insert an inline base on this page": "Inserisci una base in linea in questa pagina", + "Is": "È", + "Is after": "È dopo", + "Is any of": "È uno tra", + "Is before": "È prima", + "Is empty": "È vuoto", + "Is none of": "Non è nessuno di", + "Is not": "Non è", + "Is not empty": "Non è vuoto", + "Is on or after": "È il o dopo il", + "Is on or before": "È il o prima del", + "Is within": "È entro", + "Keep editing": "Continua a modificare", + "Last edited at": "Ultima modifica il", + "Last edited by": "Ultima modifica di", + "Less than": "Minore di", + "Link copied to clipboard": "Link copiato negli appunti", + "Local": "Locale", + "Long text": "Testo lungo", + "Moved card to {{column}}": "Scheda spostata in {{column}}", + "Moved column to {{column}}": "Colonna spostata in {{column}}", + "Multi-select": "Selezione multipla", + "New row": "Nuova riga", + "Next month": "Prossimo mese", + "Next week": "Prossima settimana", + "Next year": "Prossimo anno", + "No filters applied": "Nessun filtro applicato", + "No match": "Nessuna corrispondenza", + "No options for this property type": "Nessuna opzione per questo tipo di proprietà", + "No sorts applied": "Nessun ordinamento applicato", + "No value": "Nessun valore", + "None": "Nessuno", + "Not started": "Non iniziato", + "Number": "Numero", + "One month ago": "Un mese fa", + "One month from now": "Tra un mese", + "One week ago": "Una settimana fa", + "One week from now": "Tra una settimana", + "Open as page": "Apri come pagina", + "Options": "Opzioni", + "Past month": "Mese scorso", + "Past week": "Settimana scorsa", + "Past year": "Anno scorso", + "Percent": "Percentuale", + "Period, comma": "Punto, virgola", + "Person": "Persona", + "Please enter a valid email": "Inserisci un indirizzo email valido", + "Progress": "Avanzamento", + "Property options": "Opzioni della proprietà", + "Relative": "Relativo", + "Rename property": "Rinomina proprietà", + "Reset": "Reimposta", + "Save for everyone": "Salva per tutti", + "Select": "Seleziona", + "Select a property": "Seleziona una proprietà", + "Select all loaded rows": "Seleziona tutte le righe caricate", + "Show all": "Mostra tutto", + "Sort": "Ordina", + "Sort by": "Ordina per", + "Space, comma": "Spazio, virgola", + "Space, period": "Spazio, punto", + "This board has no grouping property yet.": "Questa bacheca non ha ancora una proprietà di raggruppamento.", + "This month": "Questo mese", + "This year": "Quest'anno", + "Thousands and decimal separators": "Separatori delle migliaia e dei decimali", + "Time format": "Formato ora", + "To Do": "Da fare", + "Tomorrow": "Domani", + "True": "Vero", + "Unsaved changes": "Modifiche non salvate", + "Untitled base": "Base senza titolo", + "URL": "URL", + "Value": "Valore", + "View updated for everyone": "Vista aggiornata per tutti", + "You have unsaved changes. Do you want to discard them?": "Hai modifiche non salvate. Vuoi ignorarle?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/ja-JP/translation.json b/apps/client/public/locales/ja-JP/translation.json index 49a88fc09..e408bfda8 100644 --- a/apps/client/public/locales/ja-JP/translation.json +++ b/apps/client/public/locales/ja-JP/translation.json @@ -1153,5 +1153,141 @@ "Create property": "プロパティを作成", "Hide properties": "プロパティを非表示", "Find a property type": "プロパティの種類を検索", - "Properties": "プロパティ" + "Properties": "プロパティ", + "A property with this name already exists": "この名前のプロパティはすでに存在します", + "Add card": "カードを追加", + "Add filter": "フィルターを追加", + "Add option": "オプションを追加", + "Add sort": "並べ替えを追加", + "Add view": "ビューを追加", + "All data in this column will be lost.": "この列内のすべてのデータは失われます。", + "Allow multiple people": "複数のユーザーを許可", + "Alphabetize": "アルファベット順", + "Are you sure you want to delete": "削除してもよろしいですか", + "Ascending": "昇順", + "Base deleted": "ベースを削除しました", + "Base name": "ベース名", + "Base table": "ベーステーブル", + "Card properties": "カードのプロパティ", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "テキストの制限を超える長さのセルは切り詰められ、超過分の内容は完全に失われます。", + "Checkbox": "チェックボックス", + "Checked by default": "デフォルトでチェックを入れる", + "Choose a property": "プロパティを選択", + "Clear selection": "選択をクリア", + "Column options": "列のオプション", + "Comma, period": "カンマ、小数点", + "Complete": "完了", + "Contains": "含む", + "Copy link to view": "ビューへのリンクをコピー", + "Create a status property": "ステータスプロパティを作成", + "Created at": "作成日時", + "Currency": "通貨", + "Decimal places": "小数点以下の桁数", + "Default value": "デフォルト値", + "Delete property": "プロパティを削除", + "Delete view": "ビューを削除", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "降順", + "Discard": "破棄", + "Doesn't contain": "含まない", + "Done": "完了", + "Edit formula": "数式を編集", + "Edit property": "プロパティを編集", + "Export CSV": "CSVをエクスポート", + "Failed to load base": "ベースの読み込みに失敗しました", + "False": "偽", + "File": "ファイル", + "Filter and sort changes are visible only to you": "フィルターと並べ替えの変更は自分にのみ表示されます", + "Filter by": "条件", + "Formula": "数式", + "Get started with": "次から始める", + "Greater than": "より大きい", + "Group by": "グループ化", + "Group this board by a select or status property.": "このボードをセレクトまたはステータスのプロパティでグループ化します。", + "Hide all": "すべて非表示", + "Hide group": "グループを非表示", + "In Progress": "進行中", + "In progress": "進行中", + "Include time": "時刻を含める", + "Insert a kanban board on this page": "このページにカンバンボードを挿入", + "Insert an inline base on this page": "このページにインラインベースを挿入", + "Is": "次に等しい", + "Is after": "次より後", + "Is any of": "次のいずれか", + "Is before": "次より前", + "Is empty": "空である", + "Is none of": "次のいずれでもない", + "Is not": "次に等しくない", + "Is not empty": "空ではない", + "Is on or after": "次以降", + "Is on or before": "次以前", + "Is within": "次の期間内", + "Keep editing": "編集を続ける", + "Last edited at": "最終編集日時", + "Last edited by": "最終編集者", + "Less than": "より小さい", + "Link copied to clipboard": "リンクをクリップボードにコピーしました", + "Local": "ローカル", + "Long text": "長いテキスト", + "Moved card to {{column}}": "カードを{{column}}に移動しました", + "Moved column to {{column}}": "列を{{column}}に移動しました", + "Multi-select": "複数選択", + "New row": "新規行", + "Next month": "来月", + "Next week": "来週", + "Next year": "来年", + "No filters applied": "フィルターは適用されていません", + "No match": "一致なし", + "No options for this property type": "このプロパティタイプにはオプションがありません", + "No sorts applied": "並べ替えは適用されていません", + "No value": "値なし", + "None": "なし", + "Not started": "未着手", + "Number": "数値", + "One month ago": "1か月前", + "One month from now": "1か月後", + "One week ago": "1週間前", + "One week from now": "1週間後", + "Open as page": "ページとして開く", + "Options": "オプション", + "Past month": "先月", + "Past week": "先週", + "Past year": "昨年", + "Percent": "パーセント", + "Period, comma": "小数点、カンマ", + "Person": "ユーザー", + "Please enter a valid email": "有効なメールアドレスを入力してください", + "Progress": "進捗", + "Property options": "プロパティのオプション", + "Relative": "相対", + "Rename property": "プロパティ名を変更", + "Reset": "リセット", + "Save for everyone": "全員に保存", + "Select": "選択", + "Select a property": "プロパティを選択", + "Select all loaded rows": "読み込まれているすべての行を選択", + "Show all": "すべて表示", + "Sort": "並べ替え", + "Sort by": "並べ替え条件", + "Space, comma": "スペース、カンマ", + "Space, period": "スペース、小数点", + "This board has no grouping property yet.": "このボードにはまだグループ化プロパティがありません。", + "This month": "今月", + "This year": "今年", + "Thousands and decimal separators": "桁区切りと小数点区切り", + "Time format": "時刻形式", + "To Do": "To Do", + "Tomorrow": "明日", + "True": "真", + "Unsaved changes": "未保存の変更", + "Untitled base": "無題のベース", + "URL": "URL", + "Value": "値", + "View updated for everyone": "ビューが全員向けに更新されました", + "You have unsaved changes. Do you want to discard them?": "未保存の変更があります。破棄しますか?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/ko-KR/translation.json b/apps/client/public/locales/ko-KR/translation.json index a1487374d..fb8e9884a 100644 --- a/apps/client/public/locales/ko-KR/translation.json +++ b/apps/client/public/locales/ko-KR/translation.json @@ -1153,5 +1153,141 @@ "Create property": "속성 만들기", "Hide properties": "속성 숨기기", "Find a property type": "속성 유형 찾기", - "Properties": "속성" + "Properties": "속성", + "A property with this name already exists": "이 이름의 속성이 이미 있습니다", + "Add card": "카드 추가", + "Add filter": "필터 추가", + "Add option": "옵션 추가", + "Add sort": "정렬 추가", + "Add view": "보기 추가", + "All data in this column will be lost.": "이 열의 모든 데이터가 손실됩니다.", + "Allow multiple people": "여러 사람 허용", + "Alphabetize": "가나다순", + "Are you sure you want to delete": "삭제하시겠습니까", + "Ascending": "오름차순", + "Base deleted": "베이스가 삭제됨", + "Base name": "베이스 이름", + "Base table": "베이스 테이블", + "Card properties": "카드 속성", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "텍스트 제한보다 긴 셀은 잘리며, 초과된 콘텐츠는 영구적으로 손실됩니다.", + "Checkbox": "체크박스", + "Checked by default": "기본적으로 선택됨", + "Choose a property": "속성 선택", + "Clear selection": "선택 지우기", + "Column options": "열 옵션", + "Comma, period": "쉼표, 마침표", + "Complete": "완료", + "Contains": "포함", + "Copy link to view": "보기 링크 복사", + "Create a status property": "상태 속성 만들기", + "Created at": "작성 시간", + "Currency": "통화", + "Decimal places": "소수 자릿수", + "Default value": "기본값", + "Delete property": "속성 삭제", + "Delete view": "보기 삭제", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "내림차순", + "Discard": "삭제", + "Doesn't contain": "포함하지 않음", + "Done": "완료", + "Edit formula": "수식 편집", + "Edit property": "속성 편집", + "Export CSV": "CSV 내보내기", + "Failed to load base": "베이스를 불러오지 못했습니다", + "False": "거짓", + "File": "파일", + "Filter and sort changes are visible only to you": "필터 및 정렬 변경 사항은 나에게만 표시됩니다", + "Filter by": "필터 기준", + "Formula": "수식", + "Get started with": "시작하기", + "Greater than": "보다 큼", + "Group by": "그룹화 기준", + "Group this board by a select or status property.": "선택 또는 상태 속성으로 이 보드를 그룹화하세요.", + "Hide all": "모두 숨기기", + "Hide group": "그룹 숨기기", + "In Progress": "진행 중", + "In progress": "진행 중", + "Include time": "시간 포함", + "Insert a kanban board on this page": "이 페이지에 칸반 보드 삽입", + "Insert an inline base on this page": "이 페이지에 인라인 베이스 삽입", + "Is": "같음", + "Is after": "이후", + "Is any of": "다음 중 하나와 같음", + "Is before": "이전", + "Is empty": "비어 있음", + "Is none of": "다음 중 어느 것과도 같지 않음", + "Is not": "같지 않음", + "Is not empty": "비어 있지 않음", + "Is on or after": "해당 날짜 또는 이후", + "Is on or before": "해당 날짜 또는 이전", + "Is within": "다음 범위 내", + "Keep editing": "계속 편집", + "Last edited at": "마지막 편집 시간", + "Last edited by": "마지막 편집자", + "Less than": "보다 작음", + "Link copied to clipboard": "링크가 클립보드에 복사됨", + "Local": "로컬", + "Long text": "긴 텍스트", + "Moved card to {{column}}": "카드를 {{column}}(으)로 이동함", + "Moved column to {{column}}": "열을 {{column}}(으)로 이동함", + "Multi-select": "다중 선택", + "New row": "새 행", + "Next month": "다음 달", + "Next week": "다음 주", + "Next year": "내년", + "No filters applied": "적용된 필터 없음", + "No match": "일치하는 항목 없음", + "No options for this property type": "이 속성 유형에는 옵션이 없습니다", + "No sorts applied": "적용된 정렬 없음", + "No value": "값 없음", + "None": "없음", + "Not started": "시작 전", + "Number": "숫자", + "One month ago": "한 달 전", + "One month from now": "한 달 후", + "One week ago": "일주일 전", + "One week from now": "일주일 후", + "Open as page": "페이지로 열기", + "Options": "옵션", + "Past month": "지난달", + "Past week": "지난주", + "Past year": "작년", + "Percent": "백분율", + "Period, comma": "마침표, 쉼표", + "Person": "사람", + "Please enter a valid email": "유효한 이메일을 입력하세요", + "Progress": "진행률", + "Property options": "속성 옵션", + "Relative": "상대값", + "Rename property": "속성 이름 변경", + "Reset": "재설정", + "Save for everyone": "모든 사용자에게 저장", + "Select": "선택", + "Select a property": "속성 선택", + "Select all loaded rows": "불러온 모든 행 선택", + "Show all": "모두 보기", + "Sort": "정렬", + "Sort by": "정렬 기준", + "Space, comma": "공백, 쉼표", + "Space, period": "공백, 마침표", + "This board has no grouping property yet.": "이 보드에는 아직 그룹화 속성이 없습니다.", + "This month": "이번 달", + "This year": "올해", + "Thousands and decimal separators": "천 단위 및 소수 구분 기호", + "Time format": "시간 형식", + "To Do": "할 일", + "Tomorrow": "내일", + "True": "참", + "Unsaved changes": "저장되지 않은 변경 사항", + "Untitled base": "제목 없는 베이스", + "URL": "URL", + "Value": "값", + "View updated for everyone": "보기가 모두에게 업데이트되었습니다", + "You have unsaved changes. Do you want to discard them?": "저장되지 않은 변경 사항이 있습니다. 버리시겠습니까?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/nl-NL/translation.json b/apps/client/public/locales/nl-NL/translation.json index 31c34107f..59c1d7a73 100644 --- a/apps/client/public/locales/nl-NL/translation.json +++ b/apps/client/public/locales/nl-NL/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Eigenschap aanmaken", "Hide properties": "Eigenschappen verbergen", "Find a property type": "Een eigenschapstype zoeken", - "Properties": "Eigenschappen" + "Properties": "Eigenschappen", + "A property with this name already exists": "Er bestaat al een eigenschap met deze naam", + "Add card": "Kaart toevoegen", + "Add filter": "Filter toevoegen", + "Add option": "Optie toevoegen", + "Add sort": "Sortering toevoegen", + "Add view": "Weergave toevoegen", + "All data in this column will be lost.": "Alle gegevens in deze kolom gaan verloren.", + "Allow multiple people": "Meerdere personen toestaan", + "Alphabetize": "Alfabetisch sorteren", + "Are you sure you want to delete": "Weet je zeker dat je wilt verwijderen", + "Ascending": "Oplopend", + "Base deleted": "Base verwijderd", + "Base name": "Basenaam", + "Base table": "Basistabel", + "Card properties": "Kaarteigenschappen", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Cellen die langer zijn dan de tekstlimiet worden afgekapt en de extra inhoud gaat permanent verloren.", + "Checkbox": "Selectievakje", + "Checked by default": "Standaard aangevinkt", + "Choose a property": "Kies een eigenschap", + "Clear selection": "Selectie wissen", + "Column options": "Kolomopties", + "Comma, period": "Komma, punt", + "Complete": "Voltooid", + "Contains": "Bevat", + "Copy link to view": "Link naar weergave kopiëren", + "Create a status property": "Een statuseigenschap maken", + "Created at": "Aangemaakt op", + "Currency": "Valuta", + "Decimal places": "Decimalen", + "Default value": "Standaardwaarde", + "Delete property": "Eigenschap verwijderen", + "Delete view": "Weergave verwijderen", + "Delete {{count}} rows?_one": "1 rij verwijderen?", + "Delete {{count}} rows?_other": "{{count}} rijen verwijderen?", + "Descending": "Aflopend", + "Discard": "Negeren", + "Doesn't contain": "Bevat niet", + "Done": "Klaar", + "Edit formula": "Formule bewerken", + "Edit property": "Eigenschap bewerken", + "Export CSV": "CSV exporteren", + "Failed to load base": "Base laden mislukt", + "False": "Onwaar", + "File": "Bestand", + "Filter and sort changes are visible only to you": "Wijzigingen in filters en sortering zijn alleen zichtbaar voor jou", + "Filter by": "Filteren op", + "Formula": "Formule", + "Get started with": "Aan de slag met", + "Greater than": "Groter dan", + "Group by": "Groeperen op", + "Group this board by a select or status property.": "Groepeer dit bord op een selectie- of statuseigenschap.", + "Hide all": "Alles verbergen", + "Hide group": "Groep verbergen", + "In Progress": "In uitvoering", + "In progress": "In uitvoering", + "Include time": "Tijd opnemen", + "Insert a kanban board on this page": "Voeg een kanbanbord in op deze pagina", + "Insert an inline base on this page": "Voeg een inline base in op deze pagina", + "Is": "Is", + "Is after": "Is na", + "Is any of": "Is een van", + "Is before": "Is vóór", + "Is empty": "Is leeg", + "Is none of": "Is geen van", + "Is not": "Is niet", + "Is not empty": "Is niet leeg", + "Is on or after": "Is op of na", + "Is on or before": "Is op of vóór", + "Is within": "Is binnen", + "Keep editing": "Doorgaan met bewerken", + "Last edited at": "Laatst bewerkt op", + "Last edited by": "Laatst bewerkt door", + "Less than": "Kleiner dan", + "Link copied to clipboard": "Link gekopieerd naar klembord", + "Local": "Lokaal", + "Long text": "Lange tekst", + "Moved card to {{column}}": "Kaart verplaatst naar {{column}}", + "Moved column to {{column}}": "Kolom verplaatst naar {{column}}", + "Multi-select": "Meervoudige selectie", + "New row": "Nieuwe rij", + "Next month": "Volgende maand", + "Next week": "Volgende week", + "Next year": "Volgend jaar", + "No filters applied": "Geen filters toegepast", + "No match": "Geen overeenkomst", + "No options for this property type": "Geen opties voor dit eigenschapstype", + "No sorts applied": "Geen sorteringen toegepast", + "No value": "Geen waarde", + "None": "Geen", + "Not started": "Niet gestart", + "Number": "Getal", + "One month ago": "Een maand geleden", + "One month from now": "Over een maand", + "One week ago": "Een week geleden", + "One week from now": "Over een week", + "Open as page": "Openen als pagina", + "Options": "Opties", + "Past month": "Afgelopen maand", + "Past week": "Afgelopen week", + "Past year": "Afgelopen jaar", + "Percent": "Procent", + "Period, comma": "Punt, komma", + "Person": "Persoon", + "Please enter a valid email": "Voer een geldig e-mailadres in", + "Progress": "Voortgang", + "Property options": "Eigenschapopties", + "Relative": "Relatief", + "Rename property": "Eigenschap hernoemen", + "Reset": "Opnieuw instellen", + "Save for everyone": "Opslaan voor iedereen", + "Select": "Selecteren", + "Select a property": "Selecteer een eigenschap", + "Select all loaded rows": "Alle geladen rijen selecteren", + "Show all": "Alles tonen", + "Sort": "Sorteren", + "Sort by": "Sorteren op", + "Space, comma": "Spatie, komma", + "Space, period": "Spatie, punt", + "This board has no grouping property yet.": "Dit bord heeft nog geen groeperingseigenschap.", + "This month": "Deze maand", + "This year": "Dit jaar", + "Thousands and decimal separators": "Scheidingstekens voor duizendtallen en decimalen", + "Time format": "Tijdnotatie", + "To Do": "Te doen", + "Tomorrow": "Morgen", + "True": "Waar", + "Unsaved changes": "Niet-opgeslagen wijzigingen", + "Untitled base": "Base zonder titel", + "URL": "URL", + "Value": "Waarde", + "View updated for everyone": "Weergave bijgewerkt voor iedereen", + "You have unsaved changes. Do you want to discard them?": "Je hebt niet-opgeslagen wijzigingen. Wil je deze negeren?", + "{{count}} rows deleted_one": "1 rij verwijderd", + "{{count}} rows deleted_other": "{{count}} rijen verwijderd", + "{{count}} selected_one": "1 geselecteerd", + "{{count}} selected_other": "{{count}} geselecteerd" } diff --git a/apps/client/public/locales/pt-BR/translation.json b/apps/client/public/locales/pt-BR/translation.json index 73cf4daec..2e4cd89ef 100644 --- a/apps/client/public/locales/pt-BR/translation.json +++ b/apps/client/public/locales/pt-BR/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Criar propriedade", "Hide properties": "Ocultar propriedades", "Find a property type": "Encontrar um tipo de propriedade", - "Properties": "Propriedades" + "Properties": "Propriedades", + "A property with this name already exists": "Já existe uma propriedade com este nome", + "Add card": "Adicionar cartão", + "Add filter": "Adicionar filtro", + "Add option": "Adicionar opção", + "Add sort": "Adicionar ordenação", + "Add view": "Adicionar visualização", + "All data in this column will be lost.": "Todos os dados nesta coluna serão perdidos.", + "Allow multiple people": "Permitir várias pessoas", + "Alphabetize": "Ordenar alfabeticamente", + "Are you sure you want to delete": "Tem certeza de que deseja excluir", + "Ascending": "Crescente", + "Base deleted": "Base excluída", + "Base name": "Nome da base", + "Base table": "Tabela da base", + "Card properties": "Propriedades do cartão", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Células maiores do que o limite de Texto serão truncadas e o conteúdo extra será perdido permanentemente.", + "Checkbox": "Caixa de seleção", + "Checked by default": "Marcado por padrão", + "Choose a property": "Escolha uma propriedade", + "Clear selection": "Limpar seleção", + "Column options": "Opções da coluna", + "Comma, period": "Vírgula, ponto", + "Complete": "Concluído", + "Contains": "Contém", + "Copy link to view": "Copiar link da visualização", + "Create a status property": "Criar uma propriedade de status", + "Created at": "Criado em", + "Currency": "Moeda", + "Decimal places": "Casas decimais", + "Default value": "Valor padrão", + "Delete property": "Excluir propriedade", + "Delete view": "Excluir visualização", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "Decrescente", + "Discard": "Descartar", + "Doesn't contain": "Não contém", + "Done": "Concluído", + "Edit formula": "Editar fórmula", + "Edit property": "Editar propriedade", + "Export CSV": "Exportar CSV", + "Failed to load base": "Falha ao carregar a base", + "False": "Falso", + "File": "Arquivo", + "Filter and sort changes are visible only to you": "As alterações de filtro e ordenação são visíveis somente para você", + "Filter by": "Filtrar por", + "Formula": "Fórmula", + "Get started with": "Começar com", + "Greater than": "Maior que", + "Group by": "Agrupar por", + "Group this board by a select or status property.": "Agrupe este quadro por uma propriedade de seleção ou status.", + "Hide all": "Ocultar tudo", + "Hide group": "Ocultar grupo", + "In Progress": "Em andamento", + "In progress": "Em andamento", + "Include time": "Incluir hora", + "Insert a kanban board on this page": "Inserir um quadro kanban nesta página", + "Insert an inline base on this page": "Inserir uma base inline nesta página", + "Is": "É", + "Is after": "É depois de", + "Is any of": "É qualquer um de", + "Is before": "É antes de", + "Is empty": "Está vazio", + "Is none of": "Não é nenhum de", + "Is not": "Não é", + "Is not empty": "Não está vazio", + "Is on or after": "É em ou depois de", + "Is on or before": "É em ou antes de", + "Is within": "Está dentro de", + "Keep editing": "Continuar editando", + "Last edited at": "Última edição em", + "Last edited by": "Última edição por", + "Less than": "Menor que", + "Link copied to clipboard": "Link copiado para a área de transferência", + "Local": "Local", + "Long text": "Texto longo", + "Moved card to {{column}}": "Cartão movido para {{column}}", + "Moved column to {{column}}": "Coluna movida para {{column}}", + "Multi-select": "Seleção múltipla", + "New row": "Nova linha", + "Next month": "Próximo mês", + "Next week": "Próxima semana", + "Next year": "Próximo ano", + "No filters applied": "Nenhum filtro aplicado", + "No match": "Sem correspondência", + "No options for this property type": "Sem opções para este tipo de propriedade", + "No sorts applied": "Nenhuma ordenação aplicada", + "No value": "Sem valor", + "None": "Nenhum", + "Not started": "Não iniciado", + "Number": "Número", + "One month ago": "Há um mês", + "One month from now": "Daqui a um mês", + "One week ago": "Há uma semana", + "One week from now": "Daqui a uma semana", + "Open as page": "Abrir como página", + "Options": "Opções", + "Past month": "Mês passado", + "Past week": "Semana passada", + "Past year": "Ano passado", + "Percent": "Porcentagem", + "Period, comma": "Ponto, vírgula", + "Person": "Pessoa", + "Please enter a valid email": "Por favor, insira um e-mail válido", + "Progress": "Progresso", + "Property options": "Opções da propriedade", + "Relative": "Relativo", + "Rename property": "Renomear propriedade", + "Reset": "Redefinir", + "Save for everyone": "Salvar para todos", + "Select": "Seleção", + "Select a property": "Selecione uma propriedade", + "Select all loaded rows": "Selecionar todas as linhas carregadas", + "Show all": "Mostrar tudo", + "Sort": "Ordenar", + "Sort by": "Ordenar por", + "Space, comma": "Espaço, vírgula", + "Space, period": "Espaço, ponto", + "This board has no grouping property yet.": "Este quadro ainda não tem uma propriedade de agrupamento.", + "This month": "Este mês", + "This year": "Este ano", + "Thousands and decimal separators": "Separadores de milhares e decimais", + "Time format": "Formato de hora", + "To Do": "A fazer", + "Tomorrow": "Amanhã", + "True": "Verdadeiro", + "Unsaved changes": "Alterações não salvas", + "Untitled base": "Base sem título", + "URL": "URL", + "Value": "Valor", + "View updated for everyone": "Visualização atualizada para todos", + "You have unsaved changes. Do you want to discard them?": "Você tem alterações não salvas. Deseja descartá-las?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/ru-RU/translation.json b/apps/client/public/locales/ru-RU/translation.json index c5a6519b9..bae44d133 100644 --- a/apps/client/public/locales/ru-RU/translation.json +++ b/apps/client/public/locales/ru-RU/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Создать свойство", "Hide properties": "Скрыть свойства", "Find a property type": "Найти тип свойства", - "Properties": "Свойства" + "Properties": "Свойства", + "A property with this name already exists": "Свойство с таким именем уже существует", + "Add card": "Добавить карточку", + "Add filter": "Добавить фильтр", + "Add option": "Добавить вариант", + "Add sort": "Добавить сортировку", + "Add view": "Добавить представление", + "All data in this column will be lost.": "Все данные в этом столбце будут потеряны.", + "Allow multiple people": "Разрешить нескольких пользователей", + "Alphabetize": "По алфавиту", + "Are you sure you want to delete": "Вы уверены, что хотите удалить", + "Ascending": "По возрастанию", + "Base deleted": "База удалена", + "Base name": "Название базы", + "Base table": "Таблица базы", + "Card properties": "Свойства карточки", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Ячейки, длина которых превышает ограничение для текста, будут обрезаны, а лишнее содержимое будет безвозвратно потеряно.", + "Checkbox": "Флажок", + "Checked by default": "Отмечено по умолчанию", + "Choose a property": "Выберите свойство", + "Clear selection": "Очистить выбор", + "Column options": "Параметры столбца", + "Comma, period": "Запятая, точка", + "Complete": "Завершено", + "Contains": "Содержит", + "Copy link to view": "Скопировать ссылку на представление", + "Create a status property": "Создать свойство статуса", + "Created at": "Создано", + "Currency": "Валюта", + "Decimal places": "Десятичные знаки", + "Default value": "Значение по умолчанию", + "Delete property": "Удалить свойство", + "Delete view": "Удалить представление", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "По убыванию", + "Discard": "Отменить", + "Doesn't contain": "Не содержит", + "Done": "Готово", + "Edit formula": "Редактировать формулу", + "Edit property": "Редактировать свойство", + "Export CSV": "Экспорт CSV", + "Failed to load base": "Не удалось загрузить базу", + "False": "Ложь", + "File": "Файл", + "Filter and sort changes are visible only to you": "Изменения фильтра и сортировки видны только вам", + "Filter by": "Фильтр по", + "Formula": "Формула", + "Get started with": "Начать работу с", + "Greater than": "Больше чем", + "Group by": "Группировать по", + "Group this board by a select or status property.": "Сгруппируйте эту доску по свойству выбора или статуса.", + "Hide all": "Скрыть все", + "Hide group": "Скрыть группу", + "In Progress": "В процессе", + "In progress": "В процессе", + "Include time": "Включить время", + "Insert a kanban board on this page": "Вставить канбан-доску на эту страницу", + "Insert an inline base on this page": "Вставить встроенную базу на эту страницу", + "Is": "Равно", + "Is after": "После", + "Is any of": "Совпадает с любым из", + "Is before": "До", + "Is empty": "Пусто", + "Is none of": "Не совпадает ни с одним из", + "Is not": "Не равно", + "Is not empty": "Не пусто", + "Is on or after": "В этот день или позже", + "Is on or before": "В этот день или раньше", + "Is within": "Находится в пределах", + "Keep editing": "Продолжить редактирование", + "Last edited at": "Последнее изменение", + "Last edited by": "Последний изменивший", + "Less than": "Меньше чем", + "Link copied to clipboard": "Ссылка скопирована в буфер обмена", + "Local": "Локальный", + "Long text": "Длинный текст", + "Moved card to {{column}}": "Карточка перемещена в {{column}}", + "Moved column to {{column}}": "Столбец перемещён в {{column}}", + "Multi-select": "Множественный выбор", + "New row": "Новая строка", + "Next month": "Следующий месяц", + "Next week": "Следующая неделя", + "Next year": "Следующий год", + "No filters applied": "Фильтры не применены", + "No match": "Нет совпадений", + "No options for this property type": "Для этого типа свойства нет параметров", + "No sorts applied": "Сортировка не применена", + "No value": "Нет значения", + "None": "Нет", + "Not started": "Не начато", + "Number": "Число", + "One month ago": "Месяц назад", + "One month from now": "Через месяц", + "One week ago": "Неделю назад", + "One week from now": "Через неделю", + "Open as page": "Открыть как страницу", + "Options": "Параметры", + "Past month": "Прошлый месяц", + "Past week": "Прошлая неделя", + "Past year": "Прошлый год", + "Percent": "Процент", + "Period, comma": "Точка, запятая", + "Person": "Пользователь", + "Please enter a valid email": "Пожалуйста, введите корректный адрес электронной почты", + "Progress": "Прогресс", + "Property options": "Параметры свойства", + "Relative": "Относительный", + "Rename property": "Переименовать свойство", + "Reset": "Сбросить", + "Save for everyone": "Сохранить для всех", + "Select": "Выбор", + "Select a property": "Выберите свойство", + "Select all loaded rows": "Выбрать все загруженные строки", + "Show all": "Показать все", + "Sort": "Сортировка", + "Sort by": "Сортировать по", + "Space, comma": "Пробел, запятая", + "Space, period": "Пробел, точка", + "This board has no grouping property yet.": "У этой доски пока нет свойства для группировки.", + "This month": "Этот месяц", + "This year": "Этот год", + "Thousands and decimal separators": "Разделители тысяч и десятичных знаков", + "Time format": "Формат времени", + "To Do": "К выполнению", + "Tomorrow": "Завтра", + "True": "Истина", + "Unsaved changes": "Несохранённые изменения", + "Untitled base": "База без названия", + "URL": "URL", + "Value": "Значение", + "View updated for everyone": "Представление обновлено для всех", + "You have unsaved changes. Do you want to discard them?": "У вас есть несохранённые изменения. Хотите их отменить?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/uk-UA/translation.json b/apps/client/public/locales/uk-UA/translation.json index 5f5b487b6..d3dd687ea 100644 --- a/apps/client/public/locales/uk-UA/translation.json +++ b/apps/client/public/locales/uk-UA/translation.json @@ -1153,5 +1153,141 @@ "Create property": "Створити властивість", "Hide properties": "Приховати властивості", "Find a property type": "Знайти тип властивості", - "Properties": "Властивості" + "Properties": "Властивості", + "A property with this name already exists": "Властивість із такою назвою вже існує", + "Add card": "Додати картку", + "Add filter": "Додати фільтр", + "Add option": "Додати опцію", + "Add sort": "Додати сортування", + "Add view": "Додати подання", + "All data in this column will be lost.": "Усі дані в цьому стовпці буде втрачено.", + "Allow multiple people": "Дозволити кількох людей", + "Alphabetize": "За алфавітом", + "Are you sure you want to delete": "Ви впевнені, що хочете видалити", + "Ascending": "За зростанням", + "Base deleted": "Базу видалено", + "Base name": "Назва бази", + "Base table": "Таблиця бази", + "Card properties": "Властивості картки", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "Клітинки, довші за обмеження для тексту, буде обрізано, а зайвий вміст буде безповоротно втрачено.", + "Checkbox": "Прапорець", + "Checked by default": "Позначено за замовчуванням", + "Choose a property": "Оберіть властивість", + "Clear selection": "Очистити вибір", + "Column options": "Параметри стовпця", + "Comma, period": "Кома, крапка", + "Complete": "Завершено", + "Contains": "Містить", + "Copy link to view": "Скопіювати посилання на подання", + "Create a status property": "Створити властивість статусу", + "Created at": "Створено", + "Currency": "Валюта", + "Decimal places": "Десяткові знаки", + "Default value": "Значення за замовчуванням", + "Delete property": "Видалити властивість", + "Delete view": "Видалити подання", + "Delete {{count}} rows?_one": "Delete 1 row?", + "Delete {{count}} rows?_other": "Delete {{count}} rows?", + "Descending": "За спаданням", + "Discard": "Скасувати", + "Doesn't contain": "Не містить", + "Done": "Готово", + "Edit formula": "Редагувати формулу", + "Edit property": "Редагувати властивість", + "Export CSV": "Експорт CSV", + "Failed to load base": "Не вдалося завантажити базу", + "False": "Хибність", + "File": "Файл", + "Filter and sort changes are visible only to you": "Зміни фільтрів і сортування видимі лише вам", + "Filter by": "Фільтрувати за", + "Formula": "Формула", + "Get started with": "Почніть із", + "Greater than": "Більше ніж", + "Group by": "Групувати за", + "Group this board by a select or status property.": "Згрупуйте цю дошку за властивістю вибору або статусу.", + "Hide all": "Приховати все", + "Hide group": "Приховати групу", + "In Progress": "У процесі", + "In progress": "У процесі", + "Include time": "Включити час", + "Insert a kanban board on this page": "Вставити канбан-дошку на цю сторінку", + "Insert an inline base on this page": "Вставити вбудовану базу на цю сторінку", + "Is": "Є", + "Is after": "Після", + "Is any of": "Є одним із", + "Is before": "До", + "Is empty": "Порожнє", + "Is none of": "Не є жодним із", + "Is not": "Не є", + "Is not empty": "Не порожнє", + "Is on or after": "У цей день або пізніше", + "Is on or before": "У цей день або раніше", + "Is within": "У межах", + "Keep editing": "Продовжити редагування", + "Last edited at": "Востаннє відредаговано", + "Last edited by": "Востаннє відредагував", + "Less than": "Менше ніж", + "Link copied to clipboard": "Посилання скопійовано в буфер обміну", + "Local": "Локальний", + "Long text": "Довгий текст", + "Moved card to {{column}}": "Картку переміщено до {{column}}", + "Moved column to {{column}}": "Стовпець переміщено до {{column}}", + "Multi-select": "Мультивибір", + "New row": "Новий рядок", + "Next month": "Наступного місяця", + "Next week": "Наступного тижня", + "Next year": "Наступного року", + "No filters applied": "Фільтри не застосовано", + "No match": "Немає збігів", + "No options for this property type": "Немає опцій для цього типу властивості", + "No sorts applied": "Сортування не застосовано", + "No value": "Немає значення", + "None": "Немає", + "Not started": "Не розпочато", + "Number": "Число", + "One month ago": "Місяць тому", + "One month from now": "Через місяць", + "One week ago": "Тиждень тому", + "One week from now": "Через тиждень", + "Open as page": "Відкрити як сторінку", + "Options": "Опції", + "Past month": "За минулий місяць", + "Past week": "За минулий тиждень", + "Past year": "За минулий рік", + "Percent": "Відсоток", + "Period, comma": "Крапка, кома", + "Person": "Особа", + "Please enter a valid email": "Будь ласка, введіть коректну електронну адресу", + "Progress": "Прогрес", + "Property options": "Параметри властивості", + "Relative": "Відносний", + "Rename property": "Перейменувати властивість", + "Reset": "Скинути", + "Save for everyone": "Зберегти для всіх", + "Select": "Вибір", + "Select a property": "Виберіть властивість", + "Select all loaded rows": "Вибрати всі завантажені рядки", + "Show all": "Показати все", + "Sort": "Сортування", + "Sort by": "Сортувати за", + "Space, comma": "Пробіл, кома", + "Space, period": "Пробіл, крапка", + "This board has no grouping property yet.": "Ця дошка ще не має властивості групування.", + "This month": "Цього місяця", + "This year": "Цього року", + "Thousands and decimal separators": "Роздільники тисяч і десяткових знаків", + "Time format": "Формат часу", + "To Do": "До виконання", + "Tomorrow": "Завтра", + "True": "Істина", + "Unsaved changes": "Незбережені зміни", + "Untitled base": "База без назви", + "URL": "URL", + "Value": "Значення", + "View updated for everyone": "Подання оновлено для всіх", + "You have unsaved changes. Do you want to discard them?": "У вас є незбережені зміни. Хочете їх скасувати?", + "{{count}} rows deleted_one": "1 row deleted", + "{{count}} rows deleted_other": "{{count}} rows deleted", + "{{count}} selected_one": "1 selected", + "{{count}} selected_other": "{{count}} selected" } diff --git a/apps/client/public/locales/zh-CN/translation.json b/apps/client/public/locales/zh-CN/translation.json index 2e27b87f4..97ff9ce85 100644 --- a/apps/client/public/locales/zh-CN/translation.json +++ b/apps/client/public/locales/zh-CN/translation.json @@ -1153,5 +1153,141 @@ "Create property": "创建属性", "Hide properties": "隐藏属性", "Find a property type": "查找属性类型", - "Properties": "属性" + "Properties": "属性", + "A property with this name already exists": "已存在同名属性", + "Add card": "添加卡片", + "Add filter": "添加筛选", + "Add option": "添加选项", + "Add sort": "添加排序", + "Add view": "添加视图", + "All data in this column will be lost.": "此列中的所有数据都将丢失。", + "Allow multiple people": "允许多人", + "Alphabetize": "按字母顺序", + "Are you sure you want to delete": "您确定要删除", + "Ascending": "升序", + "Base deleted": "资料库已删除", + "Base name": "资料库名称", + "Base table": "资料库表", + "Card properties": "卡片属性", + "Cells longer than the Text limit will be truncated and the extra content permanently lost.": "超出文本长度限制的单元格内容将被截断,额外内容将永久丢失。", + "Checkbox": "复选框", + "Checked by default": "默认选中", + "Choose a property": "选择一个属性", + "Clear selection": "清除选择", + "Column options": "列选项", + "Comma, period": "逗号、句点", + "Complete": "完成", + "Contains": "包含", + "Copy link to view": "复制视图链接", + "Create a status property": "创建状态属性", + "Created at": "创建于", + "Currency": "货币", + "Decimal places": "小数位数", + "Default value": "默认值", + "Delete property": "删除属性", + "Delete view": "删除视图", + "Delete {{count}} rows?_one": "删除 1 行?", + "Delete {{count}} rows?_other": "删除 {{count}} 行?", + "Descending": "降序", + "Discard": "放弃", + "Doesn't contain": "不包含", + "Done": "完成", + "Edit formula": "编辑公式", + "Edit property": "编辑属性", + "Export CSV": "导出 CSV", + "Failed to load base": "加载资料库失败", + "False": "假", + "File": "文件", + "Filter and sort changes are visible only to you": "筛选和排序更改仅对您可见", + "Filter by": "筛选条件", + "Formula": "公式", + "Get started with": "开始使用", + "Greater than": "大于", + "Group by": "分组依据", + "Group this board by a select or status property.": "按选择或状态属性对此看板进行分组。", + "Hide all": "全部隐藏", + "Hide group": "隐藏分组", + "In Progress": "进行中", + "In progress": "进行中", + "Include time": "包含时间", + "Insert a kanban board on this page": "在此页面插入一个看板", + "Insert an inline base on this page": "在此页面插入一个内联资料库", + "Is": "是", + "Is after": "在此之后", + "Is any of": "是其中之一", + "Is before": "在此之前", + "Is empty": "为空", + "Is none of": "都不是", + "Is not": "不是", + "Is not empty": "不为空", + "Is on or after": "在此日期或之后", + "Is on or before": "在此日期或之前", + "Is within": "在范围内", + "Keep editing": "继续编辑", + "Last edited at": "最后编辑于", + "Last edited by": "最后编辑者", + "Less than": "小于", + "Link copied to clipboard": "链接已复制到剪贴板", + "Local": "本地", + "Long text": "长文本", + "Moved card to {{column}}": "已将卡片移动到 {{column}}", + "Moved column to {{column}}": "已将列移动到 {{column}}", + "Multi-select": "多选", + "New row": "新行", + "Next month": "下个月", + "Next week": "下周", + "Next year": "明年", + "No filters applied": "未应用筛选", + "No match": "无匹配项", + "No options for this property type": "此属性类型没有可用选项", + "No sorts applied": "未应用排序", + "No value": "无值", + "None": "无", + "Not started": "未开始", + "Number": "数字", + "One month ago": "一个月前", + "One month from now": "从现在起一个月后", + "One week ago": "一周前", + "One week from now": "从现在起一周后", + "Open as page": "作为页面打开", + "Options": "选项", + "Past month": "过去一个月", + "Past week": "过去一周", + "Past year": "过去一年", + "Percent": "百分比", + "Period, comma": "句点、逗号", + "Person": "人员", + "Please enter a valid email": "请输入有效的电子邮件地址", + "Progress": "进度", + "Property options": "属性选项", + "Relative": "相对", + "Rename property": "重命名属性", + "Reset": "重置", + "Save for everyone": "保存给所有人", + "Select": "选择", + "Select a property": "选择一个属性", + "Select all loaded rows": "选择所有已加载的行", + "Show all": "显示全部", + "Sort": "排序", + "Sort by": "排序依据", + "Space, comma": "空格、逗号", + "Space, period": "空格、句点", + "This board has no grouping property yet.": "此看板尚无分组属性。", + "This month": "本月", + "This year": "今年", + "Thousands and decimal separators": "千位分隔符和小数分隔符", + "Time format": "时间格式", + "To Do": "待办", + "Tomorrow": "明天", + "True": "真", + "Unsaved changes": "未保存的更改", + "Untitled base": "未命名资料库", + "URL": "网址", + "Value": "值", + "View updated for everyone": "已为所有人更新视图", + "You have unsaved changes. Do you want to discard them?": "您有未保存的更改。要放弃这些更改吗?", + "{{count}} rows deleted_one": "已删除 1 行", + "{{count}} rows deleted_other": "已删除 {{count}} 行", + "{{count}} selected_one": "已选择 1 项", + "{{count}} selected_other": "已选择 {{count}} 项" }