mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) updates from grist-core
This commit is contained in:
commit
e9d5ce0c60
@ -144,12 +144,9 @@ AceEditor.prototype.attachSaveCommand = function() {
|
||||
if (!this.observable) {
|
||||
throw new Error("Cannot attach save command to editor with no bound observable");
|
||||
}
|
||||
var key = 'Shift+Enter';
|
||||
this.editor.commands.addCommand({
|
||||
name: 'saveFormula',
|
||||
bindKey: {
|
||||
win: key,
|
||||
mac: key,
|
||||
sender: 'editor|cli'
|
||||
},
|
||||
// AceEditor wants a command to return true if it got handled
|
||||
|
@ -30,6 +30,17 @@
|
||||
padding: .5rem;
|
||||
}
|
||||
|
||||
.g_record_detail_label_container {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
gap: 3px;
|
||||
}
|
||||
|
||||
.g_record_detail_label_container .info_toggle_icon {
|
||||
width: 13px;
|
||||
height: 13px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
.g_record_detail_label {
|
||||
min-height: 1rem;
|
||||
color: #666;
|
||||
@ -150,7 +161,7 @@
|
||||
-webkit-flex-direction: column-reverse;
|
||||
}
|
||||
|
||||
.detail_theme_field_under > .g_record_detail_label {
|
||||
.detail_theme_field_under .g_record_detail_label {
|
||||
border-top: 1px solid #333;
|
||||
}
|
||||
|
||||
@ -208,7 +219,7 @@
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.detail_theme_field_compact > .g_record_detail_label {
|
||||
.detail_theme_field_compact .g_record_detail_label {
|
||||
font-weight: normal;
|
||||
font-size: var(--grist-small-font-size);
|
||||
color: var(--grist-theme-card-compact-label, var(--grist-color-slate));
|
||||
@ -230,7 +241,7 @@
|
||||
padding: 1px 1px 1px 5px;
|
||||
}
|
||||
|
||||
.detail_theme_field_form > .g_record_detail_label {
|
||||
.detail_theme_field_form .g_record_detail_label {
|
||||
font-size: var(--grist-small-font-size);
|
||||
color: var(--grist-theme-card-form-label, var(--grist-color-slate));
|
||||
font-weight: bold;
|
||||
@ -241,6 +252,10 @@
|
||||
margin-right: -8px;
|
||||
}
|
||||
|
||||
.detail_theme_field_form .g_record_detail_label_container {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
/* TODO want to style better the values themselves (e.g. more padding, rounded corners, move label
|
||||
* inside value box for compact view for better cursor looks, etc), but first the cell editor
|
||||
* needs to learn to match the value box's style. Right now, the cell editor style is hard-coded.
|
||||
@ -288,7 +303,7 @@
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.detail_theme_field_blocks > .g_record_detail_label {
|
||||
.detail_theme_field_blocks .g_record_detail_label {
|
||||
font-size: var(--grist-small-font-size);
|
||||
color: var(--grist-theme-card-blocks-label, var(--grist-color-slate));
|
||||
font-weight: normal;
|
||||
|
@ -15,6 +15,7 @@ const RecordLayout = require('./RecordLayout');
|
||||
const commands = require('./commands');
|
||||
const {RowContextMenu} = require('../ui/RowContextMenu');
|
||||
const {parsePasteForView} = require("./BaseView2");
|
||||
const {columnInfoTooltip} = require("../ui/tooltips");
|
||||
|
||||
/**
|
||||
* DetailView component implements a list of record layouts.
|
||||
@ -227,8 +228,10 @@ DetailView.prototype.buildFieldDom = function(field, row) {
|
||||
if (field.isNewField) {
|
||||
return dom('div.g_record_detail_el.flexitem',
|
||||
kd.cssClass(function() { return 'detail_theme_field_' + self.viewSection.themeDef(); }),
|
||||
dom('div.g_record_detail_label', field.label),
|
||||
dom('div.g_record_detail_value', field.value)
|
||||
dom('div.g_record_detail_label_container',
|
||||
dom('div.g_record_detail_label', kd.text(field.displayLabel)),
|
||||
kd.scope(field.description, desc => desc ? columnInfoTooltip(kd.text(field.description)) : null)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -257,7 +260,10 @@ DetailView.prototype.buildFieldDom = function(field, row) {
|
||||
dom.autoDispose(isCellSelected),
|
||||
dom.autoDispose(isCellActive),
|
||||
kd.cssClass(function() { return 'detail_theme_field_' + self.viewSection.themeDef(); }),
|
||||
dom('div.g_record_detail_label_container',
|
||||
dom('div.g_record_detail_label', kd.text(field.displayLabel)),
|
||||
kd.scope(field.description, desc => desc ? columnInfoTooltip(kd.text(field.description)) : null)
|
||||
),
|
||||
dom('div.g_record_detail_value',
|
||||
kd.toggleClass('scissors', isCopyActive),
|
||||
kd.toggleClass('record-add', row._isAddRow),
|
||||
|
@ -20,6 +20,7 @@ export interface ViewFieldRec extends IRowModel<"_grist_Views_section_field">, R
|
||||
origCol: ko.Computed<ColumnRec>;
|
||||
colId: ko.Computed<string>;
|
||||
label: ko.Computed<string>;
|
||||
description: ko.Computed<string>;
|
||||
|
||||
// displayLabel displays label by default but switches to the more helpful colId whenever a
|
||||
// formula field in the view is being edited.
|
||||
@ -108,6 +109,7 @@ export function createViewFieldRec(this: ViewFieldRec, docModel: DocModel): void
|
||||
this.origCol = ko.pureComputed(() => this.column().origCol());
|
||||
this.colId = ko.pureComputed(() => this.column().colId());
|
||||
this.label = ko.pureComputed(() => this.column().label());
|
||||
this.description = ko.pureComputed(() => this.column().description());
|
||||
|
||||
// displayLabel displays label by default but switches to the more helpful colId whenever a
|
||||
// formula field in the view is being edited.
|
||||
|
@ -18,6 +18,7 @@ import {sanitizeIdent} from 'app/common/gutil';
|
||||
import {bundleChanges, Computed, dom, DomContents, DomElementArg, fromKo, MultiHolder,
|
||||
Observable, styled} from 'grainjs';
|
||||
import * as ko from 'knockout';
|
||||
import { textarea } from './inputs';
|
||||
|
||||
const t = makeT('FieldConfig');
|
||||
|
||||
@ -88,6 +89,40 @@ export function buildNameConfig(
|
||||
];
|
||||
}
|
||||
|
||||
export function buildDescriptionConfig(
|
||||
owner: MultiHolder,
|
||||
origColumn: ColumnRec,
|
||||
cursor: ko.Computed<CursorPos>,
|
||||
) {
|
||||
|
||||
// We will listen to cursor position and force a blur event on
|
||||
// the text input, which will trigger save before the column observable
|
||||
// will change its value.
|
||||
// Otherwise, blur will be invoked after column change and save handler will
|
||||
// update a different column.
|
||||
let editor: HTMLTextAreaElement | undefined;
|
||||
owner.autoDispose(
|
||||
cursor.subscribe(() => {
|
||||
editor?.blur();
|
||||
})
|
||||
);
|
||||
|
||||
return [
|
||||
cssLabel(t("DESCRIPTION")),
|
||||
cssRow(
|
||||
editor = cssTextArea(fromKo(origColumn.description),
|
||||
{ onInput: false },
|
||||
{ rows: '3' },
|
||||
dom.on('blur', async (e, elem) => {
|
||||
await origColumn.description.saveOnly(elem.value);
|
||||
}),
|
||||
testId('column-description'),
|
||||
)
|
||||
),
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
type SaveHandler = (column: ColumnRec, formula: string) => Promise<void>;
|
||||
type BuildEditor = (
|
||||
cellElem: Element,
|
||||
@ -494,3 +529,22 @@ const cssInput = styled(textInput, `
|
||||
color: ${theme.inputDisabledFg};
|
||||
}
|
||||
`);
|
||||
|
||||
const cssTextArea = styled(textarea, `
|
||||
color: ${theme.inputFg};
|
||||
background-color: ${theme.mainPanelBg};
|
||||
border: 1px solid ${theme.inputBorder};
|
||||
width: 100%;
|
||||
outline: none;
|
||||
border-radius: 3px;
|
||||
padding: 3px 7px;
|
||||
|
||||
&::placeholder {
|
||||
color: ${theme.inputPlaceholderFg};
|
||||
}
|
||||
|
||||
&[readonly] {
|
||||
background-color: ${theme.inputDisabledBg};
|
||||
color: ${theme.inputDisabledFg};
|
||||
}
|
||||
`);
|
||||
|
@ -43,6 +43,7 @@ import {bundleChanges, Computed, Disposable, dom, domComputed, DomContents,
|
||||
DomElementArg, DomElementMethod, IDomComponent} from 'grainjs';
|
||||
import {MultiHolder, Observable, styled, subscribe} from 'grainjs';
|
||||
import * as ko from 'knockout';
|
||||
import { buildDescriptionConfig } from './FieldConfig';
|
||||
|
||||
const t = makeT('RightPanel');
|
||||
|
||||
@ -235,6 +236,9 @@ export class RightPanel extends Disposable {
|
||||
cssSection(
|
||||
dom.create(buildNameConfig, origColumn, cursor, isMultiSelect),
|
||||
),
|
||||
cssSection(
|
||||
dom.create(buildDescriptionConfig, origColumn, cursor),
|
||||
),
|
||||
cssSeparator(),
|
||||
cssSection(
|
||||
dom.create(buildFormulaConfig,
|
||||
|
@ -242,7 +242,7 @@ export function tooltipCloseButton(ctl: ITooltipControl): HTMLElement {
|
||||
/**
|
||||
* Renders an info icon that shows a tooltip with the specified `content` on click.
|
||||
*/
|
||||
function infoTooltip(content: DomContents, menuOptions?: IMenuOptions, ...domArgs: DomElementArg[]) {
|
||||
export function infoTooltip(content: DomContents, menuOptions?: IMenuOptions, ...domArgs: DomElementArg[]) {
|
||||
return cssInfoTooltipButton('?',
|
||||
(elem) => {
|
||||
setPopupToCreateDom(
|
||||
@ -314,6 +314,62 @@ export function withInfoTooltip(
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders an column info icon that shows a tooltip with the specified `content` on click.
|
||||
*/
|
||||
export function columnInfoTooltip(content: DomContents, menuOptions?: IMenuOptions, ...domArgs: DomElementArg[]) {
|
||||
return cssColumnInfoTooltipButton(
|
||||
icon('Info', dom.cls("info_toggle_icon")),
|
||||
(elem) => {
|
||||
setPopupToCreateDom(
|
||||
elem,
|
||||
(ctl) => {
|
||||
return cssInfoTooltipPopup(
|
||||
cssInfoTooltipPopupCloseButton(
|
||||
icon('CrossSmall'),
|
||||
dom.on('click', () => ctl.close()),
|
||||
testId('column-info-tooltip-close'),
|
||||
),
|
||||
cssInfoTooltipPopupBody(
|
||||
content,
|
||||
{ style: 'white-space: pre-wrap;' },
|
||||
testId('column-info-tooltip-popup-body'),
|
||||
),
|
||||
dom.cls(menuCssClass),
|
||||
dom.cls(cssMenu.className),
|
||||
dom.onKeyDown({
|
||||
Enter: () => ctl.close(),
|
||||
Escape: () => ctl.close(),
|
||||
}),
|
||||
(popup) => { setTimeout(() => popup.focus(), 0); },
|
||||
testId('column-info-tooltip-popup'),
|
||||
);
|
||||
},
|
||||
{ ...defaultMenuOptions, ...{ placement: 'bottom-end' }, ...menuOptions },
|
||||
);
|
||||
},
|
||||
testId('column-info-tooltip'),
|
||||
...domArgs,
|
||||
);
|
||||
}
|
||||
|
||||
const cssColumnInfoTooltipButton = styled('div', `
|
||||
cursor: pointer;
|
||||
--icon-color: ${theme.infoButtonFg};
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
margin-left: 5px;
|
||||
line-height: 0px;
|
||||
|
||||
&:hover {
|
||||
--icon-color: ${theme.infoButtonHoverFg};
|
||||
}
|
||||
&:active {
|
||||
--icon-color: ${theme.infoButtonActiveFg};
|
||||
}
|
||||
`);
|
||||
|
||||
|
||||
const cssTooltip = styled('div', `
|
||||
position: absolute;
|
||||
z-index: 5000; /* should be higher than a modal */
|
||||
|
@ -605,6 +605,11 @@ export const theme = {
|
||||
menuToggleBg: new CustomProp('theme-menu-toggle-bg', undefined, 'white'),
|
||||
menuToggleBorder: new CustomProp('theme-menu-toggle-border', undefined, colors.slate),
|
||||
|
||||
/* Info Button */
|
||||
infoButtonFg: new CustomProp('theme-info-button-fg', undefined, "#8F8F8F"),
|
||||
infoButtonHoverFg: new CustomProp('theme-info-button-hover-fg', undefined, "#707070"),
|
||||
infoButtonActiveFg: new CustomProp('theme-info-button-active-fg', undefined, "#5C5C5C"),
|
||||
|
||||
/* Button Groups */
|
||||
buttonGroupFg: new CustomProp('theme-button-group-fg', undefined, colors.dark),
|
||||
buttonGroupLightFg: new CustomProp('theme-button-group-light-fg', undefined, colors.slate),
|
||||
|
@ -4,7 +4,7 @@ import { GristObjCode } from "app/plugin/GristData";
|
||||
|
||||
// tslint:disable:object-literal-key-quotes
|
||||
|
||||
export const SCHEMA_VERSION = 35;
|
||||
export const SCHEMA_VERSION = 36;
|
||||
|
||||
export const schema = {
|
||||
|
||||
@ -34,6 +34,7 @@ export const schema = {
|
||||
isFormula : "Bool",
|
||||
formula : "Text",
|
||||
label : "Text",
|
||||
description : "Text",
|
||||
untieColIdFromLabel : "Bool",
|
||||
summarySourceCol : "Ref:_grist_Tables_column",
|
||||
displayCol : "Ref:_grist_Tables_column",
|
||||
@ -239,6 +240,7 @@ export interface SchemaTypes {
|
||||
isFormula: boolean;
|
||||
formula: string;
|
||||
label: string;
|
||||
description: string;
|
||||
untieColIdFromLabel: boolean;
|
||||
summarySourceCol: number;
|
||||
displayCol: number;
|
||||
|
@ -6,9 +6,9 @@ export const GRIST_DOC_SQL = `
|
||||
PRAGMA foreign_keys=OFF;
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE IF NOT EXISTS "_grist_DocInfo" (id INTEGER PRIMARY KEY, "docId" TEXT DEFAULT '', "peers" TEXT DEFAULT '', "basketId" TEXT DEFAULT '', "schemaVersion" INTEGER DEFAULT 0, "timezone" TEXT DEFAULT '', "documentSettings" TEXT DEFAULT '');
|
||||
INSERT INTO _grist_DocInfo VALUES(1,'','','',35,'','');
|
||||
INSERT INTO _grist_DocInfo VALUES(1,'','','',36,'','');
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Tables" (id INTEGER PRIMARY KEY, "tableId" TEXT DEFAULT '', "primaryViewId" INTEGER DEFAULT 0, "summarySourceTable" INTEGER DEFAULT 0, "onDemand" BOOLEAN DEFAULT 0, "rawViewSectionRef" INTEGER DEFAULT 0);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Tables_column" (id INTEGER PRIMARY KEY, "parentId" INTEGER DEFAULT 0, "parentPos" NUMERIC DEFAULT 1e999, "colId" TEXT DEFAULT '', "type" TEXT DEFAULT '', "widgetOptions" TEXT DEFAULT '', "isFormula" BOOLEAN DEFAULT 0, "formula" TEXT DEFAULT '', "label" TEXT DEFAULT '', "untieColIdFromLabel" BOOLEAN DEFAULT 0, "summarySourceCol" INTEGER DEFAULT 0, "displayCol" INTEGER DEFAULT 0, "visibleCol" INTEGER DEFAULT 0, "rules" TEXT DEFAULT NULL, "recalcWhen" INTEGER DEFAULT 0, "recalcDeps" TEXT DEFAULT NULL);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Tables_column" (id INTEGER PRIMARY KEY, "parentId" INTEGER DEFAULT 0, "parentPos" NUMERIC DEFAULT 1e999, "colId" TEXT DEFAULT '', "type" TEXT DEFAULT '', "widgetOptions" TEXT DEFAULT '', "isFormula" BOOLEAN DEFAULT 0, "formula" TEXT DEFAULT '', "label" TEXT DEFAULT '', "description" TEXT DEFAULT '', "untieColIdFromLabel" BOOLEAN DEFAULT 0, "summarySourceCol" INTEGER DEFAULT 0, "displayCol" INTEGER DEFAULT 0, "visibleCol" INTEGER DEFAULT 0, "rules" TEXT DEFAULT NULL, "recalcWhen" INTEGER DEFAULT 0, "recalcDeps" TEXT DEFAULT NULL);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Imports" (id INTEGER PRIMARY KEY, "tableRef" INTEGER DEFAULT 0, "origFileName" TEXT DEFAULT '', "parseFormula" TEXT DEFAULT '', "delimiter" TEXT DEFAULT '', "doublequote" BOOLEAN DEFAULT 0, "escapechar" TEXT DEFAULT '', "quotechar" TEXT DEFAULT '', "skipinitialspace" BOOLEAN DEFAULT 0, "encoding" TEXT DEFAULT '', "hasHeaders" BOOLEAN DEFAULT 0);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_External_database" (id INTEGER PRIMARY KEY, "host" TEXT DEFAULT '', "port" INTEGER DEFAULT 0, "username" TEXT DEFAULT '', "dialect" TEXT DEFAULT '', "database" TEXT DEFAULT '', "storage" TEXT DEFAULT '');
|
||||
CREATE TABLE IF NOT EXISTS "_grist_External_table" (id INTEGER PRIMARY KEY, "tableRef" INTEGER DEFAULT 0, "databaseRef" INTEGER DEFAULT 0, "tableName" TEXT DEFAULT '');
|
||||
@ -43,14 +43,14 @@ export const GRIST_DOC_WITH_TABLE1_SQL = `
|
||||
PRAGMA foreign_keys=OFF;
|
||||
BEGIN TRANSACTION;
|
||||
CREATE TABLE IF NOT EXISTS "_grist_DocInfo" (id INTEGER PRIMARY KEY, "docId" TEXT DEFAULT '', "peers" TEXT DEFAULT '', "basketId" TEXT DEFAULT '', "schemaVersion" INTEGER DEFAULT 0, "timezone" TEXT DEFAULT '', "documentSettings" TEXT DEFAULT '');
|
||||
INSERT INTO _grist_DocInfo VALUES(1,'','','',35,'','');
|
||||
INSERT INTO _grist_DocInfo VALUES(1,'','','',36,'','');
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Tables" (id INTEGER PRIMARY KEY, "tableId" TEXT DEFAULT '', "primaryViewId" INTEGER DEFAULT 0, "summarySourceTable" INTEGER DEFAULT 0, "onDemand" BOOLEAN DEFAULT 0, "rawViewSectionRef" INTEGER DEFAULT 0);
|
||||
INSERT INTO _grist_Tables VALUES(1,'Table1',1,0,0,2);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Tables_column" (id INTEGER PRIMARY KEY, "parentId" INTEGER DEFAULT 0, "parentPos" NUMERIC DEFAULT 1e999, "colId" TEXT DEFAULT '', "type" TEXT DEFAULT '', "widgetOptions" TEXT DEFAULT '', "isFormula" BOOLEAN DEFAULT 0, "formula" TEXT DEFAULT '', "label" TEXT DEFAULT '', "untieColIdFromLabel" BOOLEAN DEFAULT 0, "summarySourceCol" INTEGER DEFAULT 0, "displayCol" INTEGER DEFAULT 0, "visibleCol" INTEGER DEFAULT 0, "rules" TEXT DEFAULT NULL, "recalcWhen" INTEGER DEFAULT 0, "recalcDeps" TEXT DEFAULT NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(1,1,1,'manualSort','ManualSortPos','',0,'','manualSort',0,0,0,0,NULL,0,NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(2,1,2,'A','Any','',1,'','A',0,0,0,0,NULL,0,NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(3,1,3,'B','Any','',1,'','B',0,0,0,0,NULL,0,NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(4,1,4,'C','Any','',1,'','C',0,0,0,0,NULL,0,NULL);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Tables_column" (id INTEGER PRIMARY KEY, "parentId" INTEGER DEFAULT 0, "parentPos" NUMERIC DEFAULT 1e999, "colId" TEXT DEFAULT '', "type" TEXT DEFAULT '', "widgetOptions" TEXT DEFAULT '', "isFormula" BOOLEAN DEFAULT 0, "formula" TEXT DEFAULT '', "label" TEXT DEFAULT '', "description" TEXT DEFAULT '', "untieColIdFromLabel" BOOLEAN DEFAULT 0, "summarySourceCol" INTEGER DEFAULT 0, "displayCol" INTEGER DEFAULT 0, "visibleCol" INTEGER DEFAULT 0, "rules" TEXT DEFAULT NULL, "recalcWhen" INTEGER DEFAULT 0, "recalcDeps" TEXT DEFAULT NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(1,1,1,'manualSort','ManualSortPos','',0,'','manualSort','',0,0,0,0,NULL,0,NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(2,1,2,'A','Any','',1,'','A','',0,0,0,0,NULL,0,NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(3,1,3,'B','Any','',1,'','B','',0,0,0,0,NULL,0,NULL);
|
||||
INSERT INTO _grist_Tables_column VALUES(4,1,4,'C','Any','',1,'','C','',0,0,0,0,NULL,0,NULL);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_Imports" (id INTEGER PRIMARY KEY, "tableRef" INTEGER DEFAULT 0, "origFileName" TEXT DEFAULT '', "parseFormula" TEXT DEFAULT '', "delimiter" TEXT DEFAULT '', "doublequote" BOOLEAN DEFAULT 0, "escapechar" TEXT DEFAULT '', "quotechar" TEXT DEFAULT '', "skipinitialspace" BOOLEAN DEFAULT 0, "encoding" TEXT DEFAULT '', "hasHeaders" BOOLEAN DEFAULT 0);
|
||||
CREATE TABLE IF NOT EXISTS "_grist_External_database" (id INTEGER PRIMARY KEY, "host" TEXT DEFAULT '', "port" INTEGER DEFAULT 0, "username" TEXT DEFAULT '', "dialect" TEXT DEFAULT '', "database" TEXT DEFAULT '', "storage" TEXT DEFAULT '');
|
||||
CREATE TABLE IF NOT EXISTS "_grist_External_table" (id INTEGER PRIMARY KEY, "tableRef" INTEGER DEFAULT 0, "databaseRef" INTEGER DEFAULT 0, "tableName" TEXT DEFAULT '');
|
||||
|
@ -1188,3 +1188,11 @@ def migration35(tdset):
|
||||
))
|
||||
|
||||
return tdset.apply_doc_actions(doc_actions)
|
||||
|
||||
|
||||
@migration(schema_version=36)
|
||||
def migration36(tdset):
|
||||
"""
|
||||
Add description to column
|
||||
"""
|
||||
return tdset.apply_doc_actions([add_column('_grist_Tables_column', 'description', 'Text')])
|
||||
|
@ -15,7 +15,7 @@ import six
|
||||
|
||||
import actions
|
||||
|
||||
SCHEMA_VERSION = 35
|
||||
SCHEMA_VERSION = 36
|
||||
|
||||
def make_column(col_id, col_type, formula='', isFormula=False):
|
||||
return {
|
||||
@ -70,6 +70,7 @@ def schema_create_actions():
|
||||
make_column("isFormula", "Bool"),
|
||||
make_column("formula", "Text"),
|
||||
make_column("label", "Text"),
|
||||
make_column("description", "Text"),
|
||||
|
||||
# Normally a change to label changes colId as well, unless untieColIdFromLabel is True.
|
||||
# (We intentionally pick a variable whose default value is false.)
|
||||
|
@ -346,7 +346,8 @@
|
||||
"Empty Columns_one": "Leere Spalte",
|
||||
"Empty Columns_other": "Leere Spalten",
|
||||
"Formula Columns_one": "Formel Spalte",
|
||||
"Formula Columns_other": "Formel-Spalten"
|
||||
"Formula Columns_other": "Formel-Spalten",
|
||||
"DESCRIPTION": "BESCHREIBUNG"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Revert to common settings": "Gemeinsame Einstellungen wiederherstellen",
|
||||
|
@ -326,7 +326,8 @@
|
||||
"Mixed Behavior": "Mixed Behavior",
|
||||
"Set formula": "Set formula",
|
||||
"Set trigger formula": "Set trigger formula",
|
||||
"TRIGGER FORMULA": "TRIGGER FORMULA"
|
||||
"TRIGGER FORMULA": "TRIGGER FORMULA",
|
||||
"DESCRIPTION": "DESCRIPTION"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Revert to common settings": "Revert to common settings",
|
||||
|
@ -275,7 +275,8 @@
|
||||
"Empty Columns_one": "Columna vacía",
|
||||
"Empty Columns_other": "Columnas vacías",
|
||||
"Formula Columns_one": "Columna de Fórmula",
|
||||
"Formula Columns_other": "Columnas de Fórmula"
|
||||
"Formula Columns_other": "Columnas de Fórmula",
|
||||
"DESCRIPTION": "DESCRIPCIÓN"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Revert to common settings": "Revertir a los ajustes comunes",
|
||||
|
@ -399,7 +399,8 @@
|
||||
"Browse Templates": "Parcourir les modèles",
|
||||
"Create Empty Document": "Créer un document vide",
|
||||
"Import Document": "Importer un Fichier",
|
||||
"Visit our {{link}} to learn more.": "Consulter le {{link}} pour en savoir plus."
|
||||
"Visit our {{link}} to learn more.": "Consulter le {{link}} pour en savoir plus.",
|
||||
"{{signUp}} to save your work. ": "{{signUp}} pour enregistrer votre travail. "
|
||||
},
|
||||
"HomeLeftPane": {
|
||||
"All Documents": "Tous les documents",
|
||||
@ -804,7 +805,10 @@
|
||||
"CELL FORMAT": "FORMAT DE CELLULE",
|
||||
"Mixed types": "Types composites",
|
||||
"Changing multiple column types": "Changer plusieurs types",
|
||||
"Mixed format": "Format composite"
|
||||
"Mixed format": "Format composite",
|
||||
"Revert field settings for {{colId}} to common": "Réinitialiser les paramètres par défaut pour {{colId}}",
|
||||
"Save field settings for {{colId}} as common": "Sauvegarder les paramètres pour {{colId}}",
|
||||
"Use separate field settings for {{colId}}": "Utiliser des paramètres spécifiques pour {{colId}}"
|
||||
},
|
||||
"welcomeTour": {
|
||||
"Customizing columns": "Personnaliser les colonnes",
|
||||
@ -819,7 +823,18 @@
|
||||
"Start with {{equal}} to enter a formula.": "Commencer par {{equal}} pour ajouter une formule.",
|
||||
"Sharing": "Partager",
|
||||
"Reference": "Référence",
|
||||
"Help Center": "Centre d'aide"
|
||||
"Help Center": "Centre d'aide",
|
||||
"Browse our {{templateLibrary}} to discover what's possible and get inspired.": "Parcourez notre {{templateLibrary}} pour découvrir les possibilités et trouver de l'inspiration.",
|
||||
"Flying higher": "Pour aller plus loin",
|
||||
"Enter": "Entrée",
|
||||
"Use the Share button ({{share}}) to share the document or export data.": "Utilisez le bouton de partage ({{share}}) pour partager le document ou exporter les données.",
|
||||
"Make it relational! Use the {{ref}} type to link tables. ": "Rendez-le relationnel ! Utilisez le type {{ref}} pour lier les tableaux. ",
|
||||
"Toggle the {{creatorPanel}} to format columns, ": "Ouvrez le {{creatorPanel}} pour formater les colonnes ",
|
||||
"Use {{addNew}} to add widgets, pages, or import more data. ": "Cliquez sur {{addNew}} pour ajouter des vues, des pages ou importer plus de données. ",
|
||||
"convert to card view, select data, and more.": "convertir en vue carte, sélectionner des données et plus.",
|
||||
"Set formatting options, formulas, or column types, such as dates, choices, or attachments. ": "Définissez des options de formatage de la colonne, des formules ou bien les types de la colonne (dates, liste à choix unique, pièce jointe etc.) ",
|
||||
"Use {{helpCenter}} for documentation or questions.": "Cliquez sur {{helpCenter}} pour voir la documentation et poser vos questions.",
|
||||
"creator panel": "menu latéral"
|
||||
},
|
||||
"TypeTransformation": {
|
||||
"Cancel": "Annuler",
|
||||
@ -868,7 +883,8 @@
|
||||
"Errors in all {{numErrors}} cells": "Erreur dans toutes les {{numErrors}} cellules",
|
||||
"Error in the cell": "Erreur dans la cellule",
|
||||
"Column or field is required": "Colonne ou champ requis",
|
||||
"Errors in {{numErrors}} of {{numCells}} cells": "Erreur dans {{numErrors}} des {{numCells}} cellules"
|
||||
"Errors in {{numErrors}} of {{numCells}} cells": "Erreur dans {{numErrors}} des {{numCells}} cellules",
|
||||
"editingFormula is required": "editingFormula est nécessaire"
|
||||
},
|
||||
"NumericTextBox": {
|
||||
"Decimals": "Décimales",
|
||||
@ -883,5 +899,48 @@
|
||||
"Row ID": "Id de ligne",
|
||||
"CELL FORMAT": "FORMAT DE CELLULE",
|
||||
"SHOW COLUMN": "MONTRER LA COLONNE"
|
||||
},
|
||||
"HyperLinkEditor": {
|
||||
"[link label] url": "[label du lien] url"
|
||||
},
|
||||
"GristTooltips": {
|
||||
"Apply conditional formatting to cells in this column when formula conditions are met.": "Appliquez un formatage conditionnel aux cellules de cette colonne lorsque les conditions de la formule sont remplies.",
|
||||
"Cells in a reference column always identify an {{entire}} record in that table, but you may select which column from that record to show.": "Les cellules d'une colonne Référence identifient toujours un enregistrement {{entire}} de cette table, mais vous pouvez sélectionner la colonne de cet enregistrement à afficher.",
|
||||
"Click on “Open row styles” to apply conditional formatting to rows.": "Cliquez sur “Ouvrir les styles de ligne” pour appliquer le formatage conditionnel aux lignes.",
|
||||
"Apply conditional formatting to rows based on formulas.": "Appliquez un formatage conditionnel aux lignes en fonction de formules.",
|
||||
"Updates every 5 minutes.": "Mises à jour toutes les 5 minutes.",
|
||||
"Use the \\u{1D6BA} icon to create summary (or pivot) tables, for totals or subtotals.": "Utilisez l'icône \\u{1D6BA} pour créer des tables récapitulatives (ou tables croisées dynamiques), pour les totaux ou les sous-totaux.",
|
||||
"Reference columns are the key to {{relational}} data in Grist.": "Les colonnes références sont la clé des données {{relational}} dans Grist.",
|
||||
"Select the table containing the data to show.": "Sélectionnez la table contenant les données à afficher.",
|
||||
"Link your new widget to an existing widget on this page.": "Liez votre nouvelle vue à une vue existante sur cette page.",
|
||||
"Formulas that trigger in certain cases, and store the calculated value as data.": "Formules qui se déclenchent dans certains cas, et qui stockent la valeur calculée comme donnée.",
|
||||
"Only those rows will appear which match all of the filters.": "Seules les lignes qui correspondent à tous les filtres apparaîtront.",
|
||||
"Select the table to link to.": "Sélectionnez la table vers laquelle vous souhaitez établir un lien.",
|
||||
"Selecting Data": "Sélection de données",
|
||||
"Rearrange the fields in your card by dragging and resizing cells.": "Réorganisez les champs de votre vue carte en faisant glisser et en redimensionnant les cellules.",
|
||||
"The Raw Data page lists all data tables in your document, including summary tables and tables not included in page layouts.": "La page des données sources liste toutes les tables de votre document, y compris les tables récapitulatives et les tables non-inclues dans les mises en page.",
|
||||
"The total size of all data in this document, excluding attachments.": "La taille totale de toutes les données de ce document, à l'exclusion des pièces jointes.",
|
||||
"Click the Add New button to create new documents or workspaces, or import data.": "Cliquez sur le bouton Nouveau pour créer de nouveaux documents dans votre espace de travail ou importer des données.",
|
||||
"Clicking {{EyeHideIcon}} in each cell hides the field from this view without deleting it.": "En cliquant sur {{EyeHideIcon}} dans chaque cellule, vous masquez le champ de cette vue sans le supprimer.",
|
||||
"Editing Card Layout": "Modification de la mise en page de la carte",
|
||||
"Linking Widgets": "Lier les vues",
|
||||
"Nested Filtering": "Filtrage imbriqué",
|
||||
"Pinned filters are displayed as buttons above the widget.": "Les filtres épinglés sont affichés sous forme de boutons au-dessus de la vue.",
|
||||
"Pinning Filters": "Filtres épinglés",
|
||||
"Raw Data page": "Page des données sources",
|
||||
"Reference Columns": "Colonnes références",
|
||||
"This is the secret to Grist's dynamic and productive layouts.": "C'est le secret des mises en page dynamiques et productives de Grist.",
|
||||
"Try out changes in a copy, then decide whether to replace the original with your edits.": "Essayez les changements sur une copie, puis décidez de remplacer l'original par vos modifications.",
|
||||
"Useful for storing the timestamp or author of a new record, data cleaning, and more.": "Utile pour stocker l'horodatage ou l'auteur d'un nouvel enregistrement, le nettoyage des données, et plus encore.",
|
||||
"You can filter by more than one column.": "Vous pouvez filtrer par plus d'une colonne.",
|
||||
"entire": "entier",
|
||||
"relational": "relationnelles",
|
||||
"Access Rules": "Règles d'accès",
|
||||
"Learn more.": "En savoir plus.",
|
||||
"They allow for one record to point (or refer) to another.": "Ils permettent à une entrée de pointer (ou de faire référence) à une autre entrée.",
|
||||
"Add New": "Nouveau",
|
||||
"Access rules give you the power to create nuanced rules to determine who can see or edit which parts of your document.": "Les règles d'accès vous donnent le pouvoir de créer des règles nuancées pour déterminer qui peut voir ou modifier quelles parties de votre document.",
|
||||
"Use the 𝚺 icon to create summary (or pivot) tables, for totals or subtotals.": "Utilisez l'icône 𝚺 pour créer des tables récapitulatives (ou tables croisées dynamiques), pour les totaux ou les sous-totaux.",
|
||||
"Unpin to hide the the button while keeping the filter.": "Détachez pour cacher le bouton tout en conservant le filtre."
|
||||
}
|
||||
}
|
||||
|
@ -254,5 +254,164 @@
|
||||
"Sorry, access to this document has been denied. [{{error}}]": "Przepraszamy ale nie masz dostępu do tego dokumentu. [{{error}}]",
|
||||
"You do not have edit access to this document": "nie masz uprawnień do edytowania tego dokumentu",
|
||||
"You can try reloading the document, or using recovery mode. Recovery mode opens the document to be fully accessible to owners, and inaccessible to others. It also disables formulas. [{{error}}]": "Spróbuj przeładować dokument, albo użyj trybu odzyskiwania. W trybie odzyskiwania dokument jest otwarty z pełnym dostępem dla właściciela i jako niedostępny dla kogokolwiek innego, a formuły są wyłączone. [{{error}}]"
|
||||
},
|
||||
"HomeIntro": {
|
||||
"Get started by creating your first Grist document.": "Zacznij od stworzenia swojego pierwszego dokumentu Grist.",
|
||||
"Any documents created in this site will appear here.": "Wszelkie dokumenty utworzone w tej witrynie pojawią się tutaj.",
|
||||
"Browse Templates": "Przeglądaj szablony",
|
||||
"Create Empty Document": "Tworzenie pustego dokumentu",
|
||||
"Get started by inviting your team and creating your first Grist document.": "Zacznij od zaproszenia swojego zespołu i stworzenia pierwszego dokumentu Grist.",
|
||||
"Help Center": "Centrum pomocy",
|
||||
"Import Document": "Importuj dokument",
|
||||
"Get started by exploring templates, or creating your first Grist document.": "Zacznij od zapoznania się z szablonami lub stworzenia swojego pierwszego dokumentu Grist.",
|
||||
"{{signUp}} to save your work. ": "{{signUp}}, aby zapisać swoją pracę. ",
|
||||
"Welcome to {{orgName}}": "Witamy w {{orgName}}",
|
||||
"Interested in using Grist outside of your team? Visit your free ": "Chcesz używać Grist poza swoim zespołem? Odwiedź swój darmowy ",
|
||||
"Invite Team Members": "Zaproś członków zespołu",
|
||||
"Sign up": "Zarejestruj się",
|
||||
"Sprouts Program": "Program Kiełki",
|
||||
"This workspace is empty.": "Ten obszar roboczy jest pusty.",
|
||||
"Visit our {{link}} to learn more.": "Odwiedź nasze {{link}}, aby dowiedzieć się więcej.",
|
||||
"You have read-only access to this site. Currently there are no documents.": "Masz dostęp tylko do odczytu do tej witryny. Obecnie brak dokumentów.",
|
||||
"personal site": "strona osobista",
|
||||
"Welcome to Grist!": "Witamy w Grist!",
|
||||
"Welcome to Grist, {{name}}!": "Witamy w Grist, {{name}}!"
|
||||
},
|
||||
"DocTour": {
|
||||
"Cannot construct a document tour from the data in this document. Ensure there is a table named GristDocTour with columns Title, Body, Placement, and Location.": "Nie można utworzyć przewodnika po dokumencie na podstawie danych w tym dokumencie. Upewnij się, że istnieje tabela o nazwie GristDocTour z kolumnami Tytuł, Treść, Położenie i Lokalizacja.",
|
||||
"No valid document tour": "Brak przewodnika dla dokumentu"
|
||||
},
|
||||
"DocumentSettings": {
|
||||
"Currency:": "Waluta:",
|
||||
"Document Settings": "Ustawienia dokumentu",
|
||||
"Engine (experimental {{span}} change at own risk):": "Silnik (eksperymentalny {{span}} zmiana na własne ryzyko):",
|
||||
"Locale:": "Ustawienia regionalne",
|
||||
"Save": "Zapisz",
|
||||
"Save and Reload": "Zapisz i ponownie załaduj",
|
||||
"This document's ID (for API use):": "Identyfikator tego dokumentu (na potrzeby API):",
|
||||
"Time Zone:": "Strefa czasowa:",
|
||||
"API": "API",
|
||||
"Document ID copied to clipboard": "Identyfikator dokumentu skopiowany do schowka",
|
||||
"Ok": "Ok",
|
||||
"Local currency ({{currency}})": "Waluta lokalna ({{currency}})"
|
||||
},
|
||||
"DocumentUsage": {
|
||||
"Contact the site owner to upgrade the plan to raise limits.": "Skontaktuj się z właścicielem witryny, aby uaktualnić plan w celu podniesienia limitów.",
|
||||
"Data Size": "Rozmiar danych",
|
||||
"Rows": "Wiersze",
|
||||
"Usage": "Zastosowanie",
|
||||
"Usage statistics are only available to users with full access to the document data.": "Statystyki użytkowania są dostępne tylko dla użytkowników z pełnym dostępem do danych dokumentu.",
|
||||
"start your 30-day free trial of the Pro plan.": "rozpocznij 30-dniową bezpłatną próbę planu Pro.",
|
||||
"Attachments Size": "Rozmiar załączników",
|
||||
"For higher limits, ": "W przypadku wyższych limitów, "
|
||||
},
|
||||
"DuplicateTable": {
|
||||
"Copy all data in addition to the table structure.": "Skopiuj wszystkie dane oprócz struktury tabeli.",
|
||||
"Instead of duplicating tables, it's usually better to segment data using linked views. {{link}}": "Zamiast duplikować tabele, zwykle lepiej jest segmentować dane za pomocą połączonych widoków. {{link}}",
|
||||
"Name for new table": "Nazwa dla nowej tabeli",
|
||||
"Only the document default access rules will apply to the copy.": "Do kopii będą miały zastosowanie tylko domyślne zasady dostępu do dokumentu."
|
||||
},
|
||||
"ExampleInfo": {
|
||||
"Afterschool Program": "Program pozaszkolny",
|
||||
"Check out our related tutorial for how to link data, and create high-productivity layouts.": "Sprawdź nasz powiązany samouczek, jak łączyć dane i tworzyć układy o wysokiej produktywności.",
|
||||
"Check out our related tutorial for how to model business data, use formulas, and manage complexity.": "Zapoznaj się z naszym poradnikiem dotyczącym modelowania danych biznesowych, używania formuł i zarządzania złożonością.",
|
||||
"Investment Research": "Badania inwestycyjne",
|
||||
"Lightweight CRM": "Lekki CRM",
|
||||
"Tutorial: Analyze & Visualize": "Samouczek: Analiza i wizualizacja",
|
||||
"Tutorial: Create a CRM": "Tutorial: Utwórz CRM",
|
||||
"Tutorial: Manage Business Data": "Samouczek: Zarządzanie danymi biznesowymi",
|
||||
"Welcome to the Afterschool Program template": "Witamy w szablonie programu pozaszkolnego",
|
||||
"Welcome to the Lightweight CRM template": "Witamy w lekkim szablonie CRM",
|
||||
"Check out our related tutorial to learn how to create summary tables and charts, and to link charts dynamically.": "Sprawdź nasz powiązany tutorial, aby dowiedzieć się, jak tworzyć tabele i wykresy zbiorcze oraz dynamicznie łączyć wykresy.",
|
||||
"Welcome to the Investment Research template": "Witamy w szablonie badań inwestycyjnych"
|
||||
},
|
||||
"FieldConfig": {
|
||||
"COLUMN BEHAVIOR": "ZACHOWANIE KOLUMNY",
|
||||
"COLUMN LABEL AND ID": "ETYKIETA I IDENTYFIKATOR KOLUMNY",
|
||||
"Clear and make into formula": "Wyczyść i przekształć w formułę",
|
||||
"Clear and reset": "Wyczyść i zresetuj",
|
||||
"Column options are limited in summary tables.": "Opcje kolumn są ograniczone w tabelach zbiorczych.",
|
||||
"Convert column to data": "Konwertowanie kolumny na dane",
|
||||
"Convert to trigger formula": "Konwersja do formuły wyzwalającej",
|
||||
"Data Columns_one": "Kolumna danych",
|
||||
"Formula Columns_one": "Kolumna formuły",
|
||||
"Formula Columns_other": "Kolumny formuł",
|
||||
"Set formula": "Ustaw formułę",
|
||||
"Mixed Behavior": "Mieszane zachowanie",
|
||||
"TRIGGER FORMULA": "FORMUŁA WYZWALACZA",
|
||||
"Data Columns_other": "Kolumny danych",
|
||||
"Empty Columns_one": "Pusta kolumna",
|
||||
"Empty Columns_other": "Puste kolumny",
|
||||
"Enter formula": "Wprowadź formułę",
|
||||
"Make into data column": "Zrób z tego kolumnę danych",
|
||||
"Set trigger formula": "Ustawianie formuły wyzwalacza"
|
||||
},
|
||||
"GridOptions": {
|
||||
"Zebra Stripes": "Paski zebry",
|
||||
"Vertical Gridlines": "Pionowe linie siatki",
|
||||
"Horizontal Gridlines": "Poziome linie siatki",
|
||||
"Grid Options": "Opcje siatki"
|
||||
},
|
||||
"GridViewMenus": {
|
||||
"Add Column": "Dodaj kolumnę",
|
||||
"Add to sort": "Dodaj do sortowania",
|
||||
"Clear values": "Wyczyść wartości",
|
||||
"Column Options": "Opcje kolumn",
|
||||
"Convert formula to data": "Konwertowanie formuły na dane",
|
||||
"Delete {{count}} columns_one": "Usuń kolumnę",
|
||||
"Delete {{count}} columns_other": "Usuń {{count}} kolumny",
|
||||
"Filter Data": "Filtrowanie danych",
|
||||
"Freeze {{count}} more columns_one": "Zablokuj jeszcze jedną kolumnę",
|
||||
"Freeze {{count}} columns_one": "Zablokuj tę kolumnę",
|
||||
"Freeze {{count}} columns_other": "Blokowanie kolumn {{count}}",
|
||||
"Freeze {{count}} more columns_other": "Zamrożenie jeszcze {{count}} kolumn",
|
||||
"Hide {{count}} columns_one": "Ukryj kolumnę",
|
||||
"Hide {{count}} columns_other": "Ukryj {{count}}kolumn",
|
||||
"Insert column to the {{to}}": "Wstaw kolumnę do {{to}}",
|
||||
"More sort options ...": "Więcej opcji sortowania…",
|
||||
"Rename column": "Zmień nazwę kolumny",
|
||||
"Reset {{count}} columns_one": "Wyzerować kolumnę",
|
||||
"Reset {{count}} columns_other": "Wyzeruj {{count}} kolumn",
|
||||
"Reset {{count}} entire columns_one": "Zresetuj całą kolumnę",
|
||||
"Reset {{count}} entire columns_other": "Resetowanie {{count}} całych kolumn",
|
||||
"Show column {{- label}}": "Pokaż kolumnę {{- label}}",
|
||||
"Sort": "Sortuj",
|
||||
"Sorted (#{{count}})_one": "Posortowane (#{{count}})",
|
||||
"Sorted (#{{count}})_other": "Posortowane (#{{count}})",
|
||||
"Unfreeze all columns": "Odblokuj wszystkie kolumny",
|
||||
"Unfreeze {{count}} columns_one": "Odblokuj tę kolumnę",
|
||||
"Unfreeze {{count}} columns_other": "Odblokuj kolumny {{count}}"
|
||||
},
|
||||
"GristDoc": {
|
||||
"Added new linked section to view {{viewName}}": "Dodano nową połączoną sekcję do widoku {{viewName}}",
|
||||
"Import from file": "Import z pliku",
|
||||
"Saved linked section {{title}} in view {{name}}": "Zapisane połączone sekcje {{title}} w widoku {{name}}"
|
||||
},
|
||||
"Drafts": {
|
||||
"Restore last edit": "Przywróć ostatnią zmianę",
|
||||
"Undo discard": "Cofnij odrzucenie"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Use separate settings": "Użyj oddzielnych ustawień",
|
||||
"Revert to common settings": "Przywrócenie zwykłych ustawień",
|
||||
"Using common settings": "Używanie wspólnych ustawień",
|
||||
"Save as common settings": "Zapisz jako ustawienia wspólne",
|
||||
"Using separate settings": "Używanie oddzielnych ustawień"
|
||||
},
|
||||
"FilterBar": {
|
||||
"Search Columns": "Wyszukaj kolumny",
|
||||
"SearchColumns": "Wyszukaj kolumny"
|
||||
},
|
||||
"FilterConfig": {
|
||||
"Add Column": "Dodaj kolumnę"
|
||||
},
|
||||
"HomeLeftPane": {
|
||||
"Delete": "Usuń",
|
||||
"Delete {{workspace}} and all included documents?": "Usunąć {{workspace}} i wszystkie dołączone dokumenty?",
|
||||
"Examples & Templates": "Przykłady i szablony",
|
||||
"All Documents": "Wszystkie dokumenty",
|
||||
"Create Empty Document": "Utwórz pusty dokument",
|
||||
"Create Workspace": "Utwórz przestrzeń roboczą",
|
||||
"Access Details": "Szczegóły dostępu"
|
||||
}
|
||||
}
|
||||
|
@ -168,7 +168,7 @@
|
||||
"Other Non-Matching": "Outros Não-Coincidentes",
|
||||
"Other Values": "Outros Valores",
|
||||
"Others": "Outros",
|
||||
"Search": "Pesquisa",
|
||||
"Search": "Pesquisar",
|
||||
"Search values": "Pesquisar valores",
|
||||
"Start": "Começo",
|
||||
"Filter by Range": "Filtrar por intervalo"
|
||||
@ -222,7 +222,7 @@
|
||||
"Delete {{name}}": "Excluir {{name}}",
|
||||
"Deleted {{at}}": "{{at}} excluído",
|
||||
"Discover More Templates": "Descubra mais Modelos",
|
||||
"Document will be moved to Trash.": "O documento será movido à Lixeira.",
|
||||
"Document will be moved to Trash.": "O documento será movido pra Lixeira.",
|
||||
"Document will be permanently deleted.": "O documento será permanentemente excluído.",
|
||||
"Documents stay in Trash for 30 days, after which they get deleted permanently.": "Os documentos ficam na Lixeira por 30 dias, após os quais são excluídos permanentemente.",
|
||||
"Edited {{at}}": "{{at}} editado",
|
||||
@ -244,7 +244,7 @@
|
||||
"This service is not available right now": "Este serviço não está disponível no momento",
|
||||
"To restore this document, restore the workspace first.": "Para restaurar esse documento, restaure a área de trabalho primeiro.",
|
||||
"Trash": "Lixeira",
|
||||
"Trash is empty.": "O lixeira está vazia.",
|
||||
"Trash is empty.": "A lixeira está vazia.",
|
||||
"Unpin Document": "Desafixar o Documento",
|
||||
"Workspace not found": "Área de trabalho não encontrada",
|
||||
"You are on the {{siteName}} site. You also have access to the following sites:": "Você está no site {{siteName}}. Você também tem acesso aos seguintes sites:",
|
||||
@ -346,7 +346,8 @@
|
||||
"Empty Columns_one": "Coluna vazia",
|
||||
"Empty Columns_other": "Colunas Vazias",
|
||||
"Formula Columns_one": "Coluna de Fórmula",
|
||||
"Formula Columns_other": "Colunas de Fórmula"
|
||||
"Formula Columns_other": "Colunas de Fórmula",
|
||||
"DESCRIPTION": "DESCRIÇÃO"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Revert to common settings": "Reverter para configurações comuns",
|
||||
@ -449,7 +450,7 @@
|
||||
"Manage Users": "Gerenciar Usuários",
|
||||
"Rename": "Renomear",
|
||||
"Trash": "Lixeira",
|
||||
"Workspace will be moved to Trash.": "A Área de Trabalho será movida à Lixeira.",
|
||||
"Workspace will be moved to Trash.": "A Área de Trabalho será movida pra Lixeira.",
|
||||
"Workspaces": "Áreas de Trabalho"
|
||||
},
|
||||
"Importer": {
|
||||
@ -467,7 +468,7 @@
|
||||
"Enter document name": "Digite o nome do documento",
|
||||
"However, it appears to be already identical.": "No entanto, parece já ser idêntico.",
|
||||
"Include the structure without any of the data.": "Incluir a estrutura sem os dados.",
|
||||
"It will be overwritten, losing any content not in this document.": "Ele será substituído, perdendo qualquer conteúdo que não esteja neste documento.",
|
||||
"It will be overwritten, losing any content not in this document.": "Será substituído, perdendo qualquer conteúdo que não esteja neste documento.",
|
||||
"Name": "Nome",
|
||||
"No destination workspace": "Nenhuma área de trabalho de destino",
|
||||
"Organization": "Organização",
|
||||
@ -606,8 +607,8 @@
|
||||
"Download": "Baixar",
|
||||
"Duplicate Document": "Duplicar o Documento",
|
||||
"Edit without affecting the original": "Editar sem afetar o original",
|
||||
"Export CSV": "Exportar a CSV",
|
||||
"Export XLSX": "Exportar a XLSX",
|
||||
"Export CSV": "Exportar CSV",
|
||||
"Export XLSX": "Exportar XLSX",
|
||||
"Manage Users": "Gerenciar Usuários",
|
||||
"Original": "Original",
|
||||
"Replace {{termToUse}}...": "Substituir {{termToUse}}…",
|
||||
|
@ -219,7 +219,8 @@
|
||||
"Make into data column": "Преобразовать в столбец данных",
|
||||
"Enter formula": "Введите формулу",
|
||||
"Mixed Behavior": "Смешанное поведение",
|
||||
"Set formula": "Задать формулу"
|
||||
"Set formula": "Задать формулу",
|
||||
"DESCRIPTION": "ОПИСАНИЕ"
|
||||
},
|
||||
"MakeCopyMenu": {
|
||||
"Update Original": "Обновить оригинал",
|
||||
|
@ -32,7 +32,8 @@
|
||||
"COLUMN BEHAVIOR": "ПОВОДЖЕННЯ СТОВПЦІВ",
|
||||
"Convert to trigger formula": "Перетворити на тригерну формулу",
|
||||
"Column options are limited in summary tables.": "Налаштування стовпців у підсумкових таблицях обмежені.",
|
||||
"Convert column to data": "Перетворити стовпець у дані"
|
||||
"Convert column to data": "Перетворити стовпець у дані",
|
||||
"DESCRIPTION": "ОПИС"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Revert to common settings": "Повернутися до загальних налаштувань",
|
||||
|
945
static/locales/zh_Hans.client.json
Normal file
945
static/locales/zh_Hans.client.json
Normal file
@ -0,0 +1,945 @@
|
||||
{
|
||||
"AccessRules": {
|
||||
"Remove {{- tableId }} rules": "删除 {{- tableId }} 规则",
|
||||
"Remove {{- name }} user attribute": "删除 {{- name }} 用户属性",
|
||||
"Reset": "重置",
|
||||
"Rules for table ": "表格规则 ",
|
||||
"Save": "保存",
|
||||
"Saved": "已保存",
|
||||
"Special Rules": "特殊规则",
|
||||
"Type a message...": "输入一个拒绝时的提示信息…",
|
||||
"User Attributes": "用户属性",
|
||||
"View As": "查看为",
|
||||
"Seed rules": "种子规则",
|
||||
"Permission to edit document structure": "编辑文档结构的权限",
|
||||
"Add Column Rule": "添加列规则",
|
||||
"Attribute to Look Up": "要查找的属性",
|
||||
"Everyone": "每个人",
|
||||
"Permission to access the document in full when needed": "允许在需要时获取文件的全部内容",
|
||||
"Add Default Rule": "添加默认规则",
|
||||
"Add Table Rules": "添加表格规则",
|
||||
"Add User Attributes": "添加用户属性",
|
||||
"Allow everyone to copy the entire document, or view it in full in fiddle mode.\nUseful for examples and templates, but not for sensitive data.": "允许每个人复制整个文档,或在演示模式下完整查看。\n适用于示例和模板,但不要用在有敏感数据的情况下。",
|
||||
"Attribute name": "属性名称",
|
||||
"Condition": "条件",
|
||||
"Default Rules": "默认规则",
|
||||
"Enter Condition": "输入条件",
|
||||
"Permission to view Access Rules": "查看访问规则的权限",
|
||||
"Allow everyone to view Access Rules.": "允许所有人查看访问规则。",
|
||||
"Lookup Table": "查找表",
|
||||
"Checking...": "检查中…",
|
||||
"Delete Table Rules": "删除表格规则",
|
||||
"Everyone Else": "其他所有人",
|
||||
"Invalid": "无效的",
|
||||
"Lookup Column": "查找列",
|
||||
"Permissions": "权限",
|
||||
"Remove column {{- colId }} from {{- tableId }} rules": "从 {{- tableId }} 规则中删除列 {{- colId }}",
|
||||
"When adding table rules, automatically add a rule to grant OWNER full access.": "添加表规则时,自动添加规则以授予 OWNER 完全访问权限。"
|
||||
},
|
||||
"AccountPage": {
|
||||
"API": "API",
|
||||
"API Key": "API密钥",
|
||||
"Account settings": "帐户设置",
|
||||
"Allow signing in to this account with Google": "允许通过谷歌登录此帐号",
|
||||
"Change Password": "更改密码",
|
||||
"Edit": "编辑",
|
||||
"Email": "电子邮件",
|
||||
"Login Method": "登录方式",
|
||||
"Name": "名字",
|
||||
"Names only allow letters, numbers and certain special characters": "名称仅允许使用字母、数字和某些特殊字符",
|
||||
"Password & Security": "密码",
|
||||
"Save": "保存",
|
||||
"Theme": "主题",
|
||||
"Two-factor authentication": "双因素身份验证",
|
||||
"Two-factor authentication is an extra layer of security for your Grist account designed to ensure that you're the only person who can access your account, even if someone knows your password.": "双因素身份验证是您的Grist帐户的额外安全层,旨在确保您是唯一可以访问您的帐户的人,即使有人知道您的密码。",
|
||||
"Language": "语言"
|
||||
},
|
||||
"CodeEditorPanel": {
|
||||
"Access denied": "访问被拒绝",
|
||||
"Code View is available only when you have full document access.": "代码视图只有在你有完整的文档权限时才可用。"
|
||||
},
|
||||
"ColorSelect": {
|
||||
"Cancel": "取消",
|
||||
"Default cell style": "默认单元格样式",
|
||||
"Apply": "应用"
|
||||
},
|
||||
"ColumnFilterMenu": {
|
||||
"All": "全部",
|
||||
"All Shown": "全部显示",
|
||||
"Filter by Range": "按范围筛选",
|
||||
"No matching values": "没有匹配的值",
|
||||
"None": "None",
|
||||
"Min": "Min",
|
||||
"Max": "Max",
|
||||
"Start": "开始",
|
||||
"Other Matching": "其他匹配",
|
||||
"Other Non-Matching": "其他不匹配的",
|
||||
"Others": "其他",
|
||||
"Search": "搜索",
|
||||
"All Except": "全部除外",
|
||||
"End": "结束",
|
||||
"Other Values": "其他值",
|
||||
"Search values": "搜索值",
|
||||
"Future Values": "未来价值"
|
||||
},
|
||||
"CustomSectionConfig": {
|
||||
" (optional)": " (可选)",
|
||||
"Add": "添加",
|
||||
"Full document access": "完整文档访问权限",
|
||||
"Learn more about custom widgets": "了解有关自定义小部件的更多信息",
|
||||
"No document access": "没有文档访问权限",
|
||||
"Open configuration": "打开配置",
|
||||
"Pick a column": "选择一列",
|
||||
"Read selected table": "读取选定的表格",
|
||||
"Select Custom Widget": "选择自定义小部件",
|
||||
"Widget does not require any permissions.": "小部件不需要任何权限。",
|
||||
"Widget needs to {{read}} the current table.": "小部件需要 {{read}} 当前表。",
|
||||
"Widget needs {{fullAccess}} to this document.": "小部件需要 {{fullAccess}} 到此文档。",
|
||||
"Enter Custom URL": "输入自定义URL",
|
||||
"Pick a {{columnType}} column": "选择一个 {{columnType}} 列",
|
||||
"{{wrongTypeCount}} non-{{columnType}} columns are not shown_one": "{{wrongTypeCount}} 非 {{columnType}} 列未显示",
|
||||
"{{wrongTypeCount}} non-{{columnType}} columns are not shown_other": "{{wrongTypeCount}} 非 {{columnType}} 列未显示"
|
||||
},
|
||||
"ChartView": {
|
||||
"Create separate series for each value of the selected column.": "为所选列的每个值创建单独的系列。",
|
||||
"Toggle chart aggregation": "切换图表聚合",
|
||||
"selected new group data columns": "选定的新组数据列",
|
||||
"Pick a column": "选择一列",
|
||||
"Each Y series is followed by a series for the length of error bars.": "每个 Y 系列后跟一个误差条长度的系列。",
|
||||
"Each Y series is followed by two series, for top and bottom error bars.": "每个 Y 系列后跟两个系列,用于顶部和底部误差线。"
|
||||
},
|
||||
"DataTables": {
|
||||
"Click to copy": "点击复制",
|
||||
"Delete {{formattedTableName}} data, and remove it from all pages?": "删除 {{formattedTableName}} 数据,并将其从所有页面中删除?",
|
||||
"Duplicate Table": "复制表",
|
||||
"Raw Data Tables": "原始数据表",
|
||||
"Table ID copied to clipboard": "表 ID 已复制到剪贴板",
|
||||
"You do not have edit access to this document": "您没有对此文档的编辑权限"
|
||||
},
|
||||
"CellContextMenu": {
|
||||
"Duplicate rows_one": "重复行",
|
||||
"Delete {{count}} columns_other": "删除 {{count}} 列",
|
||||
"Delete {{count}} rows_one": "删除行",
|
||||
"Duplicate rows_other": "重复行",
|
||||
"Filter by this value": "按此值筛选",
|
||||
"Insert column to the left": "在左侧插入列",
|
||||
"Insert row below": "在下方插入行",
|
||||
"Insert column to the right": "在右侧插入列",
|
||||
"Reset {{count}} columns_other": "重置 {{count}} 列",
|
||||
"Insert row": "插入行",
|
||||
"Insert row above": "在上方插入行",
|
||||
"Reset {{count}} columns_one": "重置列",
|
||||
"Reset {{count}} entire columns_one": "重置整列",
|
||||
"Reset {{count}} entire columns_other": "重置 {{count}} 整列",
|
||||
"Clear cell": "清除单元格",
|
||||
"Clear values": "清除值",
|
||||
"Copy anchor link": "复制锚点链接",
|
||||
"Delete {{count}} columns_one": "删除列",
|
||||
"Delete {{count}} rows_other": "删除 {{count}} 行"
|
||||
},
|
||||
"ACUserManager": {
|
||||
"Enter email address": "请输入电邮地址",
|
||||
"Invite new member": "邀请新成员",
|
||||
"We'll email an invite to {{email}}": "我们将通过电子邮件向 {{email}} 发送邀请"
|
||||
},
|
||||
"ActionLog": {
|
||||
"Column {{colId}} was subsequently removed in action #{{action.actionNum}}": "列 {{colId}} 将在操作 #{{action.actionNum}} 中删除",
|
||||
"Action Log failed to load": "操作日志加载失败",
|
||||
"Table {{tableId}} was subsequently removed in action #{{actionNum}}": "表 {{tableId}} 将在操作 #{{actionNum}} 中删除",
|
||||
"This row was subsequently removed in action {{action.actionNum}}": "该行将在操作 {{action.actionNum}} 中删除"
|
||||
},
|
||||
"ApiKey": {
|
||||
"This API key can be used to access this account anonymously via the API.": "该API密钥可用于通过API匿名访问该账户。",
|
||||
"You're about to delete an API key. This will cause all future requests using this API key to be rejected. Do you still want to delete?": "您将要删除 API 密钥。这将导致将来使用此 API 密钥的所有请求被拒绝。是否仍要删除?",
|
||||
"By generating an API key, you will be able to make API calls for your own account.": "通过生成 API 密钥,您将能够为自己的帐户进行 API 调用。",
|
||||
"Click to show": "点击显示",
|
||||
"Create": "创建",
|
||||
"Remove": "删除",
|
||||
"Remove API Key": "删除 API 密钥",
|
||||
"This API key can be used to access your account via the API. Don’t share your API key with anyone.": "此 API 密钥可用于通过 API 访问您的帐户。不要与任何人分享您的 API 密钥。"
|
||||
},
|
||||
"AccountWidget": {
|
||||
"Access Details": "访问详情",
|
||||
"Accounts": "帐户",
|
||||
"Add Account": "新增帐户",
|
||||
"Document Settings": "文档设置",
|
||||
"Manage Team": "管理团队",
|
||||
"Pricing": "定价",
|
||||
"Profile Settings": "配置设置",
|
||||
"Sign Out": "登出",
|
||||
"Sign in": "登录",
|
||||
"Switch Accounts": "切换帐户",
|
||||
"Toggle Mobile Mode": "切换移动模式"
|
||||
},
|
||||
"ViewAsDropdown": {
|
||||
"View As": "查看为",
|
||||
"Users from table": "表中的用户",
|
||||
"Example Users": "示例用户"
|
||||
},
|
||||
"AddNewButton": {
|
||||
"Add New": "新增"
|
||||
},
|
||||
"App": {
|
||||
"Description": "描述",
|
||||
"Key": "关键",
|
||||
"Memory Error": "内存错误"
|
||||
},
|
||||
"AppHeader": {
|
||||
"Home Page": "主页",
|
||||
"Legacy": "遗产",
|
||||
"Personal Site": "个人网站",
|
||||
"Team Site": "团队网站"
|
||||
},
|
||||
"AppModel": {
|
||||
"This team site is suspended. Documents can be read, but not modified.": "此团队网站已挂起。可以读取文档,但不能修改文档。"
|
||||
},
|
||||
"DocMenu": {
|
||||
"You are on your personal site. You also have access to the following sites:": "你在你的个人网站上。 您还可以访问以下站点:",
|
||||
"Document will be permanently deleted.": "文档将被永久删除。",
|
||||
"Documents stay in Trash for 30 days, after which they get deleted permanently.": "文档在回收站中保留 30 天,之后它们将被永久删除。",
|
||||
"Edited {{at}}": "编辑于{{at}}",
|
||||
"Examples & Templates": "示例和模板",
|
||||
"Examples and Templates": "示例和模板",
|
||||
"Featured": "精选",
|
||||
"Manage Users": "管理用户",
|
||||
"More Examples and Templates": "更多示例和模板",
|
||||
"Move": "移动",
|
||||
"Move {{name}} to workspace": "将 {{name}} 移动到工作区",
|
||||
"Other Sites": "其他网站",
|
||||
"Permanently Delete \"{{name}}\"?": "永久删除“{{name}}”?",
|
||||
"Pin Document": "Pin文档",
|
||||
"Pinned Documents": "固定文件",
|
||||
"Remove": "消除",
|
||||
"Rename": "改名",
|
||||
"(The organization needs a paid plan)": "(该组织需要付费计划)",
|
||||
"Access Details": "访问详细信息",
|
||||
"All Documents": "所有文件",
|
||||
"By Date Modified": "按修改日期",
|
||||
"By Name": "按名字",
|
||||
"Current workspace": "当前工作区",
|
||||
"Delete": "删除",
|
||||
"Delete Forever": "永久删除",
|
||||
"Deleted {{at}}": "已删除 {{at}}",
|
||||
"Discover More Templates": "发现更多模板",
|
||||
"Document will be moved to Trash.": "文档将被移至废纸篓。",
|
||||
"Requires edit permissions": "需要编辑权限",
|
||||
"Restore": "恢复",
|
||||
"This service is not available right now": "该服务目前不可用",
|
||||
"To restore this document, restore the workspace first.": "要恢复此文档,请先恢复工作区。",
|
||||
"Trash": "回收站",
|
||||
"Trash is empty.": "回收站是空的。",
|
||||
"Unpin Document": "取消固定文档",
|
||||
"Workspace not found": "找不到工作区",
|
||||
"You are on the {{siteName}} site. You also have access to the following sites:": "您在 {{siteName}} 网站上。 您还可以访问以下站点:",
|
||||
"You may delete a workspace forever once it has no documents in it.": "一旦其中没有文档,您可以永远删除工作区。",
|
||||
"Delete {{name}}": "删除 {{name}}"
|
||||
},
|
||||
"DocPageModel": {
|
||||
"Add Empty Table": "添加空表",
|
||||
"Add Page": "添加页面",
|
||||
"Add Widget to Page": "将小部件添加到页面",
|
||||
"Enter recovery mode": "进入恢复模式",
|
||||
"Error accessing document": "访问文档时出错",
|
||||
"Reload": "重新加载",
|
||||
"You do not have edit access to this document": "您没有对此文档的编辑权限",
|
||||
"Sorry, access to this document has been denied. [{{error}}]": "对不起,该文件的访问已被拒绝。[{{error}}]",
|
||||
"You can try reloading the document, or using recovery mode. Recovery mode opens the document to be fully accessible to owners, and inaccessible to others. It also disables formulas. [{{error}}]": "您可以尝试重新加载文档,或使用恢复模式。在恢复模式中打开文档时,所有者可以完全访问,其他人无法访问。它还会禁用公式。 [{{error}}]",
|
||||
"Document owners can attempt to recover the document. [{{error}}]": "文档所有者可以尝试恢复文档。 [{{error}}]"
|
||||
},
|
||||
"SortFilterConfig": {
|
||||
"Sort": "排序",
|
||||
"Filter": "筛选",
|
||||
"Revert": "恢复",
|
||||
"Save": "保存",
|
||||
"Update Sort & Filter settings": "更新排序和筛选设置"
|
||||
},
|
||||
"DocHistory": {
|
||||
"Snapshots": "快照",
|
||||
"Activity": "活动",
|
||||
"Beta": "测试版",
|
||||
"Compare to Current": "与当前比较",
|
||||
"Compare to Previous": "与以前相比",
|
||||
"Open Snapshot": "打开快照",
|
||||
"Snapshots are unavailable.": "快照不可用。"
|
||||
},
|
||||
"welcomeTour": {
|
||||
"Share": "分享",
|
||||
"Reference": "参考",
|
||||
"Flying higher": "飞得更高",
|
||||
"Help Center": "帮助中心",
|
||||
"Sharing": "分享",
|
||||
"Welcome to Grist!": "欢迎来到格里斯特!",
|
||||
"Browse our {{templateLibrary}} to discover what's possible and get inspired.": "浏览我们的 {{templateLibrary}} 发现可能性并获得灵感。",
|
||||
"Building up": "建起来",
|
||||
"Add New": "添新",
|
||||
"Configuring your document": "配置您的文档",
|
||||
"Customizing columns": "自定义列",
|
||||
"Double-click or hit {{enter}} on a cell to edit it. ": "双击或点击单元格上的 {{enter}} 对其进行编辑。 ",
|
||||
"Editing Data": "编辑数据",
|
||||
"Enter": "进入",
|
||||
"Make it relational! Use the {{ref}} type to link tables. ": "让它有关系! 使用 {{ref}} 类型链接表格。 ",
|
||||
"Set formatting options, formulas, or column types, such as dates, choices, or attachments. ": "设置格式设置选项、公式或列类型,例如日期、选项或附件。 ",
|
||||
"Start with {{equal}} to enter a formula.": "从 {{equal}} 开始输入公式。",
|
||||
"Toggle the {{creatorPanel}} to format columns, ": "切换 {{creatorPanel}} 以格式化列, ",
|
||||
"Use the Share button ({{share}}) to share the document or export data.": "使用共享按钮 ({{share}}) 共享文档或导出数据。",
|
||||
"Use {{addNew}} to add widgets, pages, or import more data. ": "使用 {{addNew}} 添加小部件、页面或导入更多数据。 ",
|
||||
"Use {{helpCenter}} for documentation or questions.": "使用 {{helpCenter}} 获取文档或问题。",
|
||||
"convert to card view, select data, and more.": "转换为卡片视图、选择数据等。",
|
||||
"creator panel": "创作者面板",
|
||||
"template library": "模板库"
|
||||
},
|
||||
"HomeIntro": {
|
||||
"Interested in using Grist outside of your team? Visit your free ": "有兴趣在您的团队之外使用 Grist 吗? 访问您的免费 ",
|
||||
"Invite Team Members": "邀请团队成员",
|
||||
"Sign up": "报名",
|
||||
"personal site": "个人网站",
|
||||
"Any documents created in this site will appear here.": "在此站点中创建的任何文档都将显示在此处。",
|
||||
"Browse Templates": "浏览模板",
|
||||
"Create Empty Document": "创建空文档",
|
||||
"Get started by creating your first Grist document.": "从创建您的第一个 Grist 文档开始。",
|
||||
"Get started by exploring templates, or creating your first Grist document.": "从浏览模板或创建您的第一个 Grist 文档开始。",
|
||||
"Get started by inviting your team and creating your first Grist document.": "开始邀请您的团队并创建您的第一个 Grist 文档。",
|
||||
"Help Center": "帮助中心",
|
||||
"Import Document": "导入文档",
|
||||
"Sprouts Program": "新芽计划",
|
||||
"This workspace is empty.": "这个工作区是空的。",
|
||||
"Visit our {{link}} to learn more.": "访问我们的{{link}}以了解更多信息。",
|
||||
"Welcome to Grist!": "欢迎来到格里斯特!",
|
||||
"Welcome to Grist, {{name}}!": "欢迎来到 Grist,{{name}}!",
|
||||
"Welcome to {{orgName}}": "欢迎来到{{orgName}}",
|
||||
"You have read-only access to this site. Currently there are no documents.": "您对该站点具有只读访问权限。 目前没有文件。",
|
||||
"{{signUp}} to save your work. ": "{{signUp}} 保存您的工作。 "
|
||||
},
|
||||
"HomeLeftPane": {
|
||||
"Delete": "删除",
|
||||
"Trash": "回收站",
|
||||
"Access Details": "访问详细信息",
|
||||
"All Documents": "所有文件",
|
||||
"Create Empty Document": "创建空文档",
|
||||
"Create Workspace": "创建工作区",
|
||||
"Delete {{workspace}} and all included documents?": "删除 {{workspace}} 和所有包含的文档?",
|
||||
"Examples & Templates": "示例和模板",
|
||||
"Import Document": "导入文档",
|
||||
"Manage Users": "管理用户",
|
||||
"Rename": "改名",
|
||||
"Workspace will be moved to Trash.": "工作区将移至回收站。",
|
||||
"Workspaces": "工作区"
|
||||
},
|
||||
"MakeCopyMenu": {
|
||||
"Cancel": "取消",
|
||||
"Enter document name": "输入文档名称",
|
||||
"Name": "姓名",
|
||||
"No destination workspace": "没有目标工作区",
|
||||
"Organization": "组织",
|
||||
"Sign up": "报名",
|
||||
"Update": "更新",
|
||||
"As Template": "作为模板",
|
||||
"Be careful, the original has changes not in this document. Those changes will be overwritten.": "请注意,原始文档中没有更改。 这些更改将被覆盖。",
|
||||
"However, it appears to be already identical.": "但是,它似乎已经完全相同。",
|
||||
"Include the structure without any of the data.": "包括没有任何数据的结构。",
|
||||
"It will be overwritten, losing any content not in this document.": "它将被覆盖,丢失不在本文档中的任何内容。",
|
||||
"Original Has Modifications": "原始有修改",
|
||||
"Original Looks Unrelated": "原始外观无关",
|
||||
"Original Looks Identical": "原始外观相同",
|
||||
"Overwrite": "覆盖",
|
||||
"Replacing the original requires editing rights on the original document.": "替换原件需要对原始文档的编辑权限。",
|
||||
"The original version of this document will be updated.": "本文档的原始版本将被更新。",
|
||||
"To save your changes, please sign up, then reload this page.": "要保存您的更改,请注册,然后重新加载此页面。",
|
||||
"Update Original": "更新原件",
|
||||
"Workspace": "工作区",
|
||||
"You do not have write access to the selected workspace": "您没有对所选工作区的写入权限",
|
||||
"You do not have write access to this site": "您没有对此网站的写入权限"
|
||||
},
|
||||
"NotifyUI": {
|
||||
"Go to your free personal site": "转到您的免费个人网站",
|
||||
"No notifications": "没有通知",
|
||||
"Notifications": "通知",
|
||||
"Renew": "更新",
|
||||
"Ask for help": "请求帮忙",
|
||||
"Cannot find personal site, sorry!": "找不到个人网站,抱歉!",
|
||||
"Give feedback": "给予反馈",
|
||||
"Report a problem": "报告一个问题",
|
||||
"Upgrade Plan": "升级计划"
|
||||
},
|
||||
"OpenVideoTour": {
|
||||
"Grist Video Tour": "格里斯特视频之旅",
|
||||
"Video Tour": "视频导览",
|
||||
"YouTube video player": "YouTube 视频播放器"
|
||||
},
|
||||
"RecordLayout": {
|
||||
"Updating record layout.": "更新记录布局。"
|
||||
},
|
||||
"RightPanel": {
|
||||
"DATA TABLE": "数据表",
|
||||
"DATA TABLE NAME": "数据表名称",
|
||||
"CHART TYPE": "图表类型",
|
||||
"COLUMN TYPE": "栏目类型",
|
||||
"CUSTOM": "风俗",
|
||||
"Change Widget": "更改小部件",
|
||||
"Columns_one": "列",
|
||||
"Columns_other": "列",
|
||||
"Data": "数据",
|
||||
"Detach": "分离",
|
||||
"Edit Data Selection": "编辑数据选择",
|
||||
"Fields_one": "字段",
|
||||
"Fields_other": "字段",
|
||||
"GROUPED BY": "分组依据",
|
||||
"ROW STYLE": "行式",
|
||||
"Row Style": "行样式",
|
||||
"SELECT BY": "选择依据",
|
||||
"SELECTOR FOR": "选择器",
|
||||
"SOURCE DATA": "源数据",
|
||||
"Save": "保存",
|
||||
"Select Widget": "选择小部件",
|
||||
"Series_one": "系列",
|
||||
"Series_other": "系列",
|
||||
"Sort & Filter": "排序&过滤",
|
||||
"TRANSFORM": "转换",
|
||||
"Theme": "主题",
|
||||
"WIDGET TITLE": "小部件标题",
|
||||
"Widget": "小部件",
|
||||
"You do not have edit access to this document": "您没有对此文档的编辑权限"
|
||||
},
|
||||
"RowContextMenu": {
|
||||
"Insert row below": "在下方插入行",
|
||||
"Copy anchor link": "复制锚链接",
|
||||
"Delete": "删除",
|
||||
"Duplicate rows_one": "重复行",
|
||||
"Duplicate rows_other": "重复行",
|
||||
"Insert row": "插入行",
|
||||
"Insert row above": "在上方插入行"
|
||||
},
|
||||
"UserManagerModel": {
|
||||
"In Full": "在全",
|
||||
"No Default Access": "没有默认访问权限",
|
||||
"None": "没有任何",
|
||||
"Viewer": "查看器",
|
||||
"Editor": "编辑",
|
||||
"Owner": "所有者",
|
||||
"View & Edit": "查看和编辑",
|
||||
"View Only": "只读"
|
||||
},
|
||||
"ValidationPanel": {
|
||||
"Rule {{length}}": "规则 {{length}}",
|
||||
"Update formula (Shift+Enter)": "更新公式(Shift+Enter)"
|
||||
},
|
||||
"ViewConfigTab": {
|
||||
"Compact": "袖珍的",
|
||||
"Edit Card Layout": "编辑卡片布局",
|
||||
"Form": "形式",
|
||||
"Make On-Demand": "按需制作",
|
||||
"Plugin: ": "插入: ",
|
||||
"Section: ": "部分: ",
|
||||
"Advanced settings": "高级设置",
|
||||
"Big tables may be marked as \"on-demand\" to avoid loading them into the data engine.": "大表可能被标记为“按需”以避免将它们加载到数据引擎中。",
|
||||
"Blocks": "积木",
|
||||
"Unmark On-Demand": "取消标记点播"
|
||||
},
|
||||
"ViewLayoutMenu": {
|
||||
"Delete record": "删除记录",
|
||||
"Open configuration": "打开配置",
|
||||
"Print widget": "打印小部件",
|
||||
"Advanced Sort & Filter": "高级排序和过滤",
|
||||
"Copy anchor link": "复制锚链接",
|
||||
"Data selection": "数据选择",
|
||||
"Delete widget": "删除小部件",
|
||||
"Download as CSV": "下载为 CSV",
|
||||
"Download as XLSX": "下载为 XLSX",
|
||||
"Edit Card Layout": "编辑卡片布局",
|
||||
"Show raw data": "显示原始数据",
|
||||
"Widget options": "小部件选项"
|
||||
},
|
||||
"ViewSectionMenu": {
|
||||
"Save": "保存",
|
||||
"Update Sort&Filter settings": "更新排序和筛选设置",
|
||||
"Revert": "恢复",
|
||||
"(customized)": "(定制)",
|
||||
"(empty)": "(空的)",
|
||||
"(modified)": "(修改的)",
|
||||
"Custom options": "自定义选项",
|
||||
"FILTER": "筛选",
|
||||
"SORT": "排序"
|
||||
},
|
||||
"VisibleFieldsConfig": {
|
||||
"Cannot drop items into Hidden Fields": "无法将项目放入隐藏字段",
|
||||
"Clear": "清除",
|
||||
"Hidden Fields cannot be reordered": "隐藏字段无法重新排序",
|
||||
"Select All": "全选"
|
||||
},
|
||||
"WelcomeQuestions": {
|
||||
"IT & Technology": "资讯科技",
|
||||
"Sales": "销售量",
|
||||
"What brings you to Grist? Please help us serve you better.": "是什么让你来到格里斯特? 请帮助我们更好地为您服务。",
|
||||
"Education": "教育",
|
||||
"Finance & Accounting": "财务与会计",
|
||||
"HR & Management": "人力资源与管理",
|
||||
"Marketing": "营销",
|
||||
"Media Production": "媒体制作",
|
||||
"Other": "其他",
|
||||
"Product Development": "产品开发",
|
||||
"Research": "研究",
|
||||
"Type here": "在此输入",
|
||||
"Welcome to Grist!": "欢迎来到格里斯特!"
|
||||
},
|
||||
"breadcrumbs": {
|
||||
"recovery mode": "恢复模式",
|
||||
"snapshot": "快照",
|
||||
"fiddle": "小提琴",
|
||||
"override": "覆盖",
|
||||
"unsaved": "未保存",
|
||||
"You may make edits, but they will create a new copy and will\nnot affect the original document.": "您可以进行编辑,但他们会创建一个新副本并且\n不影响原文件。"
|
||||
},
|
||||
"ConditionalStyle": {
|
||||
"Row Style": "行样式",
|
||||
"Rule must return True or False": "规则必须返回 True 或 False",
|
||||
"Add another rule": "添加另一条规则",
|
||||
"Add conditional style": "添加条件样式",
|
||||
"Error in style rule": "样式规则错误"
|
||||
},
|
||||
"CurrencyPicker": {
|
||||
"Invalid currency": "货币无效"
|
||||
},
|
||||
"DiscussionEditor": {
|
||||
"Only current page": "仅当前页面",
|
||||
"Only my threads": "只有我的线程",
|
||||
"Resolve": "解决",
|
||||
"Save": "保存",
|
||||
"Show resolved comments": "显示已解决的评论",
|
||||
"Showing last {{nb}} comments": "显示最后 {{nb}} 条评论",
|
||||
"Cancel": "取消",
|
||||
"Comment": "评论",
|
||||
"Edit": "编辑",
|
||||
"Marked as resolved": "标记为已解决",
|
||||
"Open": "打开",
|
||||
"Remove": "删除",
|
||||
"Reply": "回复",
|
||||
"Reply to a comment": "回复评论",
|
||||
"Started discussion": "开始讨论",
|
||||
"Write a comment": "写一个评论"
|
||||
},
|
||||
"FieldBuilder": {
|
||||
"Changing multiple column types": "更改多个列类型",
|
||||
"Revert field settings for {{colId}} to common": "将 {{colId}} 的字段设置恢复为通用",
|
||||
"Save field settings for {{colId}} as common": "将 {{colId}} 的字段设置保存为通用",
|
||||
"Apply Formula to Data": "将公式应用于数据",
|
||||
"CELL FORMAT": "细胞格式",
|
||||
"DATA FROM TABLE": "表中数据",
|
||||
"Mixed format": "混合格式",
|
||||
"Mixed types": "混合类型",
|
||||
"Use separate field settings for {{colId}}": "为 {{colId}} 使用单独的字段设置"
|
||||
},
|
||||
"FormulaEditor": {
|
||||
"Column or field is required": "列或字段是必需的",
|
||||
"Error in the cell": "单元格错误",
|
||||
"Errors in all {{numErrors}} cells": "所有 {{numErrors}} 单元格中的错误",
|
||||
"Errors in {{numErrors}} of {{numCells}} cells": "{{numCells}} 个单元格中的 {{numErrors}} 个错误",
|
||||
"editingFormula is required": "需要编辑公式"
|
||||
},
|
||||
"DocTour": {
|
||||
"Cannot construct a document tour from the data in this document. Ensure there is a table named GristDocTour with columns Title, Body, Placement, and Location.": "无法从该文档中的数据构建文档浏览。 确保有一个名为 GristDocTour 的表,其中包含 Title、Body、Placement 和 Location 列。",
|
||||
"No valid document tour": "无有效证件游"
|
||||
},
|
||||
"DocumentSettings": {
|
||||
"Currency:": "货币:",
|
||||
"Document Settings": "文档设置",
|
||||
"Engine (experimental {{span}} change at own risk):": "引擎(实验性 {{span}} 更改风险自负):",
|
||||
"Local currency ({{currency}})": "当地货币({{currency}})",
|
||||
"Locale:": "语言环境:",
|
||||
"Save": "保存",
|
||||
"Save and Reload": "保存并重新加载",
|
||||
"This document's ID (for API use):": "本文档的 ID(供 API 使用):",
|
||||
"Time Zone:": "时区:",
|
||||
"API": "应用程序接口",
|
||||
"Document ID copied to clipboard": "文档 ID 已复制到剪贴板",
|
||||
"Ok": "好的"
|
||||
},
|
||||
"DocumentUsage": {
|
||||
"Attachments Size": "附件尺寸",
|
||||
"Contact the site owner to upgrade the plan to raise limits.": "联系站点所有者以升级计划以提高限制。",
|
||||
"Data Size": "数据大小",
|
||||
"For higher limits, ": "对于更高的限制, ",
|
||||
"Rows": "行数",
|
||||
"Usage": "使用量",
|
||||
"Usage statistics are only available to users with full access to the document data.": "使用情况统计信息仅供对文档数据具有完全访问权限的用户使用。",
|
||||
"start your 30-day free trial of the Pro plan.": "开始 Pro 计划的 30 天免费试用。"
|
||||
},
|
||||
"Drafts": {
|
||||
"Restore last edit": "恢复上次编辑",
|
||||
"Undo discard": "撤消丢弃"
|
||||
},
|
||||
"DuplicateTable": {
|
||||
"Copy all data in addition to the table structure.": "复制除表结构外的所有数据。",
|
||||
"Name for new table": "新表的名称",
|
||||
"Only the document default access rules will apply to the copy.": "只有文档默认访问规则将应用于副本。",
|
||||
"Instead of duplicating tables, it's usually better to segment data using linked views. {{link}}": "与其复制表,不如使用链接视图分割数据。{{link}}"
|
||||
},
|
||||
"ExampleInfo": {
|
||||
"Check out our related tutorial for how to model business data, use formulas, and manage complexity.": "查看我们的相关教程,了解如何建模业务数据、使用公式和管理复杂性。",
|
||||
"Check out our related tutorial to learn how to create summary tables and charts, and to link charts dynamically.": "查看我们的相关教程,了解如何创建汇总表和图表,以及动态链接图表。",
|
||||
"Investment Research": "投资研究",
|
||||
"Lightweight CRM": "轻量级客户关系管理",
|
||||
"Tutorial: Analyze & Visualize": "教程:分析和可视化",
|
||||
"Tutorial: Create a CRM": "教程:创建 CRM",
|
||||
"Tutorial: Manage Business Data": "教程:管理业务数据",
|
||||
"Welcome to the Afterschool Program template": "欢迎使用课后计划模板",
|
||||
"Welcome to the Investment Research template": "欢迎使用投资研究模板",
|
||||
"Welcome to the Lightweight CRM template": "欢迎使用轻量级 CRM 模板",
|
||||
"Afterschool Program": "课后活动",
|
||||
"Check out our related tutorial for how to link data, and create high-productivity layouts.": "查看我们的相关教程,了解如何链接数据和创建高效布局。"
|
||||
},
|
||||
"FieldConfig": {
|
||||
"COLUMN LABEL AND ID": "列标签和 ID",
|
||||
"Clear and make into formula": "澄清并制成配方",
|
||||
"Clear and reset": "清除并重置",
|
||||
"Column options are limited in summary tables.": "列选项在汇总表中受到限制。",
|
||||
"Convert column to data": "将列转换为数据",
|
||||
"Convert to trigger formula": "转换为触发公式",
|
||||
"Data Columns_one": "数据栏",
|
||||
"Data Columns_other": "数据列",
|
||||
"Empty Columns_one": "空列",
|
||||
"Empty Columns_other": "空列",
|
||||
"Enter formula": "输入公式",
|
||||
"Formula Columns_one": "公式栏",
|
||||
"Formula Columns_other": "公式列",
|
||||
"Make into data column": "制作成数据栏",
|
||||
"Mixed Behavior": "混合行为",
|
||||
"Set formula": "设定公式",
|
||||
"Set trigger formula": "设置触发公式",
|
||||
"TRIGGER FORMULA": "触发公式",
|
||||
"DESCRIPTION": "描述",
|
||||
"COLUMN BEHAVIOR": "列行为"
|
||||
},
|
||||
"FieldMenus": {
|
||||
"Revert to common settings": "恢复到常用设置",
|
||||
"Save as common settings": "另存为常用设置",
|
||||
"Using common settings": "使用通用设置",
|
||||
"Use separate settings": "使用单独的设置",
|
||||
"Using separate settings": "使用单独的设置"
|
||||
},
|
||||
"FilterConfig": {
|
||||
"Add Column": "添加列"
|
||||
},
|
||||
"FilterBar": {
|
||||
"SearchColumns": "搜索列",
|
||||
"Search Columns": "搜索列"
|
||||
},
|
||||
"GridOptions": {
|
||||
"Grid Options": "网格选项",
|
||||
"Horizontal Gridlines": "水平网格线",
|
||||
"Vertical Gridlines": "垂直网格线",
|
||||
"Zebra Stripes": "斑马条纹"
|
||||
},
|
||||
"GridViewMenus": {
|
||||
"Add Column": "添加列",
|
||||
"Add to sort": "添加到排序",
|
||||
"Clear values": "清除值",
|
||||
"Column Options": "列选项",
|
||||
"Convert formula to data": "将公式转换为数据",
|
||||
"Delete {{count}} columns_one": "删除列",
|
||||
"Delete {{count}} columns_other": "删除 {{count}} 列",
|
||||
"Filter Data": "过滤数据",
|
||||
"Freeze {{count}} columns_one": "冻结此列",
|
||||
"Freeze {{count}} columns_other": "冻结 {{count}} 列",
|
||||
"Freeze {{count}} more columns_one": "再冻结一列",
|
||||
"Freeze {{count}} more columns_other": "冻结 {{count}} 列",
|
||||
"Hide {{count}} columns_one": "隐藏栏",
|
||||
"Hide {{count}} columns_other": "隐藏 {{count}} 列",
|
||||
"Insert column to the {{to}}": "将列插入到 {{to}}",
|
||||
"More sort options ...": "更多排序选项…",
|
||||
"Rename column": "重命名列",
|
||||
"Reset {{count}} columns_one": "重置列",
|
||||
"Reset {{count}} columns_other": "重置 {{count}} 列",
|
||||
"Reset {{count}} entire columns_one": "重置整列",
|
||||
"Reset {{count}} entire columns_other": "重置 {{count}} 整列",
|
||||
"Sort": "排序",
|
||||
"Sorted (#{{count}})_one": "已排序(#{{count}})",
|
||||
"Sorted (#{{count}})_other": "已排序(#{{count}})",
|
||||
"Unfreeze {{count}} columns_one": "解冻此列",
|
||||
"Unfreeze all columns": "解冻所有列",
|
||||
"Unfreeze {{count}} columns_other": "解冻 {{count}} 列",
|
||||
"Show column {{- label}}": "显示列 {{- label}}"
|
||||
},
|
||||
"GristDoc": {
|
||||
"Added new linked section to view {{viewName}}": "添加了新的链接部分以查看 {{viewName}}",
|
||||
"Import from file": "从文件导入",
|
||||
"Saved linked section {{title}} in view {{name}}": "已将链接部分 {{title}} 保存在视图 {{name}} 中"
|
||||
},
|
||||
"Importer": {
|
||||
"Merge rows that match these fields:": "合并与这些字段匹配的行:",
|
||||
"Select fields to match on": "选择要匹配的字段",
|
||||
"Update existing records": "更新现有记录"
|
||||
},
|
||||
"LeftPanelCommon": {
|
||||
"Help Center": "帮助中心"
|
||||
},
|
||||
"OnBoardingPopups": {
|
||||
"Finish": "结束",
|
||||
"Next": "下一个"
|
||||
},
|
||||
"PageWidgetPicker": {
|
||||
"Add to Page": "添加到页面",
|
||||
"Building {{- label}} widget": "构建 {{- label}} 小部件",
|
||||
"Group by": "通过...分组",
|
||||
"Select Data": "选择数据",
|
||||
"Select Widget": "选择小部件"
|
||||
},
|
||||
"Pages": {
|
||||
"Delete": "删除",
|
||||
"Delete data and this page.": "删除数据和本页。",
|
||||
"The following tables will no longer be visible_one": "下表将不再可见",
|
||||
"The following tables will no longer be visible_other": "下表将不再可见"
|
||||
},
|
||||
"PermissionsWidget": {
|
||||
"Allow All": "允许全部",
|
||||
"Deny All": "全部拒绝",
|
||||
"Read Only": "只读"
|
||||
},
|
||||
"PluginScreen": {
|
||||
"Import failed: ": "导入失败: "
|
||||
},
|
||||
"RecordLayoutEditor": {
|
||||
"Add Field": "添加字段",
|
||||
"Create New Field": "创建新字段",
|
||||
"Save Layout": "保存布局",
|
||||
"Cancel": "取消",
|
||||
"Show field {{- label}}": "显示字段 {{- label}}"
|
||||
},
|
||||
"RefSelect": {
|
||||
"Add Column": "添加列",
|
||||
"No columns to add": "没有要添加的列"
|
||||
},
|
||||
"SelectionSummary": {
|
||||
"Copied to clipboard": "复制到剪贴板"
|
||||
},
|
||||
"ShareMenu": {
|
||||
"Access Details": "访问详细信息",
|
||||
"Back to Current": "回到当前",
|
||||
"Compare to {{termToUse}}": "与{{termToUse}}比较",
|
||||
"Current Version": "当前版本",
|
||||
"Download": "下载",
|
||||
"Duplicate Document": "重复文件",
|
||||
"Edit without affecting the original": "在不影响原件的情况下编辑",
|
||||
"Export CSV": "导出 CSV",
|
||||
"Export XLSX": "导出 XLSX",
|
||||
"Manage Users": "管理用户",
|
||||
"Original": "原来的",
|
||||
"Replace {{termToUse}}...": "替换 {{termToUse}}…",
|
||||
"Return to {{termToUse}}": "返回{{termToUse}}",
|
||||
"Save Copy": "保存副本",
|
||||
"Save Document": "保存文档",
|
||||
"Send to Google Drive": "发送到谷歌云端硬盘",
|
||||
"Show in folder": "展现在文件夹中",
|
||||
"Unsaved": "未保存",
|
||||
"Work on a Copy": "在副本上工作"
|
||||
},
|
||||
"SiteSwitcher": {
|
||||
"Create new team site": "创建新的团队网站",
|
||||
"Switch Sites": "切换站点"
|
||||
},
|
||||
"SortConfig": {
|
||||
"Add Column": "添加列",
|
||||
"Empty values last": "最后为空值",
|
||||
"Natural sort": "自然排序",
|
||||
"Update Data": "更新数据",
|
||||
"Use choice position": "使用选择位置",
|
||||
"Search Columns": "搜索列"
|
||||
},
|
||||
"ThemeConfig": {
|
||||
"Appearance ": "外观 ",
|
||||
"Switch appearance automatically to match system": "自动切换外观以匹配系统"
|
||||
},
|
||||
"Tools": {
|
||||
"Access Rules": "访问规则",
|
||||
"Code View": "代码视图",
|
||||
"Delete": "删除",
|
||||
"Delete document tour?": "删除文档导览?",
|
||||
"Document History": "文件历史",
|
||||
"How-to Tutorial": "操作指南",
|
||||
"Raw Data": "原始数据",
|
||||
"Return to viewing as yourself": "返回查看自己",
|
||||
"TOOLS": "工具",
|
||||
"Tour of this Document": "本文档导览",
|
||||
"Validate Data": "验证数据",
|
||||
"Settings": "设置"
|
||||
},
|
||||
"TopBar": {
|
||||
"Manage Team": "管理团队"
|
||||
},
|
||||
"TriggerFormulas": {
|
||||
"Any field": "任何领域",
|
||||
"Apply on changes to:": "应用更改:",
|
||||
"Apply on record changes": "应用记录更改",
|
||||
"Apply to new records": "申请新记录",
|
||||
"Cancel": "取消",
|
||||
"Close": "关闭",
|
||||
"Current field ": "当前字段 ",
|
||||
"OK": "好的"
|
||||
},
|
||||
"TypeTransformation": {
|
||||
"Apply": "申请",
|
||||
"Cancel": "取消",
|
||||
"Preview": "预览",
|
||||
"Revise": "修订",
|
||||
"Update formula (Shift+Enter)": "更新公式(Shift+Enter)"
|
||||
},
|
||||
"ViewAsBanner": {
|
||||
"UnknownUser": "未知用户"
|
||||
},
|
||||
"WidgetTitle": {
|
||||
"Cancel": "取消",
|
||||
"DATA TABLE NAME": "数据表名称",
|
||||
"Override widget title": "覆盖小部件标题",
|
||||
"Provide a table name": "提供表名",
|
||||
"Save": "保存",
|
||||
"WIDGET TITLE": "小部件标题"
|
||||
},
|
||||
"duplicatePage": {
|
||||
"Duplicate page {{pageName}}": "重复页面 {{pageName}}",
|
||||
"Note that this does not copy data, but creates another view of the same data.": "请注意,这不会复制数据,而是创建相同数据的另一个视图。"
|
||||
},
|
||||
"menus": {
|
||||
"* Workspaces are available on team plans. ": "* 工作区在团队计划中可用。 ",
|
||||
"Select fields": "选择字段",
|
||||
"Upgrade now": "现在升级"
|
||||
},
|
||||
"errorPages": {
|
||||
"Add account": "新增帐户",
|
||||
"Contact support": "联系支持",
|
||||
"Go to main page": "转到主页",
|
||||
"Sign in": "登入",
|
||||
"Sign in again": "重新登录",
|
||||
"Sign in to access this organization's documents.": "登录以访问该组织的文档。",
|
||||
"Something went wrong": "出了些问题",
|
||||
"The requested page could not be found.{{separator}}Please check the URL and try again.": "找不到请求的页面。{{separator}}请检查 URL 并重试。",
|
||||
"There was an error: {{message}}": "出现错误:{{message}}",
|
||||
"There was an unknown error.": "出现未知错误。",
|
||||
"You are now signed out.": "您现在已注销。",
|
||||
"You are signed in as {{email}}. You can sign in with a different account, or ask an administrator for access.": "您以 {{email}} 身份登录。 您可以使用其他帐户登录,或向管理员申请访问权限。",
|
||||
"You do not have access to this organization's documents.": "您无权访问该组织的文档。",
|
||||
"Signed out{{suffix}}": "退出{{suffix}}",
|
||||
"Page not found{{suffix}}": "找不到页面 {{suffix}}",
|
||||
"Access denied{{suffix}}": "访问被拒绝{{suffix}}",
|
||||
"Error{{suffix}}": "错误{{suffix}}"
|
||||
},
|
||||
"modals": {
|
||||
"Cancel": "取消",
|
||||
"Ok": "好的",
|
||||
"Save": "保存"
|
||||
},
|
||||
"pages": {
|
||||
"Duplicate Page": "重复页面",
|
||||
"Remove": "消除",
|
||||
"Rename": "改名",
|
||||
"You do not have edit access to this document": "您没有对此文档的编辑权限"
|
||||
},
|
||||
"search": {
|
||||
"Find Next ": "找下一个 ",
|
||||
"Find Previous ": "查找上一个 ",
|
||||
"No results": "没有结果",
|
||||
"Search in document": "在文档中搜索"
|
||||
},
|
||||
"sendToDrive": {
|
||||
"Sending file to Google Drive": "发送文件到谷歌云端硬盘"
|
||||
},
|
||||
"NTextBox": {
|
||||
"false": "错误的",
|
||||
"true": "真的"
|
||||
},
|
||||
"ACLUsers": {
|
||||
"Example Users": "示例用户",
|
||||
"Users from table": "表中的用户",
|
||||
"View As": "查看为"
|
||||
},
|
||||
"TypeTransform": {
|
||||
"Apply": "申请",
|
||||
"Cancel": "取消",
|
||||
"Preview": "预览",
|
||||
"Revise": "修订",
|
||||
"Update formula (Shift+Enter)": "更新公式(Shift+Enter)"
|
||||
},
|
||||
"ColumnInfo": {
|
||||
"COLUMN DESCRIPTION": "栏目说明",
|
||||
"COLUMN ID: ": "列号: ",
|
||||
"COLUMN LABEL": "列标签",
|
||||
"Cancel": "取消",
|
||||
"Save": "保存"
|
||||
},
|
||||
"CellStyle": {
|
||||
"CELL STYLE": "细胞样式",
|
||||
"Cell Style": "单元样式",
|
||||
"Default cell style": "默认单元格样式",
|
||||
"Mixed style": "混合风格",
|
||||
"Open row styles": "打开行样式"
|
||||
},
|
||||
"ChoiceTextBox": {
|
||||
"CHOICES": "选择"
|
||||
},
|
||||
"ColumnEditor": {
|
||||
"COLUMN DESCRIPTION": "栏目说明",
|
||||
"COLUMN LABEL": "列标签"
|
||||
},
|
||||
"EditorTooltip": {
|
||||
"Convert column to formula": "将列转换为公式"
|
||||
},
|
||||
"FieldEditor": {
|
||||
"It should be impossible to save a plain data value into a formula column": "不可能将纯数据值保存到公式列中",
|
||||
"Unable to finish saving edited cell": "无法完成保存编辑的单元格"
|
||||
},
|
||||
"HyperLinkEditor": {
|
||||
"[link label] url": "[链接标签] url"
|
||||
},
|
||||
"NumericTextBox": {
|
||||
"Currency": "货币",
|
||||
"Decimals": "小数点",
|
||||
"Default currency ({{defaultCurrency}})": "默认货币 ({{defaultCurrency}})",
|
||||
"Number Format": "数字格式"
|
||||
},
|
||||
"Reference": {
|
||||
"CELL FORMAT": "细胞格式",
|
||||
"Row ID": "行号",
|
||||
"SHOW COLUMN": "显示专栏"
|
||||
},
|
||||
"LanguageMenu": {
|
||||
"Language": "语言"
|
||||
},
|
||||
"GristTooltips": {
|
||||
"Apply conditional formatting to cells in this column when formula conditions are met.": "当满足公式条件时,将条件格式应用于此列中的单元格。",
|
||||
"Apply conditional formatting to rows based on formulas.": "根据公式将条件格式应用于行。",
|
||||
"Cells in a reference column always identify an {{entire}} record in that table, but you may select which column from that record to show.": "参考列中的单元格始终标识该表中的 {{entire}} 记录,但您可以选择显示该记录中的哪一列。",
|
||||
"Click on “Open row styles” to apply conditional formatting to rows.": "单击“打开行样式”以将条件格式应用于行。",
|
||||
"Click the Add New button to create new documents or workspaces, or import data.": "单击添加新按钮以创建新文档或工作区,或导入数据。",
|
||||
"Learn more.": "了解更多。",
|
||||
"Link your new widget to an existing widget on this page.": "将您的新小部件链接到此页面上的现有小部件。",
|
||||
"Linking Widgets": "链接小部件",
|
||||
"Nested Filtering": "嵌套过滤",
|
||||
"Only those rows will appear which match all of the filters.": "只有那些匹配所有过滤器的行才会出现。",
|
||||
"Pinned filters are displayed as buttons above the widget.": "固定过滤器显示为小部件上方的按钮。",
|
||||
"Pinning Filters": "固定过滤器",
|
||||
"Raw Data page": "原始数据页面",
|
||||
"Rearrange the fields in your card by dragging and resizing cells.": "通过拖动和调整单元格大小来重新排列卡片中的字段。",
|
||||
"Reference Columns": "参考列",
|
||||
"Select the table containing the data to show.": "选择包含要显示的数据的表。",
|
||||
"Select the table to link to.": "选择要链接到的表。",
|
||||
"Selecting Data": "选择数据",
|
||||
"The Raw Data page lists all data tables in your document, including summary tables and tables not included in page layouts.": "原始数据页面列出了文档中的所有数据表,包括汇总表和未包含在页面布局中的表。",
|
||||
"The total size of all data in this document, excluding attachments.": "本文档中所有数据的总大小,不包括附件。",
|
||||
"They allow for one record to point (or refer) to another.": "它们允许一条记录指向(或引用)另一条记录。",
|
||||
"This is the secret to Grist's dynamic and productive layouts.": "这就是 Grist 的动态和高效布局的秘诀。",
|
||||
"Try out changes in a copy, then decide whether to replace the original with your edits.": "尝试对副本进行更改,然后决定是否用您的编辑替换原始文件。",
|
||||
"Unpin to hide the the button while keeping the filter.": "取消固定以隐藏按钮,同时保留过滤器。",
|
||||
"Updates every 5 minutes.": "每 5 分钟更新一次。",
|
||||
"Use the \\u{1D6BA} icon to create summary (or pivot) tables, for totals or subtotals.": "使用 \\u{1D6BA} 图标创建总计或小计的汇总(或数据透视表)表。",
|
||||
"Useful for storing the timestamp or author of a new record, data cleaning, and more.": "用于存储新记录的时间戳或作者、数据清理等。",
|
||||
"You can filter by more than one column.": "您可以按多个列进行过滤。",
|
||||
"entire": "全部的",
|
||||
"relational": "相关的",
|
||||
"Access Rules": "访问规则",
|
||||
"Access rules give you the power to create nuanced rules to determine who can see or edit which parts of your document.": "访问规则使您能够创建细微的规则来确定谁可以查看或编辑文档的哪些部分。",
|
||||
"Add New": "添新",
|
||||
"Use the 𝚺 icon to create summary (or pivot) tables, for totals or subtotals.": "使用 𝚺 图标为总计或小计创建汇总(或数据透视表)表。",
|
||||
"Reference columns are the key to {{relational}} data in Grist.": "引用列是 Grist 中 {{relational}} 数据的关键。",
|
||||
"Clicking {{EyeHideIcon}} in each cell hides the field from this view without deleting it.": "单击每个单元格中的 {{EyeHideIcon}} 可隐藏此视图中的字段而不将其删除。",
|
||||
"Editing Card Layout": "编辑卡片布局",
|
||||
"Formulas that trigger in certain cases, and store the calculated value as data.": "在某些情况下触发的公式,并将计算值存储为数据。"
|
||||
}
|
||||
}
|
89
test/nbrowser/DescriptionColumn.ts
Normal file
89
test/nbrowser/DescriptionColumn.ts
Normal file
@ -0,0 +1,89 @@
|
||||
import { UserAPIImpl } from 'app/common/UserAPI';
|
||||
import { assert, driver } from 'mocha-webdriver';
|
||||
import * as gu from 'test/nbrowser/gristUtils';
|
||||
import { setupTestSuite } from 'test/nbrowser/testUtils';
|
||||
|
||||
async function addColumnDescription(api: UserAPIImpl, docId: string, columnName: string) {
|
||||
await api.applyUserActions(docId, [
|
||||
[ 'ModifyColumn', 'Table1', columnName, {
|
||||
description: 'This is the column description\nIt is in two lines'
|
||||
} ],
|
||||
]);
|
||||
}
|
||||
|
||||
function getDescriptionInput() {
|
||||
return driver.find('.test-right-panel .test-column-description');
|
||||
}
|
||||
|
||||
describe('DescriptionColumn', function() {
|
||||
this.timeout(20000);
|
||||
const cleanup = setupTestSuite();
|
||||
|
||||
it('should support basic edition', async () => {
|
||||
const mainSession = await gu.session().teamSite.login();
|
||||
const api = mainSession.createHomeApi();
|
||||
const doc = await mainSession.tempDoc(cleanup, "CardView.grist", { load: true });
|
||||
const docId = doc.id;
|
||||
|
||||
await addColumnDescription(api, docId, 'B');
|
||||
|
||||
// Column description editable in right panel
|
||||
await driver.find('.test-right-opener').click();
|
||||
|
||||
await gu.getCell({ rowNum: 1, col: 'B' }).click();
|
||||
await driver.find('.test-right-tab-field').click();
|
||||
assert.equal(await getDescriptionInput().value(), 'This is the column description\nIt is in two lines');
|
||||
|
||||
await gu.getCell({ rowNum: 1, col: 'A' }).click();
|
||||
assert.equal(await getDescriptionInput().value(), '');
|
||||
|
||||
// Remove the description
|
||||
await api.applyUserActions(docId, [
|
||||
[ 'ModifyColumn', 'Table1', 'B', {
|
||||
description: ''
|
||||
} ],
|
||||
]);
|
||||
|
||||
await gu.getCell({ rowNum: 1, col: 'B' }).click();
|
||||
assert.equal(await getDescriptionInput().value(), '');
|
||||
});
|
||||
|
||||
it('should show info tooltip only if there is a description', async () => {
|
||||
const mainSession = await gu.session().teamSite.login();
|
||||
const api = mainSession.createHomeApi();
|
||||
const doc = await mainSession.tempDoc(cleanup, "CardView.grist", { load: true });
|
||||
const docId = doc.id;
|
||||
|
||||
await addColumnDescription(api, docId, 'B');
|
||||
|
||||
await gu.changeWidget('Card');
|
||||
|
||||
const detailUndescribedColumnFirstRow = await gu.getDetailCell('A', 1);
|
||||
assert.isFalse(
|
||||
await detailUndescribedColumnFirstRow
|
||||
.findClosest(".g_record_detail_el")
|
||||
.find(".test-column-info-tooltip")
|
||||
.isPresent()
|
||||
);
|
||||
|
||||
const detailDescribedColumnFirstRow = await gu.getDetailCell('B', 1);
|
||||
const toggle = await detailDescribedColumnFirstRow
|
||||
.findClosest(".g_record_detail_el")
|
||||
.find(".test-column-info-tooltip");
|
||||
// The toggle to show the description is present if there is a description
|
||||
assert.isTrue(await toggle.isPresent());
|
||||
|
||||
// Open the tooltip
|
||||
await toggle.click();
|
||||
assert.isTrue(await driver.findWait('.test-column-info-tooltip-popup', 1000).isDisplayed());
|
||||
|
||||
// Check the content of the tooltip
|
||||
const descriptionTooltip = await driver
|
||||
.find('.test-column-info-tooltip-popup .test-column-info-tooltip-popup-body');
|
||||
assert.equal(await descriptionTooltip.getText(), 'This is the column description\nIt is in two lines');
|
||||
|
||||
// Close the tooltip
|
||||
await toggle.click();
|
||||
assert.lengthOf(await driver.findAll('.test-column-info-tooltip-popup'), 0);
|
||||
});
|
||||
});
|
@ -496,6 +496,7 @@ function testDocApi() {
|
||||
isFormula: false,
|
||||
formula: '',
|
||||
label: 'A',
|
||||
description: '',
|
||||
untieColIdFromLabel: false,
|
||||
summarySourceCol: 0,
|
||||
displayCol: 0,
|
||||
@ -516,6 +517,7 @@ function testDocApi() {
|
||||
isFormula: false,
|
||||
formula: '',
|
||||
label: 'B',
|
||||
description: '',
|
||||
untieColIdFromLabel: false,
|
||||
summarySourceCol: 0,
|
||||
displayCol: 0,
|
||||
@ -536,6 +538,7 @@ function testDocApi() {
|
||||
isFormula: false,
|
||||
formula: '',
|
||||
label: 'C',
|
||||
description: '',
|
||||
untieColIdFromLabel: false,
|
||||
summarySourceCol: 0,
|
||||
displayCol: 0,
|
||||
@ -556,6 +559,7 @@ function testDocApi() {
|
||||
isFormula: true,
|
||||
formula: '',
|
||||
label: 'D',
|
||||
description: '',
|
||||
untieColIdFromLabel: false,
|
||||
summarySourceCol: 0,
|
||||
displayCol: 0,
|
||||
@ -576,6 +580,7 @@ function testDocApi() {
|
||||
isFormula: true,
|
||||
formula: '$A.upper()',
|
||||
label: 'E',
|
||||
description: '',
|
||||
untieColIdFromLabel: false,
|
||||
summarySourceCol: 0,
|
||||
displayCol: 0,
|
||||
|
Loading…
Reference in New Issue
Block a user