diff --git a/app/server/lib/FlexServer.ts b/app/server/lib/FlexServer.ts index c2aa0562..081c82bc 100644 --- a/app/server/lib/FlexServer.ts +++ b/app/server/lib/FlexServer.ts @@ -2019,9 +2019,15 @@ export class FlexServer implements GristServer { const userRoot = path.resolve(process.env.GRIST_USER_ROOT || getAppPathTo(this.appRoot, '.grist')); this.info.push(['userRoot', userRoot]); // Some custom widgets may be included as an npm package called @gristlabs/grist-widget. + // The package doesn't actually contain node code, but should be in the same vicinity + // as other packages that do, so we can use require.resolve on one of them to find it. + // This seems a little overcomplicated, but works well when grist-core is bundled within + // a larger project like grist-electron. + // TODO: maybe add a little node code to @gristlabs/grist-widget so it can be resolved + // directly? + const gristLabsModules = path.dirname(path.dirname(require.resolve('@gristlabs/express-session'))); const bundledRoot = isAffirmative(process.env.GRIST_SKIP_BUNDLED_WIDGETS) ? undefined : path.join( - getAppPathTo(this.appRoot, 'node_modules'), - '@gristlabs', 'grist-widget', 'dist' + gristLabsModules, 'grist-widget', 'dist' ); this.info.push(['bundledRoot', bundledRoot]); const pluginManager = new PluginManager(this.appRoot, userRoot, bundledRoot); diff --git a/app/server/lib/WidgetRepository.ts b/app/server/lib/WidgetRepository.ts index f79a049f..d94ed92b 100644 --- a/app/server/lib/WidgetRepository.ts +++ b/app/server/lib/WidgetRepository.ts @@ -4,7 +4,7 @@ import * as fse from 'fs-extra'; import fetch from 'node-fetch'; import * as path from 'path'; import {ApiError} from 'app/common/ApiError'; -import {removeTrailingSlash} from 'app/common/gutil'; +import {isAffirmative, removeTrailingSlash} from 'app/common/gutil'; import {GristServer} from 'app/server/lib/GristServer'; import LRUCache from 'lru-cache'; import * as url from 'url'; @@ -96,7 +96,8 @@ export class CombinedWidgetRepository implements IWidgetRepository { * Repository that gets a list of widgets from a URL. */ export class UrlWidgetRepository implements IWidgetRepository { - constructor(private _staticUrl = STATIC_URL) {} + constructor(private _staticUrl = STATIC_URL, + private _required: boolean = true) {} public async getWidgets(): Promise { if (!this._staticUrl) { @@ -126,10 +127,16 @@ export class UrlWidgetRepository implements IWidgetRepository { fixUrls(widgets, this._staticUrl); return widgets; } catch (err) { - if (!(err instanceof ApiError)) { - throw new ApiError(String(err), 500); + if (this._required) { + if (!(err instanceof ApiError)) { + throw new ApiError(String(err), 500); + } + throw err; + } else { + log.error("WidgetRepository: Error fetching widget list - " + + String(err)); + return []; } - throw err; } } } @@ -177,7 +184,9 @@ export class WidgetRepositoryImpl implements IWidgetRepository { const repos: IWidgetRepository[] = []; this._staticUrl = overrideUrl ?? STATIC_URL; if (this._staticUrl) { - this._urlWidgets = new UrlWidgetRepository(this._staticUrl); + const optional = isAffirmative(process.env.GRIST_WIDGET_LIST_URL_OPTIONAL); + this._urlWidgets = new UrlWidgetRepository(this._staticUrl, + !optional); repos.push(this._urlWidgets); } if (this._diskWidgets) { repos.push(this._diskWidgets); } diff --git a/package.json b/package.json index fb369e8e..f2a5f459 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grist-core", - "version": "1.1.8", + "version": "1.1.9", "license": "Apache-2.0", "description": "Grist is the evolution of spreadsheets", "homepage": "https://github.com/gristlabs/grist-core", diff --git a/static/locales/de.client.json b/static/locales/de.client.json index a7546d2d..61a668d9 100644 --- a/static/locales/de.client.json +++ b/static/locales/de.client.json @@ -456,7 +456,9 @@ "Duplicate in {{- label}}": "Duplikate in {{- label}}", "Search columns": "Spalten suchen", "Adding UUID column": "Hinzufügen der UUID-Spalte", - "Adding duplicates column": "Hinzufügen einer Duplikatspalte" + "Adding duplicates column": "Hinzufügen einer Duplikatspalte", + "Add formula column": "Formelspalte hinzufügen", + "Add column with type": "Spalte mit Typ hinzufügen" }, "GristDoc": { "Added new linked section to view {{viewName}}": "Neuer verlinkter Abschnitt zur Ansicht hinzugefügt {{viewName}}", @@ -1127,7 +1129,8 @@ "A UUID is a randomly-generated string that is useful for unique identifiers and link keys.": "Eine UUID ist ein zufällig generierter String, der für eindeutige Kennungen und Linkschlüssel nützlich ist.", "Lookups return data from related tables.": "Lookups geben Daten aus Bezugstabellen zurück.", "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Sie können aus Widgets wählen, die Ihnen im Dropdown zur Verfügung stehen, oder Sie selbst einbetten, indem Sie seine volle URL angeben.", - "Use reference columns to relate data in different tables.": "Verwenden Sie Referenzspalten, um Daten in verschiedenen Tabellen zu beziehen." + "Use reference columns to relate data in different tables.": "Verwenden Sie Referenzspalten, um Daten in verschiedenen Tabellen zu beziehen.", + "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Die Formeln unterstützen viele Excel-Funktionen, die vollständige Python-Syntax und enthalten einen hilfreichen KI-Assistenten." }, "DescriptionConfig": { "DESCRIPTION": "BESCHREIBUNG" diff --git a/static/locales/es.client.json b/static/locales/es.client.json index 221fa367..b93a4360 100644 --- a/static/locales/es.client.json +++ b/static/locales/es.client.json @@ -378,7 +378,9 @@ "Duplicate in {{- label}}": "Duplicado en {{- label}}", "Search columns": "Buscar columnas", "Adding UUID column": "Añadiendo una columna UUID", - "Adding duplicates column": "Añadiendo la columna de duplicados" + "Adding duplicates column": "Añadiendo la columna de duplicados", + "Add formula column": "Añadir una columna de fórmulas", + "Add column with type": "Añadir columna con tipo" }, "HomeIntro": { ", or find an expert via our ": ", o encontrar un experto a través de nuestro", @@ -1117,7 +1119,8 @@ "A UUID is a randomly-generated string that is useful for unique identifiers and link keys.": "Un UUID es una cadena generada aleatoriamente que resulta útil para identificadores únicos y claves de los enlaces.", "Lookups return data from related tables.": "Las búsquedas devuelven datos de tablas relacionadas.", "Use reference columns to relate data in different tables.": "Utilizar las columnas de referencia para relacionar los datos de distintas tablas.", - "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Puedes elegir entre los widgets disponibles en el menú desplegable, o incrustar el suyo propio proporcionando su dirección URL completa." + "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Puedes elegir entre los widgets disponibles en el menú desplegable, o incrustar el suyo propio proporcionando su dirección URL completa.", + "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Las fórmulas admiten muchas funciones de Excel, sintaxis completa de Python e incluyen un útil asistente de inteligencia artificial." }, "DescriptionConfig": { "DESCRIPTION": "DESCRIPCIÓN" diff --git a/static/locales/it.client.json b/static/locales/it.client.json index d2c30830..e9419ca5 100644 --- a/static/locales/it.client.json +++ b/static/locales/it.client.json @@ -154,7 +154,8 @@ "Duplicate rows_other": "Duplica righe", "Insert row": "Inserisci riga", "Insert row above": "Inserisci riga sopra", - "Insert row below": "Inserisci riga sotto" + "Insert row below": "Inserisci riga sotto", + "View as card": "Vedi come scheda" }, "SortFilterConfig": { "Save": "Salva", @@ -573,7 +574,13 @@ "Raw Data Tables": "Tabelle dati primarie", "Table ID copied to clipboard": "ID tabella copiato", "You do not have edit access to this document": "Non hai accesso in scrittura a questo documento", - "Delete {{formattedTableName}} data, and remove it from all pages?": "Cancellare i dati di {{formattedTableName}} e rimuoverla da tutte le pagine?" + "Delete {{formattedTableName}} data, and remove it from all pages?": "Cancellare i dati di {{formattedTableName}} e rimuoverla da tutte le pagine?", + "Edit Record Card": "Modifica scheda dei dati", + "Rename Table": "Rinomina tabella", + "{{action}} Record Card": "{{action}} Scheda dei dati", + "Record Card": "Scheda dei dati", + "Remove Table": "Rimuovi tabella", + "Record Card Disabled": "Scheda dei dati disabilitata" }, "DocHistory": { "Compare to Previous": "Confronta con il precedente", @@ -783,7 +790,9 @@ "Timestamp": "Data e ora", "no reference column": "nessuna colonna referenziata", "Adding UUID column": "Aggiungere colonna UUID", - "Adding duplicates column": "Aggiungere colonna duplicati" + "Adding duplicates column": "Aggiungere colonna duplicati", + "Add formula column": "Aggiungi colonna con formula", + "Add column with type": "Aggiungi colonna con tipo" }, "GristDoc": { "Import from file": "Importa da file", @@ -1055,7 +1064,9 @@ "Calendar": "Calendario", "Lookups return data from related tables.": "Un lookup restituisce dati dalle tabelle collegate.", "Can't find the right columns? Click 'Change Widget' to select the table with events data.": "Non trovi la colonna giusta? Fai clic su \"Cambia widget\" per selezionare la tabella con i dati degli eventi.", - "Use reference columns to relate data in different tables.": "Usa colonne di riferimenti per collegare dati da altre tabelle." + "Use reference columns to relate data in different tables.": "Usa colonne di riferimenti per collegare dati da altre tabelle.", + "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Le formule supportano molte funzioni di Excel, la sintassi completa di Python, e includono un utile assistente AI.", + "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Puoi scegliere tra i widget disponibili nella lista, o incorporare il tuo fornendo la sua URL completa." }, "DescriptionConfig": { "DESCRIPTION": "DESCRIZIONE" @@ -1230,5 +1241,13 @@ "FloatingPopup": { "Maximize": "Espandi", "Minimize": "Riduci" + }, + "CardContextMenu": { + "Insert card above": "Inserisci scheda sopra", + "Duplicate card": "Duplica scheda", + "Insert card below": "Inserisci scheda sotto", + "Delete card": "Elimina scheda", + "Copy anchor link": "Copia il link", + "Insert card": "Inserisci scheda" } } diff --git a/static/locales/pt_BR.client.json b/static/locales/pt_BR.client.json index 735e209c..dba2b3a8 100644 --- a/static/locales/pt_BR.client.json +++ b/static/locales/pt_BR.client.json @@ -456,7 +456,9 @@ "Duplicate in {{- label}}": "Duplicar em {{- label}}", "Search columns": "Procurar colunas", "Adding UUID column": "Adicionando coluna UUID", - "Adding duplicates column": "Adicionar coluna duplicatas" + "Adding duplicates column": "Adicionar coluna duplicatas", + "Add formula column": "Añadir una columna de fórmulas", + "Add column with type": "Adicionar coluna com tipo" }, "GristDoc": { "Added new linked section to view {{viewName}}": "Adicionada nova seção vinculada para visualizar {{viewName}}}", @@ -1127,7 +1129,8 @@ "A UUID is a randomly-generated string that is useful for unique identifiers and link keys.": "Um UUID é uma cadeia de caracteres gerada aleatoriamente que é útil para identificadores exclusivos e chaves de link.", "Lookups return data from related tables.": "As pesquisas retornam dados de tabelas relacionadas.", "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Você pode escolher entre os widgets disponíveis no menu suspenso ou incorporar o seu próprio widget fornecendo o URL completo.", - "Use reference columns to relate data in different tables.": "Use colunas de referência para relacionar dados em diferentes tabelas." + "Use reference columns to relate data in different tables.": "Use colunas de referência para relacionar dados em diferentes tabelas.", + "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "As fórmulas suportam muitas funções do Excel, sintaxe Python completa e incluem um assistente de IA útil." }, "DescriptionConfig": { "DESCRIPTION": "DESCRIÇÃO" diff --git a/static/locales/sl.client.json b/static/locales/sl.client.json index 0d2dab04..4982d5aa 100644 --- a/static/locales/sl.client.json +++ b/static/locales/sl.client.json @@ -1,7 +1,7 @@ { "AccessRules": { "Delete Table Rules": "Brisanje pravil tabele", - "Allow editors to edit structure (e.g. modify and delete tables, columns, layouts), and to write formulas, which give access to all data regardless of read restrictions.": "Urednikom omogočite urejanje strukture (npr. spreminjanje in brisanje tabel, stolpcev, postavitev) in pisanje formul, ki omogočajo dostop do vseh podatkov ne glede na omejitve branja.", + "Allow editors to edit structure (e.g. modify and delete tables, columns, layouts), and to write formulas, which give access to all data regardless of read restrictions.": "Urednikom omogoči urejanje strukture (npr. spreminjanje in brisanje tabel, stolpcev, postavitev) in pisanje formul, ki omogočajo dostop do vseh podatkov ne glede na omejitve branja.", "Default Rules": "Privzeta pravila", "Invalid": "Neveljavno", "Lookup Column": "Stolpec za iskanje", @@ -30,7 +30,7 @@ "Add Default Rule": "Dodaj privzeto pravilo", "Add Table Rules": "Dodaj pravila za tabelo", "Add User Attributes": "Dodaj atribute za uporabnika", - "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.": "Vsakomur omogočite kopiranje celotnega dokumenta ali pa si ga oglejte v celoti v načinu fiddle.\nUporabno za primere in predloge, ne pa za občutljive podatke.", + "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.": "Vsakomur omogoči kopiranje celotnega dokumenta ali pa ogled v fiddle načinu.\nUporabno za primere in predloge, ne pa za občutljive podatke.", "Allow everyone to view Access Rules.": "Omogoči vsakomur ogled pravil za dostop.", "Attribute name": "Ime atributa", "Attribute to Look Up": "Atribut za iskanje", @@ -69,7 +69,7 @@ "Manage Team": "Upravljanje ekipe", "Pricing": "Oblikovanje cen", "Profile Settings": "Nastavitve profila", - "Sign Out": "Odjavite se", + "Sign Out": "Odjavi se", "Sign in": "Prijavi se", "Switch Accounts": "Preklop računov", "Toggle Mobile Mode": "Preklapljanje mobilnega načina", @@ -298,7 +298,7 @@ "DataTables": { "Delete {{formattedTableName}} data, and remove it from all pages?": "Izbriši podatke {{formattedTableName}} in jih odstrani z vseh strani?", "Click to copy": "Kliknite za kopiranje", - "Duplicate Table": "Podvojena tabela", + "Duplicate Table": "Podvoji tabelo", "Table ID copied to clipboard": "ID tabele kopiran v odložišče", "You do not have edit access to this document": "Nimate dostopa za urejanje tega dokumenta", "Raw Data Tables": "Neobdelana tabela", @@ -310,16 +310,16 @@ "Record Card Disabled": "Evidenčna kartica onemogočena" }, "ViewLayoutMenu": { - "Delete record": "Brisanje zapisa", + "Delete record": "Briši zapis", "Delete widget": "Izbriši gradnik", "Advanced Sort & Filter": "Napredno razvrščanje in filtriranje", "Data selection": "Izbira podatkov", "Download as XLSX": "Prenesi kot XLSX", "Download as CSV": "Prenesi kot CSV", "Widget options": "Možnosti gradnika", - "Print widget": "Gradnik za tiskanje", + "Print widget": "Natisni", "Open configuration": "Odpri konfiguracijo", - "Edit Card Layout": "Urejanje postavitve kartice", + "Edit Card Layout": "Uredi postaviev kartice", "Add to page": "Dodaj na stran", "Show raw data": "Prikaži neobdelane podatke", "Copy anchor link": "Kopiraj sidrno povezavo", @@ -654,7 +654,7 @@ "Click the Add New button to create new documents or workspaces, or import data.": "Klikni gumb dodaj novega, če želiš ustvariti nove dokumente, delovne prostore ali uvoziti podatke,", "Nested Filtering": "Vgnezdeno filtriranje", "Only those rows will appear which match all of the filters.": "Prikazane bodo samo tiste vrstice, ki ustrezajo vsem filtrom.", - "Editing Card Layout": "Urejanje postavitve kartice", + "Editing Card Layout": "Uredi postavitev kartice", "Raw Data page": "Stran z neobdelanimi podatki", "Selecting Data": "Izbira podatkov", "Learn more.": "Preberite več.", @@ -715,7 +715,7 @@ "Your role for this {{resourceType}}": "Vaša vloga pri tem {{resourceType}}", "Once you have removed your own access, you will not be able to get it back without assistance from someone else with sufficient access to the {{resourceType}}.": "Ko odstranite svoj dostop, ga ne boste mogli vrniti brez pomoči druge osebe z zadostnim dostopom do spletnega mesta {{resourceType}}.", "Close": "Zapri", - "Allow anyone with the link to open.": "Omogočite odprtje vsakomur, ki ima povezavo.", + "Allow anyone with the link to open.": "Omogoči odprtje vsakemu, ki ima povezavo.", "Invite people to {{resourceType}}": "Povabite ljudi k {{resourceType}}", "Public access inherited from {{parent}}. To remove, set 'Inherit access' option to 'None'.": "Uporabnik podeduje dovoljenja od {{parent}}. Če jih želiš odstraniti, nastavi možnost \"Podeduje dostop\" na \"Ne\".", "Remove my access": "Odstranitev mojega dostopa", @@ -787,7 +787,7 @@ "Advanced settings": "Napredne nastavitve", "Make On-Demand": "Naredite na zahtevo", "Big tables may be marked as \"on-demand\" to avoid loading them into the data engine.": "Velike tabele so lahko označene kot \"na zahtevo\", da se izognete njihovemu nalaganju v podatkovni pogon.", - "Edit Card Layout": "Urejanje postavitve kartice" + "Edit Card Layout": "Uredi postavitev kartice" }, "SupportGristNudge": { "Support Grist": "Podpri Grist", @@ -1001,7 +1001,7 @@ "Cannot drop items into Hidden Fields": "Ne morete spustiti predmetov v skrita polja", "Hidden Fields cannot be reordered": "Skritih polj ni mogoče preurediti", "Visible {{label}}": "Vidno {{label}}", - "Select All": "Izberite vse", + "Select All": "Izberi vse", "Hide {{label}}": "Skrij {{label}}", "Clear": "Izbriši", "Show {{label}}": "Pokaži {{label}}", diff --git a/static/locales/zh_Hans.client.json b/static/locales/zh_Hans.client.json index 0b55e992..d9307696 100644 --- a/static/locales/zh_Hans.client.json +++ b/static/locales/zh_Hans.client.json @@ -100,7 +100,9 @@ "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}} 列未显示" + "{{wrongTypeCount}} non-{{columnType}} columns are not shown_other": "{{wrongTypeCount}} 非 {{columnType}} 列未显示", + "No {{columnType}} columns in table.": "表格中没有{{columnType}} 列。", + "Clear selection": "清除选择" }, "ChartView": { "Create separate series for each value of the selected column.": "为所选列的每个值创建单独的系列。", @@ -116,7 +118,13 @@ "Duplicate Table": "复制表", "Raw Data Tables": "原始数据表", "Table ID copied to clipboard": "表 ID 已复制到剪贴板", - "You do not have edit access to this document": "您没有对此文档的编辑权限" + "You do not have edit access to this document": "您没有对此文档的编辑权限", + "Edit Record Card": "编辑记录卡片", + "Rename Table": "重新命名表格", + "{{action}} Record Card": "{{action}} 记录卡片", + "Record Card": "记录卡片", + "Remove Table": "移除表格", + "Record Card Disabled": "记录卡片禁用" }, "CellContextMenu": { "Duplicate rows_one": "重复行", @@ -152,7 +160,8 @@ "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}} 中删除" + "This row was subsequently removed in action {{action.actionNum}}": "该行将在操作 {{action.actionNum}} 中删除", + "All tables": "所有表格" }, "ApiKey": { "This API key can be used to access this account anonymously via the API.": "该API密钥可用于通过API匿名访问该账户。", @@ -325,7 +334,10 @@ "You have read-only access to this site. Currently there are no documents.": "您对该站点具有只读访问权限。 目前没有文件。", "{{signUp}} to save your work. ": "{{signUp}} 保存您的工作。 ", "Welcome to {{- orgName}}": "欢迎来到 {{- orgName}}", - "Welcome to Grist, {{- name}}!": "欢迎来到 Grist,{{- name}}!" + "Welcome to Grist, {{- name}}!": "欢迎来到 Grist,{{- name}}!", + "Visit our {{link}} to learn more about Grist.": "访问我们的{{link}} ,了解有关 Grist 的更多信息。", + "Sign in": "登录", + "To use Grist, please either sign up or sign in.": "要使用 Grist,请注册或登录。" }, "HomeLeftPane": { "Delete": "删除", @@ -425,12 +437,13 @@ }, "RowContextMenu": { "Insert row below": "在下方插入行", - "Copy anchor link": "复制锚链接", + "Copy anchor link": "复制锚点链接", "Delete": "删除", "Duplicate rows_one": "重复行", "Duplicate rows_other": "重复行", "Insert row": "插入行", - "Insert row above": "在上方插入行" + "Insert row above": "在上方插入行", + "View as card": "以卡片形式查看" }, "UserManagerModel": { "In Full": "在全", @@ -463,7 +476,7 @@ "Open configuration": "打开配置", "Print widget": "打印小部件", "Advanced Sort & Filter": "高级排序和过滤", - "Copy anchor link": "复制锚链接", + "Copy anchor link": "复制锚点链接", "Data selection": "数据选择", "Delete widget": "删除小部件", "Download as CSV": "下载为 CSV", @@ -555,7 +568,8 @@ "DATA FROM TABLE": "表中数据", "Mixed format": "混合格式", "Mixed types": "混合类型", - "Use separate field settings for {{colId}}": "为 {{colId}} 使用单独的字段设置" + "Use separate field settings for {{colId}}": "为 {{colId}} 使用单独的字段设置", + "Changing column type": "更改列类型" }, "FormulaEditor": { "Column or field is required": "列或字段是必需的", @@ -694,7 +708,29 @@ "Unfreeze {{count}} columns_other": "解冻 {{count}} 列", "Show column {{- label}}": "显示列 {{- label}}", "Insert column to the left": "在左侧插入列", - "Insert column to the right": "在右侧插入列" + "Insert column to the right": "在右侧插入列", + "Detect Duplicates in...": "在……中检测重复", + "UUID": "UUID", + "Shortcuts": "捷径", + "Show hidden columns": "显示隐藏列", + "Created At": "创建于", + "Authorship": "作者", + "Add formula column": "添加公式列", + "Last Updated By": "最后更新者", + "Hidden Columns": "隐藏栏", + "Lookups": "查询", + "No reference columns.": "无引用列。", + "Apply on record changes": "应用记录更改", + "Duplicate in {{- label}}": "在{{- label}}中的重复", + "Created By": "创建者", + "Last Updated At": "最后更新时间", + "Add column with type": "添加特定类型的列", + "Apply to new records": "应用到新记录", + "Search columns": "搜索列", + "Timestamp": "时间戳", + "no reference column": "无引用列", + "Adding UUID column": "添加 UUID 列", + "Adding duplicates column": "添加重复列" }, "GristDoc": { "Added new linked section to view {{viewName}}": "添加了新的链接部分以查看 {{viewName}}", @@ -824,14 +860,14 @@ "Any field": "任何领域", "Apply on changes to:": "应用更改:", "Apply on record changes": "应用记录更改", - "Apply to new records": "申请新记录", + "Apply to new records": "应用到新记录", "Cancel": "取消", "Close": "关闭", "Current field ": "当前字段 ", "OK": "好的" }, "TypeTransformation": { - "Apply": "申请", + "Apply": "应用", "Cancel": "取消", "Preview": "预览", "Revise": "修订", @@ -868,7 +904,8 @@ "Any": "任何", "Numeric": "数值", "Text": "文本", - "Integer": "整数" + "Integer": "整数", + "Search columns": "搜索列" }, "errorPages": { "Add account": "新增帐户", @@ -887,7 +924,10 @@ "Signed out{{suffix}}": "退出{{suffix}}", "Page not found{{suffix}}": "找不到页面 {{suffix}}", "Access denied{{suffix}}": "访问被拒绝{{suffix}}", - "Error{{suffix}}": "错误{{suffix}}" + "Error{{suffix}}": "错误{{suffix}}", + "Account deleted{{suffix}}": "账户已删除{{suffix}}", + "Your account has been deleted.": "您的账户已被删除。", + "Sign up": "注册" }, "modals": { "Cancel": "取消", @@ -920,7 +960,7 @@ "View As": "查看为" }, "TypeTransform": { - "Apply": "申请", + "Apply": "应用", "Cancel": "取消", "Preview": "预览", "Revise": "修订", @@ -1013,10 +1053,20 @@ "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.": "在某些情况下触发的公式,并将计算值存储为数据。", - "Anchor Links": "锚链接", + "Anchor Links": "锚点链接", "To make an anchor link that takes the user to a specific cell, click on a row and press {{shortcut}}.": "要创建将用户带到特定单元格的锚点链接,请单击行并按 {{shortcut}} 。", "You can choose one of our pre-made widgets or embed your own by providing its full URL.": "您可以选择我们的一个预制小部件或通过提供其完整的URL嵌入您自己的。", - "Custom Widgets": "自定义小部件" + "Custom Widgets": "自定义小部件", + "A UUID is a randomly-generated string that is useful for unique identifiers and link keys.": "UUID 是随机生成的字符串,可用于唯一标识符和链接密钥。", + "To configure your calendar, select columns for start": { + "end dates and event titles. Note each column's type.": "要配置日历,请为开始/结束日期和事件标题选择栏目。注意每一列的类型。" + }, + "Calendar": "日历", + "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "公式支持许多 Excel 函数和完整的 Python 语法,还包括一个有用的人工智能助手。", + "Lookups return data from related tables.": "查找会返回相关表中的数据。", + "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "您可以从下拉菜单中选择可用的小部件,也可以通过提供完整的 URL 嵌入自己的小部件。", + "Can't find the right columns? Click 'Change Widget' to select the table with events data.": "找不到正确的列?点击 \"更改小部件\",选择包含事件数据的表格。", + "Use reference columns to relate data in different tables.": "使用参考列来关联不同表格中的数据。" }, "DescriptionConfig": { "DESCRIPTION": "描述" @@ -1074,7 +1124,13 @@ "Grist's AI Assistance": "Grist 人工智能助手", "Sign up for a free Grist account to start using the Formula AI Assistant.": "注册一个免费的Grist帐户,开始使用Formula AI助手。", "Sign Up for Free": "免费注册", - "Formula AI Assistant is only available for logged in users.": "公式 AI 助手仅适用于登录用户。" + "Formula AI Assistant is only available for logged in users.": "公式 AI 助手仅适用于登录用户。", + "For higher limits, contact the site owner.": "如需更高限额,请联系网站所有者。", + "upgrade to the Pro Team plan": "升级到专业团队计划", + "You have used all available credits.": "您已使用所有可用积分。", + "upgrade your plan": "升级您的计划", + "You have {{numCredits}} remaining credits.": "您还有{{numCredits}} 剩余积分。", + "For higher limits, {{upgradeNudge}}.": "如需更高限额,{{upgradeNudge}} 。" }, "WebhookPage": { "Clear Queue": "清除队列", @@ -1185,5 +1241,13 @@ "FloatingPopup": { "Maximize": "最大化", "Minimize": "最小化" + }, + "CardContextMenu": { + "Insert card above": "在上方插入卡片", + "Duplicate card": "复制卡片", + "Insert card below": "在下方插入卡片", + "Delete card": "删除卡片", + "Copy anchor link": "复制锚点链接", + "Insert card": "插入卡片" } }