diff --git a/README.md b/README.md index 426df7d3..ed7b5f90 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ NebulaGraph Studio (Studio for short) is a web-based visualization tool for Nebu | 3.0.0 ~ 3.2.0 | v3.4.x | | 3.0.0 ~ 3.3.0 | v3.5.x | | 3.0.0 ~ 3.4.0 | v3.6.x | +| 3.0.0 ~ 3.5.0 | v3.7.x | ## Development Quick Start @@ -60,7 +61,7 @@ $ go build -o server ### 3. Start ``` -$ nohup ./server & +$ ./server & ``` ### 4. Stop Server @@ -69,9 +70,9 @@ Use when you want shutdown the web app kill -9 $(lsof -t -i :7001) ``` -## Documentation 3.4.0 -[中文](https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/) -[ENGLISH](https://docs.nebula-graph.io/3.4.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/) +## Documentation 3.7.0 +[中文](https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/) +[ENGLISH](https://docs.nebula-graph.io/3.5.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/) ## Contributing Contributions are warmly welcomed and greatly appreciated. Please see [Guide Docs](https://github.com/vesoft-inc/nebula-studio/blob/master/CONTRIBUTING.md) diff --git a/app/config/locale/en-US.ts b/app/config/locale/en-US.ts index 1cb00d0b..087b6f30 100644 --- a/app/config/locale/en-US.ts +++ b/app/config/locale/en-US.ts @@ -1,494 +1,494 @@ export default { - "common": { - "requestError": "Request Error", - "currentSpace": "Current Graph Space", - "seeTheHistory": "History", - "table": "Table", - "log": "Log", - "sorryNGQLCannotBeEmpty": "nGQL cannot be empty", - "disablesUseToSwitchSpace": "DO NOT switch between graph spaces with nGQL statements in the console.", - "NGQLHistoryList": "nGQL History", - "empty": "Clear", - "run": "Run", - "console": "Console", - "ok": "OK", - "success": "Success", - "fail": "Fail", - "cancel": "Cancel", - "confirm": "Confirm", - "import": "Import", - "ask": "Are you sure to proceed?", - "openInExplore": "Open In Explorer", - "schema": "Schema", - "create": "Create", - "name": "Name", - "operation": "Operations", - "delete": "Delete", - "optional": "Optional", - "exportNGQL": "View nGQL", - "relatedProperties": "Related Properties", - "type": "Type", - "edit": "Edit", - "deleteSuccess": "Deleted successfully", - "propertyName": "Property Name", - "dataType": "Data Type", - "allowNull": "Allow Null", - "defaults": "Defaults", - "addProperty": "Add Property", - "updateSuccess": "Updated Successfully", - "add": "Add", - "tag": "Tag", - "edge": "Edge Type", - "index": "Index", - "yes": "Yes", - "no": "No", - "graph": "Graph", - "color": "Color", - "total": "Total", - "namePlaceholder": "Please enter the {name} name", - "comment": "Comment", - "space": "Space", - "version": "Version", - "statistics": "Statistics", - "duplicate": "Copy", - "copy": "Copy", - "copySuccess": "Copied successfully", - "sketch": "Schema drafting", - "viewSchema": "View Schema", - "beta": "Beta", - "danglingEdge": "Dangling edge", - "columnName": "Column name", - "src": "Source", - "dst": "Destination", - "value": "Value", - "continue": "Continue", - "update": "Update", - "prev": "Previous", - "createTime": "Create Time", - "rerun": "Rerun" + 'common': { + 'requestError': 'Request Error', + 'currentSpace': 'Current Graph Space', + 'seeTheHistory': 'History', + 'table': 'Table', + 'log': 'Log', + 'sorryNGQLCannotBeEmpty': 'nGQL cannot be empty', + 'disablesUseToSwitchSpace': 'DO NOT switch between graph spaces with nGQL statements in the console.', + 'NGQLHistoryList': 'nGQL History', + 'empty': 'Clear', + 'run': 'Run', + 'console': 'Console', + 'ok': 'OK', + 'success': 'Success', + 'fail': 'Fail', + 'cancel': 'Cancel', + 'confirm': 'Confirm', + 'import': 'Import', + 'ask': 'Are you sure to proceed?', + 'openInExplore': 'Open In Explorer', + 'schema': 'Schema', + 'create': 'Create', + 'name': 'Name', + 'operation': 'Operations', + 'delete': 'Delete', + 'optional': 'Optional', + 'exportNGQL': 'View nGQL', + 'relatedProperties': 'Related Properties', + 'type': 'Type', + 'edit': 'Edit', + 'deleteSuccess': 'Deleted successfully', + 'propertyName': 'Property Name', + 'dataType': 'Data Type', + 'allowNull': 'Allow Null', + 'defaults': 'Defaults', + 'addProperty': 'Add Property', + 'updateSuccess': 'Updated Successfully', + 'add': 'Add', + 'tag': 'Tag', + 'edge': 'Edge Type', + 'index': 'Index', + 'yes': 'Yes', + 'no': 'No', + 'graph': 'Graph', + 'color': 'Color', + 'total': 'Total', + 'namePlaceholder': 'Please enter the {name} name', + 'comment': 'Comment', + 'space': 'Space', + 'version': 'Version', + 'statistics': 'Statistics', + 'duplicate': 'Copy', + 'copy': 'Copy', + 'copySuccess': 'Copied successfully', + 'sketch': 'Schema drafting', + 'viewSchema': 'View Schema', + 'beta': 'Beta', + 'danglingEdge': 'Dangling edge', + 'columnName': 'Column name', + 'src': 'Source', + 'dst': 'Destination', + 'value': 'Value', + 'continue': 'Continue', + 'update': 'Update', + 'prev': 'Previous', + 'createTime': 'Create Time', + 'rerun': 'Rerun' }, - "doc": { - "welcome": "Welcome to", - "functionIntro": "Functions introduction", - "schemaIntro": `You can use the Schema page to operate graph spaces in ${window.gConfig.databaseName}`, - "importIntro": `You can use the Import page to batch import vertex and edge data into ${window.gConfig.databaseName} for graph exploration and data analysis.`, - "consoleIntro": "When data is imported, you can use the Console page to query graph data.", - "learningDoc": "Learning Docs", - "getStarted": `Getting started with ${window.gConfig.databaseName} Studio`, - "getStartedTip": `What's ${window.gConfig.databaseName} Studio`, - "useGuide": `Documents of ${window.gConfig.databaseName} Studio`, - "useGuideTip": `Learn how to use ${window.gConfig.databaseName} Studio`, - "ngqlIntro": `${window.gConfig.databaseName} Query Language (nGQL)`, - "ngqlIntroTip": `nGQL is a declarative graph query language for ${window.gConfig.databaseName}. It allows expressive and efficient graph patterns. `, - "start": "Get Started", - "sketchIntro": "Schema drafting", - "basketballplayerIntro": "A typical schema composed of two vertex types (player and team) and two edge types (serve and follow), widely referenced by documentation.", - "snsIntro": "Social Network Graph demo, new friend recommendation, feed generation, etc.", - "movieIntro": "Movie recommendation with CBF, ItemCF and UserCF in Graph.", - "datalineageIntro": `Metadata governance on ${window.gConfig.databaseName}, data lineage query, data dependency analysis, etc.`, - "idMappingIntro": "ID Mapping, Identity Resolution for a user system in Graph", - "fifa2022Intro": "2022 Football World Game knowledge graph, try predict the winner, assuming we don't know the result.", - "shareholdingIntro": "Shareholding graph, query the shareholding relationship of a company, and the relationship between the company and the shareholder.", - "openstackIntro": "A demo of AI Ops with Graph, taking OpenStack as an example, where all resources were included in one graph.", - "fraudDetectionIntro": "Fraud detection with Graph, taking loan application as an example" + 'doc': { + 'welcome': 'Welcome to', + 'functionIntro': 'Functions introduction', + 'schemaIntro': `You can use the Schema page to operate graph spaces in ${window.gConfig.databaseName}`, + 'importIntro': `You can use the Import page to batch import vertex and edge data into ${window.gConfig.databaseName} for graph exploration and data analysis.`, + 'consoleIntro': 'When data is imported, you can use the Console page to query graph data.', + 'learningDoc': 'Learning Docs', + 'getStarted': `Getting started with ${window.gConfig.databaseName} Studio`, + 'getStartedTip': `What's ${window.gConfig.databaseName} Studio`, + 'useGuide': `Documents of ${window.gConfig.databaseName} Studio`, + 'useGuideTip': `Learn how to use ${window.gConfig.databaseName} Studio`, + 'ngqlIntro': `${window.gConfig.databaseName} Query Language (nGQL)`, + 'ngqlIntroTip': `nGQL is a declarative graph query language for ${window.gConfig.databaseName}. It allows expressive and efficient graph patterns. `, + 'start': 'Get Started', + 'sketchIntro': 'Schema drafting', + 'basketballplayerIntro': 'A typical schema composed of two vertex types (player and team) and two edge types (serve and follow), widely referenced by documentation.', + 'snsIntro': 'Social Network Graph demo, new friend recommendation, feed generation, etc.', + 'movieIntro': 'Movie recommendation with CBF, ItemCF and UserCF in Graph.', + 'datalineageIntro': `Metadata governance on ${window.gConfig.databaseName}, data lineage query, data dependency analysis, etc.`, + 'idMappingIntro': 'ID Mapping, Identity Resolution for a user system in Graph', + 'fifa2022Intro': '2022 Football World Game knowledge graph, try predict the winner, assuming we don\'t know the result.', + 'shareholdingIntro': 'Shareholding graph, query the shareholding relationship of a company, and the relationship between the company and the shareholder.', + 'openstackIntro': 'A demo of AI Ops with Graph, taking OpenStack as an example, where all resources were included in one graph.', + 'fraudDetectionIntro': 'Fraud detection with Graph, taking loan application as an example' }, - "warning": { - "connectError": "Connection refused, please configure server again", - "crashPage": "Oops, something went wrong", - "crashPageTip": "Service crashed, please contact administrator", - "refreshPage": "Refresh page", - "contactStaff": "Contact Us", - "errorMessage": "Error Message" + 'warning': { + 'connectError': 'Connection refused, please configure server again', + 'crashPage': 'Oops, something went wrong', + 'crashPageTip': 'Service crashed, please contact administrator', + 'refreshPage': 'Refresh page', + 'contactStaff': 'Contact Us', + 'errorMessage': 'Error Message' }, - "configServer": { - "connect": "Connect", - "host": "Graphd IP address", - "port": "Port", - "username": "Username", - "password": "Password", - "success": "succeed", - "clear": "Log out", - "title": `Connect to ${window.gConfig.databaseName}`, - "tip": "Don't know the address? Docs->" + 'configServer': { + 'connect': 'Connect', + 'host': 'Graphd IP address', + 'port': 'Port', + 'username': 'Username', + 'password': 'Password', + 'success': 'succeed', + 'clear': 'Log out', + 'title': `Connect to ${window.gConfig.databaseName}`, + 'tip': 'Don\'t know the address? Docs->' }, - "formRules": { - "hostRequired": "Host Required", - "portRequired": "Port Required", - "usernameRequired": "Username Required", - "passwordRequired": "Password Required", - "positiveIntegerRequired": "Please enter a non-negative integer", - "nameValidate": "The name must start with a letter, and it only supports English letters, numbers and underscores", - "nameRequired": "Please enter the name", - "numberRequired": "Please enter a positive integer", - "replicaLimit": "Replica factor must not exceed the number of your current online machines({number})", - "ttlRequired": "Please select the corresponding property, and the data type of the property must be integer or timestamp", - "ttlDurationRequired": "Please enter the time (in seconds)", - "dataTypeRequired": "Please select the data type", - "edgeTypeRequired": "Please select the edge type", - "srcIdRequired": "Please select the source VID", - "dstIdRequired": "Please select the destination VID", - "vidRequired": "Please select the VID", - "vidTypeRequired": "Vid type is required", - "fixStringLengthRequired": "fix string length limit is required", - "spaceRequired": "Space is required", - "maxBytes": "It cannot exceed {max} bytes", - "ttlLimit": "The data type of the property must be int or timestamp", - "associateNameRequired": "Associated {type} name is required", - "fileRequired": "Please select the file", - "formHostRequired": "Host Required", - "formPortRequired": "Port Required", - "regionRequired": "Region Required", - "endpointRequired": "Endpoint Required", - "bucketRequired": "Bucket Required", - "accessKeyIdRequired": "Access Key ID Required", - "accessKeySecretRequired": "Access Key Secret Required", - "platformRequired": "Platform Required" + 'formRules': { + 'hostRequired': 'Host Required', + 'portRequired': 'Port Required', + 'usernameRequired': 'Username Required', + 'passwordRequired': 'Password Required', + 'positiveIntegerRequired': 'Please enter a non-negative integer', + 'nameValidate': 'The name must start with a letter, and it only supports English letters, numbers and underscores', + 'nameRequired': 'Please enter the name', + 'numberRequired': 'Please enter a positive integer', + 'replicaLimit': 'Replica factor must not exceed the number of your current online machines({number})', + 'ttlRequired': 'Please select the corresponding property, and the data type of the property must be integer or timestamp', + 'ttlDurationRequired': 'Please enter the time (in seconds)', + 'dataTypeRequired': 'Please select the data type', + 'edgeTypeRequired': 'Please select the edge type', + 'srcIdRequired': 'Please select the source VID', + 'dstIdRequired': 'Please select the destination VID', + 'vidRequired': 'Please select the VID', + 'vidTypeRequired': 'Vid type is required', + 'fixStringLengthRequired': 'fix string length limit is required', + 'spaceRequired': 'Space is required', + 'maxBytes': 'It cannot exceed {max} bytes', + 'ttlLimit': 'The data type of the property must be int or timestamp', + 'associateNameRequired': 'Associated {type} name is required', + 'fileRequired': 'Please select the file', + 'formHostRequired': 'Host Required', + 'formPortRequired': 'Port Required', + 'regionRequired': 'Region Required', + 'endpointRequired': 'Endpoint Required', + 'bucketRequired': 'Bucket Required', + 'accessKeyIdRequired': 'Access Key ID Required', + 'accessKeySecretRequired': 'Access Key Secret Required', + 'platformRequired': 'Platform Required' }, - "console": { - "execTime": "Execution Time", - "exportVertex": "Please choose the column representing vertex IDs from the table", - "exportEdge": "Please choose the columns representing source vertex ID, destination vertex ID, and rank of an edge", - "deleteHistory": "Clear History", - "cypherParam": "Cypher Parameter", - "favorites": "Favorites", - "addToFavorites": "Add to favorites", - "unfavorite": "Unfavorite", - "clearFavorites": "Clear Favorites", - "graphviz": "Graphviz", - "selectSpace": "Please select Graph Space" + 'console': { + 'execTime': 'Execution Time', + 'exportVertex': 'Please choose the column representing vertex IDs from the table', + 'exportEdge': 'Please choose the columns representing source vertex ID, destination vertex ID, and rank of an edge', + 'deleteHistory': 'Clear History', + 'cypherParam': 'Cypher Parameter', + 'favorites': 'Favorites', + 'addToFavorites': 'Add to favorites', + 'unfavorite': 'Unfavorite', + 'clearFavorites': 'Clear Favorites', + 'graphviz': 'Graphviz', + 'selectSpace': 'Please select Graph Space' }, - "explore": { - "vertexStyle": "Vertex Color", - "notExist": "Not exist", - "expandItem": "Expand", - "collapseItem": "Collapse" + 'explore': { + 'vertexStyle': 'Vertex Color', + 'notExist': 'Not exist', + 'expandItem': 'Expand', + 'collapseItem': 'Collapse' }, - "import": { - "uploadFile": "Upload Files", - "dataSourceManagement": "Data Source Management", - "importData": "Import Data", - "createTask": "New Import", - "uploadTemp": "Import Template", - "downloadConfig": "Download Config", - "downloadLog": "Download Log", - "viewLogs": "View Logs", - "details": "Details", - "task": "import task", - "taskList": "Task List", - "taskName": "Task Name", - "tag": "Map Tags", - "edge": "Map Edges", - "runImport": "Import", - "fileName": "File Name", - "withHeader": "Header", - "fileSize": "Size", - "fileTitle": "File list", - "bindDatasource": "Add source file", - "endImport": "Stop Import", - "prop": "Prop", - "mapping": "CSV Index", - "edgeText": "Edge", - "choose": "Mapping", - "ignore": "Ignore", - "vertexText": "Vertex", - "indexNotEmpty": "column index can't be null.", - "enterPassword": `Please enter the ${window.gConfig.databaseName} account password to continue`, - "isEmpty": "is empty", - "startImporting": "Start importing", - "stopImportingSuccess": "Stop import successfully.", - "deleteSuccess": "Delete task successfully", - "batchSize": "Batch Size", - "importCompleted": "Import completed", - "importStopped": "Import stopped", - "importFailed": "Failed", - "importRunning": "Running", - "importPending": "Pending", - "notImported": "{total} records not imported", - "selectFile": "Select file", - "addTag": "Add Tag", - "addEdge": "Add Edge Type", - "selectTag": "Select Tag", - "selectEdge": "Select Edge Type", - "config": "Task Config", - "parseFailed": "File parsing failed", - "uploadTemplate": "Drag & drop the YAML configuration file to this area", - "uploadBoxTip": "The YAML configuration file is used to describe information about the files to be imported, the database server, and more. ", - "fileUploadRequired": "1. Please make sure all CSV data files are uploaded before import the YAML file. If not, please go to ", - "fileUploadRequired2": " first.", - "exampleDownload": "2. An example for the configuration file: ", - "uploadTemplateTip": "3. Configure the Yaml file: please keep only the file name (retain the file extension) for all file paths (path, logPath) in the template, e.g. logPath: config.csv", - "reUpload": "Re-upload", - "fileNotExist": "{name} file does not exist!", - "importYaml": "Import the YAML file", - "templateMatchError": "The user in the configuration does not match the current login account", - "uploadSuccessfully": "Upload files successfully.", - "fileSizeLimit": "{name} is too large and exceeds the upload limit({size}), please upload the file to the data/upload directory under the installation directory via scp", - "noHttp": "The address in the configuration file does not support http protocol, please remove http(s)://", - "addressMatch": "The address in the configuration file must contain the Graph address of current login connection. Separate multiple addresses with ", - "dataSourceFile": "Data source file", - "vidColumn": "VID column", - "srcVidColumn": "Source VID column", - "dstVidColumn": "Destination VID column", - "vidFunction": "VID function", - "vidPrefix": "VID prefix", - "vidSuffix": "VID suffix", - "concurrencyTip": `Number of ${window.gConfig.databaseName} client concurrency.`, - "batchSizeTip": "The number of statements inserting data in a batch.", - "retryTip": "Retry times of nGQL statement execution failures.", - "vidFunctionTip": "Function to generate VID. Currently only hash functions are supported.", - "vidPrefixTip": "prefix added to the original vid.", - "vidSuffixTip": "suffix added to the original vid.", - "selectCsvColumn": "Select CSV Index", - "graphAddress": "Graph service address", - "concurrency": "Concurrency", - "retry": "Retry", - "graphAddressTip": "The following Graph host will be used for data import", - "currentHost": "Current connected host", - "expandMoreConfig": "Expand more configurations", - "pickUpConfig": "Pick up more configurations", - "tagRequired": "Please select tag", - "edgeRequired": "Please select edge type", - "tagFileRequired": "Please add tag source file", - "edgeFileRequired": "Please add edge source file", - "tagFileSelect": "Please select tag source file", - "edgeFileSelect": "Please select edge source file", - "configDisplay": "These data files will be loaded", - "loadToTag": "Load {file} to tag {name}", - "loadToEdge": "Load {file} to edge type {name}", - "importConfirm": "Import task confirm", - "delimiter": "Delimiter", - "previewFiles": "Preview file list", - "sampleData": "Sample data", - "hasHeader": "Has header", - "noHeader": "No header", - "enterDelimiter": "Enter delimiter", - "applicateToAll": "Apply to all files", - "deleteFiles": "Delete select files", - "fileRepeatTip": "These files are already exists, continuing to upload will overwrite the original file", - "filePreview": "Preview file {name}", - "uploadConfirm": "Upload Confirm", - "localFiles": "Local files", - "s3": "Object Storage", - "sftp": "SFTP", - "newDataSource": "New Data Source", - "editDataSource": "Edit Data Source", - "deleteDataSource": "Delete Data Source", - "datasourceList": "{type} list", - "ipAddress": "IP Address:Port", - "bucketName": "Bucket Name", - "accessKeyId": "AccessKeyId", - "region": "Region", - "createTime": "Add Date", - "endpoint": "Endpoint", - "accessKeySecret": "AccessKeySecret", - "dataSourceType": "Data Source Type", - "selectPlatform": "Select platform", - "enterAddress": "Enter endpoint", - "enterRegion": "Enter region", - "serverAddress": "Server Address", - "port": "Port", - "newDataSourceTip": "Please add the data source for the first time", - "addNewImport": "Add New Import", - "addNewImportTip": "After adding the data source, create an import task to import the data into the database", - "start": "Start", - "s3Tip": "Only support cloud services that compatible with the Amazon S3 interface", - "readerConcurrency": "Reader concurrency", - "readerConcurrencyTip": "The number of concurrent readers that read data from the data source", - "importerConcurrency": "Importer concurrency", - "importerConcurrencyTip": `The number of concurrent importers that import data into ${window.gConfig.databaseName}`, - "selectDatasourceFile": "Select Data Source file", - "datasourceType": "Data Source Type", - "filePath": "File Path", - "directory": "Directory", - "preview": "Preview", - "customize": "Customize", - "s3Platform": "S3 compatible Service Provider", - "account": "Account", - "endpointTip": "Please use an endpoint without a bucket name in the domain name, e.g. {sample}", - "awsTip": "https://s3.us-east-2.amazonaws.com", - "ossTip": "https://oss-cn-hangzhou.aliyuncs.com", - "cosTip": "https://cos.ap-shanghai.myqcloud.com", - "customizeTip": "http://127.0.0.1:9000", - "addressRequired": "Please enter the import address in the configuration file", - "usernameRequired": "Please enter the username in the configuration file", - "passwordRequired": "Please enter the password in the configuration file", - "s3AccessKeyRequired": "Please enter the s3 accessKey in the configuration file", - "s3SecretKeyRequired": "Please enter the s3 secretKey in the configuration file", - "sftpUsernameRequired": "Please enter the sftp username in the configuration file", - "sftpPasswordRequired": "Please enter the sftp password in the configuration file", - "ossAccessKeyRequired": "Please enter the oss accessKey in the configuration file", - "ossSecretKeyRequired": "Please enter the oss secretKey in the configuration file", - "draft": "Draft", - "saveDraft": "Save Draft", - "modifyTime": "Modify time", - "taskNameRequired": "Please enter the task name and select space", - "fileMissing": "{files} does not exist, please re-upload the file", - "datasourceMissing": "The related data source of {files} is not found, please re-add the related datasource and reconfigure the task" + 'import': { + 'uploadFile': 'Upload Files', + 'dataSourceManagement': 'Data Source Management', + 'importData': 'Import Data', + 'createTask': 'New Import', + 'uploadTemp': 'Import Template', + 'downloadConfig': 'Download Config', + 'downloadLog': 'Download Log', + 'viewLogs': 'View Logs', + 'details': 'Details', + 'task': 'import task', + 'taskList': 'Task List', + 'taskName': 'Task Name', + 'tag': 'Map Tags', + 'edge': 'Map Edges', + 'runImport': 'Import', + 'fileName': 'File Name', + 'withHeader': 'Header', + 'fileSize': 'Size', + 'fileTitle': 'File list', + 'bindDatasource': 'Add source file', + 'endImport': 'Stop Import', + 'prop': 'Prop', + 'mapping': 'CSV Index', + 'edgeText': 'Edge', + 'choose': 'Mapping', + 'ignore': 'Ignore', + 'vertexText': 'Vertex', + 'indexNotEmpty': 'column index can\'t be null.', + 'enterPassword': `Please enter the ${window.gConfig.databaseName} account password to continue`, + 'isEmpty': 'is empty', + 'startImporting': 'Start importing', + 'stopImportingSuccess': 'Stop import successfully.', + 'deleteSuccess': 'Delete task successfully', + 'batchSize': 'Batch Size', + 'importCompleted': 'Import completed', + 'importStopped': 'Import stopped', + 'importFailed': 'Failed', + 'importRunning': 'Running', + 'importPending': 'Pending', + 'notImported': '{total} records not imported', + 'selectFile': 'Select file', + 'addTag': 'Add Tag', + 'addEdge': 'Add Edge Type', + 'selectTag': 'Select Tag', + 'selectEdge': 'Select Edge Type', + 'config': 'Task Config', + 'parseFailed': 'File parsing failed', + 'uploadTemplate': 'Drag & drop the YAML configuration file to this area', + 'uploadBoxTip': 'The YAML configuration file is used to describe information about the files to be imported, the database server, and more. ', + 'fileUploadRequired': '1. Please make sure all CSV data files are uploaded before import the YAML file. If not, please go to ', + 'fileUploadRequired2': ' first.', + 'exampleDownload': '2. An example for the configuration file: ', + 'uploadTemplateTip': '3. Configure the Yaml file: please keep only the file name (retain the file extension) for all file paths (path, logPath) in the template, e.g. logPath: config.csv', + 'reUpload': 'Re-upload', + 'fileNotExist': '{name} file does not exist!', + 'importYaml': 'Import the YAML file', + 'templateMatchError': 'The user in the configuration does not match the current login account', + 'uploadSuccessfully': 'Upload files successfully.', + 'fileSizeLimit': '{name} is too large and exceeds the upload limit({size}), please upload the file to the data/upload directory under the installation directory via scp', + 'noHttp': 'The address in the configuration file does not support http protocol, please remove http(s)://', + 'addressMatch': 'The address in the configuration file must contain the Graph address of current login connection. Separate multiple addresses with ', + 'dataSourceFile': 'Data source file', + 'vidColumn': 'VID column', + 'srcVidColumn': 'Source VID column', + 'dstVidColumn': 'Destination VID column', + 'vidFunction': 'VID function', + 'vidPrefix': 'VID prefix', + 'vidSuffix': 'VID suffix', + 'concurrencyTip': `Number of ${window.gConfig.databaseName} client concurrency.`, + 'batchSizeTip': 'The number of statements inserting data in a batch.', + 'retryTip': 'Retry times of nGQL statement execution failures.', + 'vidFunctionTip': 'Function to generate VID. Currently only hash functions are supported.', + 'vidPrefixTip': 'prefix added to the original vid.', + 'vidSuffixTip': 'suffix added to the original vid.', + 'selectCsvColumn': 'Select CSV Index', + 'graphAddress': 'Graph service address', + 'concurrency': 'Concurrency', + 'retry': 'Retry', + 'graphAddressTip': 'The following Graph host will be used for data import', + 'currentHost': 'Current connected host', + 'expandMoreConfig': 'Expand more configurations', + 'pickUpConfig': 'Pick up more configurations', + 'tagRequired': 'Please select tag', + 'edgeRequired': 'Please select edge type', + 'tagFileRequired': 'Please add tag source file', + 'edgeFileRequired': 'Please add edge source file', + 'tagFileSelect': 'Please select tag source file', + 'edgeFileSelect': 'Please select edge source file', + 'configDisplay': 'These data files will be loaded', + 'loadToTag': 'Load {file} to tag {name}', + 'loadToEdge': 'Load {file} to edge type {name}', + 'importConfirm': 'Import task confirm', + 'delimiter': 'Delimiter', + 'previewFiles': 'Preview file list', + 'sampleData': 'Sample data', + 'hasHeader': 'Has header', + 'noHeader': 'No header', + 'enterDelimiter': 'Enter delimiter', + 'applicateToAll': 'Apply to all files', + 'deleteFiles': 'Delete select files', + 'fileRepeatTip': 'These files are already exists, continuing to upload will overwrite the original file', + 'filePreview': 'Preview file {name}', + 'uploadConfirm': 'Upload Confirm', + 'localFiles': 'Local files', + 's3': 'Object Storage', + 'sftp': 'SFTP', + 'newDataSource': 'New Data Source', + 'editDataSource': 'Edit Data Source', + 'deleteDataSource': 'Delete Data Source', + 'datasourceList': '{type} list', + 'ipAddress': 'IP Address:Port', + 'bucketName': 'Bucket Name', + 'accessKeyId': 'AccessKeyId', + 'region': 'Region', + 'createTime': 'Add Date', + 'endpoint': 'Endpoint', + 'accessKeySecret': 'AccessKeySecret', + 'dataSourceType': 'Data Source Type', + 'selectPlatform': 'Select platform', + 'enterAddress': 'Enter endpoint', + 'enterRegion': 'Enter region', + 'serverAddress': 'Server Address', + 'port': 'Port', + 'newDataSourceTip': 'Please add the data source for the first time', + 'addNewImport': 'Add New Import', + 'addNewImportTip': 'After adding the data source, create an import task to import the data into the database', + 'start': 'Start', + 's3Tip': 'Only support cloud services that compatible with the Amazon S3 interface', + 'readerConcurrency': 'Reader concurrency', + 'readerConcurrencyTip': 'The number of concurrent readers that read data from the data source', + 'importerConcurrency': 'Importer concurrency', + 'importerConcurrencyTip': `The number of concurrent importers that import data into ${window.gConfig.databaseName}`, + 'selectDatasourceFile': 'Select Data Source file', + 'datasourceType': 'Data Source Type', + 'filePath': 'File Path', + 'directory': 'Directory', + 'preview': 'Preview', + 'customize': 'Customize', + 's3Platform': 'S3 compatible Service Provider', + 'account': 'Account', + 'endpointTip': 'Please use an endpoint without a bucket name in the domain name, e.g. {sample}', + 'awsTip': 'https://s3.us-east-2.amazonaws.com', + 'ossTip': 'https://oss-cn-hangzhou.aliyuncs.com', + 'cosTip': 'https://cos.ap-shanghai.myqcloud.com', + 'customizeTip': 'http://127.0.0.1:9000', + 'addressRequired': 'Please enter the import address in the configuration file', + 'usernameRequired': 'Please enter the username in the configuration file', + 'passwordRequired': 'Please enter the password in the configuration file', + 's3AccessKeyRequired': 'Please enter the s3 accessKeyID in the configuration file', + 's3SecretKeyRequired': 'Please enter the s3 accessKeySecret in the configuration file', + 'sftpUsernameRequired': 'Please enter the sftp username in the configuration file', + 'sftpPasswordRequired': 'Please enter the sftp password in the configuration file', + 'ossAccessKeyRequired': 'Please enter the oss accessKeyID in the configuration file', + 'ossSecretKeyRequired': 'Please enter the oss accessKeySecret in the configuration file', + 'draft': 'Draft', + 'saveDraft': 'Save Draft', + 'modifyTime': 'Modify time', + 'taskNameRequired': 'Please enter the task name and select space', + 'fileMissing': '{files} does not exist, please re-upload the file', + 'datasourceMissing': 'The related data source of {files} is not found, please re-add the related datasource and reconfigure the task' }, - "schema": { - "spaceList": "Graph Space List", - "useSpaceErrTip": "Space not found. Trying to use a newly created graph space may fail because the creation is implemented asynchronously. To make sure the follow-up operations work as expected, Wait for two heartbeat cycles, i.e., 20 seconds.", - "createSuccess": "Create Successfully", - "defineFields": "Define Properties", - "uniqProperty": "Property name cannot be duplicated", - "cancelOperation": "Do you want to close this panel", - "cancelPropmt": "If you close the panel, the configuration will be deleted automatically. Are you sure that you want to close the panel?", - "fieldDisabled": "A TTL configuration is set for this property, so it cannot be edited. If you want to edit this property, delete the TTL configuration.", - "indexExist": "An index exists, so TTL configuration is not permitted. A tag or edge type cannot have both an index and TTL configuration.", - "indexType": "Index Type", - "indexName": "Index Name", - "indexFields": "Indexed Properties", - "associateName": "Associated {type} name", - "dragSorting": "(Drag to Sort)", - "selectFields": "Please choose a property", - "indexedLength": "Please enter indexed length", - "indexedLengthDescription": "Set the indexed string length. If you are indexing fixed strings, you must not set this option.", - "indexedLengthRequired": "Indexed length must be a positive integer", - "rebuild": "Rebuild", - "createSpace": "Create Space", - "No": "No", - "spaceName": "Name", - "partitionNumber": "Partition Number", - "replicaFactor": "Replica Factor", - "charset": "Charset", - "collate": "Collate", - "vidType": "Vid Type", - "group": "Group", - "comment": "Comment", - "operations": "Operations", - "spaceNameEnter": "Please enter the space name", - "propertyCount": "Property Num", - "configTypeList": "{type} List", - "configTypeAction": "{action} {type}", - "timestampFormat": "Supported data inserting methods:
1. call function now()
2. call function timestamp(), for example: timestamp('2021-07-05T06:18:43.984000')
3. Input the timestamp directly, namely the number of seconds from 1970-01-01 00:00:00", - "dateFormat": "Supported data inserting methods:
Call function date(), for example: date('2021-03-17')", - "timeFormat": "Supported data inserting methods:
Call function time(), for example: time('17:53:59')", - "datetimeFormat": "Supported data inserting methods:
Call function datetime(), for example: datetime('2021-03-17T17:53:59')", - "geographyFormat": "Supported data inserting methods:
Call function ST_GeogFromText(), for example:ST_GeogFromText('POINT(6 10)')", - "geography(point)Format": "Supported data inserting methods:
Call function ST_GeogFromText('POINT()'), for example:ST_GeogFromText('POINT(6 10)')", - "geography(linestring)Format": "Supported data inserting methods:
Call function ST_GeogFromText('LINESTRING()'), for example:ST_GeogFromText('LINESTRING(3 4,10 50,20 25)')", - "geography(polygon)Format": "Supported data inserting methods:
Call function ST_GeogFromText('POLYGON()'), for example:ST_GeogFromText('POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))')", - "durationFormat": "Supported data inserting methods:
Call function duration(), for example:duration({years: 1, seconds: 0})", - "setTTL": "Set TTL (Time To Live)", - "refresh": "Refresh", - "startStat": "Start Stats", - "statTip": "The statistics execution time is affected by the amount of data.", - "lastRefreshTime": "Last refreshed time", - "statsType": "Type", - "statsName": "Name", - "statsCount": "Count", - "statError": "Stat failed, Please try again.", - "statFinished": "Statistics end", - "deleteSpace": "Delete Graph Space", - "cloneSpace": "Clone Graph Space", - "length": "Length", - "selectVidTypeTip": "Please select the type", - "csvDownload": "Export CSV File", - "pngDownload": "Export PNG File", - "rebuildSuccess": "{names} rebuild successfully", - "rebuildFailed": "{names} rebuild failed", - "startRebuildIndex": "Start rebuilding the index {name}", - "getSchema": "Get Schema", - "getSchemaTip": `Because there is no strong binding relationship between tags and edges in the current ${window.gConfig.databaseName} version, the results will be generated based on randomly obtained data, for reference only.`, - "danglingEdge": "Dangling edge", - "showDDL": "View Schema DDL", - "downloadNGQL": "Download.nGQL", - "getDDLError": "Failed to get the schema DDL, Please try again", - "totalVertices": "Total Vertices Count", - "totalEdges": "Total Edges Count" + 'schema': { + 'spaceList': 'Graph Space List', + 'useSpaceErrTip': 'Space not found. Trying to use a newly created graph space may fail because the creation is implemented asynchronously. To make sure the follow-up operations work as expected, Wait for two heartbeat cycles, i.e., 20 seconds.', + 'createSuccess': 'Create Successfully', + 'defineFields': 'Define Properties', + 'uniqProperty': 'Property name cannot be duplicated', + 'cancelOperation': 'Do you want to close this panel', + 'cancelPropmt': 'If you close the panel, the configuration will be deleted automatically. Are you sure that you want to close the panel?', + 'fieldDisabled': 'A TTL configuration is set for this property, so it cannot be edited. If you want to edit this property, delete the TTL configuration.', + 'indexExist': 'An index exists, so TTL configuration is not permitted. A tag or edge type cannot have both an index and TTL configuration.', + 'indexType': 'Index Type', + 'indexName': 'Index Name', + 'indexFields': 'Indexed Properties', + 'associateName': 'Associated {type} name', + 'dragSorting': '(Drag to Sort)', + 'selectFields': 'Please choose a property', + 'indexedLength': 'Please enter indexed length', + 'indexedLengthDescription': 'Set the indexed string length. If you are indexing fixed strings, you must not set this option.', + 'indexedLengthRequired': 'Indexed length must be a positive integer', + 'rebuild': 'Rebuild', + 'createSpace': 'Create Space', + 'No': 'No', + 'spaceName': 'Name', + 'partitionNumber': 'Partition Number', + 'replicaFactor': 'Replica Factor', + 'charset': 'Charset', + 'collate': 'Collate', + 'vidType': 'Vid Type', + 'group': 'Group', + 'comment': 'Comment', + 'operations': 'Operations', + 'spaceNameEnter': 'Please enter the space name', + 'propertyCount': 'Property Num', + 'configTypeList': '{type} List', + 'configTypeAction': '{action} {type}', + 'timestampFormat': 'Supported data inserting methods:
1. call function now()
2. call function timestamp(), for example: timestamp(\'2021-07-05T06:18:43.984000\')
3. Input the timestamp directly, namely the number of seconds from 1970-01-01 00:00:00', + 'dateFormat': 'Supported data inserting methods:
Call function date(), for example: date(\'2021-03-17\')', + 'timeFormat': 'Supported data inserting methods:
Call function time(), for example: time(\'17:53:59\')', + 'datetimeFormat': 'Supported data inserting methods:
Call function datetime(), for example: datetime(\'2021-03-17T17:53:59\')', + 'geographyFormat': 'Supported data inserting methods:
Call function ST_GeogFromText(), for example:ST_GeogFromText(\'POINT(6 10)\')', + 'geography(point)Format': 'Supported data inserting methods:
Call function ST_GeogFromText(\'POINT()\'), for example:ST_GeogFromText(\'POINT(6 10)\')', + 'geography(linestring)Format': 'Supported data inserting methods:
Call function ST_GeogFromText(\'LINESTRING()\'), for example:ST_GeogFromText(\'LINESTRING(3 4,10 50,20 25)\')', + 'geography(polygon)Format': 'Supported data inserting methods:
Call function ST_GeogFromText(\'POLYGON()\'), for example:ST_GeogFromText(\'POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))\')', + 'durationFormat': 'Supported data inserting methods:
Call function duration(), for example:duration({years: 1, seconds: 0})', + 'setTTL': 'Set TTL (Time To Live)', + 'refresh': 'Refresh', + 'startStat': 'Start Stats', + 'statTip': 'The statistics execution time is affected by the amount of data.', + 'lastRefreshTime': 'Last refreshed time', + 'statsType': 'Type', + 'statsName': 'Name', + 'statsCount': 'Count', + 'statError': 'Stat failed, Please try again.', + 'statFinished': 'Statistics end', + 'deleteSpace': 'Delete Graph Space', + 'cloneSpace': 'Clone Graph Space', + 'length': 'Length', + 'selectVidTypeTip': 'Please select the type', + 'csvDownload': 'Export CSV File', + 'pngDownload': 'Export PNG File', + 'rebuildSuccess': '{names} rebuild successfully', + 'rebuildFailed': '{names} rebuild failed', + 'startRebuildIndex': 'Start rebuilding the index {name}', + 'getSchema': 'Get Schema', + 'getSchemaTip': `Because there is no strong binding relationship between tags and edges in the current ${window.gConfig.databaseName} version, the results will be generated based on randomly obtained data, for reference only.`, + 'danglingEdge': 'Dangling edge', + 'showDDL': 'View Schema DDL', + 'downloadNGQL': 'Download.nGQL', + 'getDDLError': 'Failed to get the schema DDL, Please try again', + 'totalVertices': 'Total Vertices Count', + 'totalEdges': 'Total Edges Count' }, - "empty": { - "stats": "No Statistics Data", - "statsTip": "Click the button to start statistics", - "tag": "No Tag Data", - "tagTip": "Click the button to create tag", - "edge": "No Edge Data", - "edgeTip": "Click the button to create edge", - "index": "No Index Data", - "indexTip": "Click the button to create index" + 'empty': { + 'stats': 'No Statistics Data', + 'statsTip': 'Click the button to start statistics', + 'tag': 'No Tag Data', + 'tagTip': 'Click the button to create tag', + 'edge': 'No Edge Data', + 'edgeTip': 'Click the button to create edge', + 'index': 'No Index Data', + 'indexTip': 'Click the button to create index' }, - "menu": { - "use": "Use Manual", - "release": "Release Note", - "forum": "Help Forum", - "nGql": "nGQL", - "feedback": "Trouble Feedback", - "repo": "GitHub Repo", - "trial": "Enterprise Edition Trial", - "contact":"Contact Us" + 'menu': { + 'use': 'Use Manual', + 'release': 'Release Note', + 'forum': 'Help Forum', + 'nGql': 'nGQL', + 'feedback': 'Trouble Feedback', + 'repo': 'GitHub Repo', + 'trial': 'Enterprise Edition Trial', + 'contact': 'Contact Us' }, - "link": { - "nGQLHref": "https://docs.nebula-graph.io/3.4.0/3.ngql-guide/1.nGQL-overview/1.overview/", - "mannualHref": "https://docs.nebula-graph.io/3.4.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/", - "startStudioHref": "https://docs.nebula-graph.io/3.4.0/nebula-studio/quick-start/st-ug-plan-schema/", - "versionLogHref": "https://docs.nebula-graph.io/3.4.0/20.appendix/release-notes/studio-release-note/", - "forumHref": "https://discuss.nebula-graph.io/", - "feedback": "https://app.slack.com/client/TJB3N2BPD/CJNFUM7AR", - "trial": "https://www.nebula-graph.io/visualization-tools-free-trial", - "contact":"https://www.nebula-graph.io/contact", - "loginHref": "https://docs.nebula-graph.io/3.4.0/nebula-studio/deploy-connect/st-ug-connect/" + 'link': { + 'nGQLHref': 'https://docs.nebula-graph.io/3.5.0/3.ngql-guide/1.nGQL-overview/1.overview/', + 'mannualHref': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/', + 'startStudioHref': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/quick-start/st-ug-plan-schema/', + 'versionLogHref': 'https://docs.nebula-graph.io/3.5.0/20.appendix/release-notes/studio-release-note/', + 'forumHref': 'https://discuss.nebula-graph.io/', + 'feedback': 'https://app.slack.com/client/TJB3N2BPD/CJNFUM7AR', + 'trial': 'https://www.nebula-graph.io/visualization-tools-free-trial', + 'contact': 'https://www.nebula-graph.io/contact', + 'loginHref': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/deploy-connect/st-ug-connect/' }, - "sketch": { - "dragTip": "Drag and drop to the canvas", - "tag": "Tag", - "edge": "Edge Type", - "name": "{name} Name", - "detail": "{name} details", - "comment": "Comment", - "properties": "Properties", - "propertyName": "Property Name", - "dataType": "Data Type", - "addProperty": "Add Property", - "type": "type", - "list": "Draft List", - "new": "New", - "applyToSpace": "Apply to Space", - "createSpace": "Create New Space", - "selectSpace": "Select Space", - "noCurrentSketch": "No schema sketch selected", - "noCurrentSketchTips": "Please select a schema sketch first", - "sketchInvalid": "Please complete the current Schema information", - "saveSuccess": "Save successfully", - "saveReminder": "The current sketch has been modified but not saved, whether to continue to switch sketches?", - "saveTip": "The current sketch has been modified but not saved, please save first.", - "confirmDelete": "Sure to delete?", - "saveDraft": "Save draft", - "export": "Export", - "applySpaceTip": "The new schema will not overwrite the original schema in the space", - "sameSchemaWarning": "{content} already exists in the space, please change the {hasType} name or select another space.", - "noData": "No data, please import data first", - "uniqName": "Tag & Edge type name cannot be duplicated", - "spaceExisted": "Space already exists", - "updateNameSuccess": "Update name successfully", - "search": "Search name" + 'sketch': { + 'dragTip': 'Drag and drop to the canvas', + 'tag': 'Tag', + 'edge': 'Edge Type', + 'name': '{name} Name', + 'detail': '{name} details', + 'comment': 'Comment', + 'properties': 'Properties', + 'propertyName': 'Property Name', + 'dataType': 'Data Type', + 'addProperty': 'Add Property', + 'type': 'type', + 'list': 'Draft List', + 'new': 'New', + 'applyToSpace': 'Apply to Space', + 'createSpace': 'Create New Space', + 'selectSpace': 'Select Space', + 'noCurrentSketch': 'No schema sketch selected', + 'noCurrentSketchTips': 'Please select a schema sketch first', + 'sketchInvalid': 'Please complete the current Schema information', + 'saveSuccess': 'Save successfully', + 'saveReminder': 'The current sketch has been modified but not saved, whether to continue to switch sketches?', + 'saveTip': 'The current sketch has been modified but not saved, please save first.', + 'confirmDelete': 'Sure to delete?', + 'saveDraft': 'Save draft', + 'export': 'Export', + 'applySpaceTip': 'The new schema will not overwrite the original schema in the space', + 'sameSchemaWarning': '{content} already exists in the space, please change the {hasType} name or select another space.', + 'noData': 'No data, please import data first', + 'uniqName': 'Tag & Edge type name cannot be duplicated', + 'spaceExisted': 'Space already exists', + 'updateNameSuccess': 'Update name successfully', + 'search': 'Search name' }, - "welcome": { - "guide": "Beginner's Guide", - "quickStart": "Start", - "quickStartDesc": "Documents", - "demos": "Demos", - "starterDatasets": "Starter Datasets", - "solutionDatasets": "Solution Datasets", - "demoDownload": "Download", - "demoDownloading": "downloading", - "demoIntro": "Demo Introduction", - "loadWaiting": "Data is loading, please wait... It will end in {second}s", - "downloadSuccess": "Dataset `{space}` has been downloaded successfully", - "spaceExist": "The graph space `{space}` already exists", - "schemaModuleLink": "https://docs.nebula-graph.io/3.4.0/nebula-studio/quick-start/st-ug-create-schema/", - "importModuleLink": "https://docs.nebula-graph.io/3.4.0/nebula-studio/quick-start/st-ug-import-data/", - "consoleModuleLink": "https://docs.nebula-graph.io/3.4.0/nebula-studio/quick-start/st-ug-console/", - "sketchModuleLink": "https://docs.nebula-graph.io/3.4.0/nebula-studio/quick-start/draft/", - "basketballplayerDocLink": "", - "shareholdingDocLink": "https://nebula-graph.io/demo/shared-holding", - "openstackDocLink": "", - "snsDocLink": "https://siwei.io/en/nebulagraph-sns/", - "datalineageDocLink": "https://siwei.io/en/data-lineage-oss-ref-solution/", - "movieDocLink": "", - "idMappingDocLink": "", - "fraudDetectionDocLink": "https://siwei.io/en/fraud-detection-with-nebulagraph/", - "fifa2022DocLink": "https://siwei.io/en/chatgpt-and-nebulagraph-predict-fifa-world-cup/", - "alwaysShow": "Always show the welcome page", - "progressTitle": "Download & Import Data" + 'welcome': { + 'guide': 'Beginner\'s Guide', + 'quickStart': 'Start', + 'quickStartDesc': 'Documents', + 'demos': 'Demos', + 'starterDatasets': 'Starter Datasets', + 'solutionDatasets': 'Solution Datasets', + 'demoDownload': 'Download', + 'demoDownloading': 'downloading', + 'demoIntro': 'Demo Introduction', + 'loadWaiting': 'Data is loading, please wait... It will end in {second}s', + 'downloadSuccess': 'Dataset `{space}` has been downloaded successfully', + 'spaceExist': 'The graph space `{space}` already exists', + 'schemaModuleLink': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/quick-start/st-ug-create-schema/', + 'importModuleLink': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/quick-start/st-ug-import-data/', + 'consoleModuleLink': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/quick-start/st-ug-console/', + 'sketchModuleLink': 'https://docs.nebula-graph.io/3.5.0/nebula-studio/quick-start/draft/', + 'basketballplayerDocLink': '', + 'shareholdingDocLink': 'https://nebula-graph.io/demo/shared-holding', + 'openstackDocLink': '', + 'snsDocLink': 'https://siwei.io/en/nebulagraph-sns/', + 'datalineageDocLink': 'https://siwei.io/en/data-lineage-oss-ref-solution/', + 'movieDocLink': '', + 'idMappingDocLink': '', + 'fraudDetectionDocLink': 'https://siwei.io/en/fraud-detection-with-nebulagraph/', + 'fifa2022DocLink': 'https://siwei.io/en/chatgpt-and-nebulagraph-predict-fifa-world-cup/', + 'alwaysShow': 'Always show the welcome page', + 'progressTitle': 'Download & Import Data' } -} +}; diff --git a/app/config/locale/zh-CN.ts b/app/config/locale/zh-CN.ts index 30a52686..f5dadf40 100644 --- a/app/config/locale/zh-CN.ts +++ b/app/config/locale/zh-CN.ts @@ -1,495 +1,495 @@ export default { - "common": { - "requestError": "请求错误", - "currentSpace": "当前图空间", - "seeTheHistory":"查看历史", - "table": "表格", - "log":"日志", - "sorryNGQLCannotBeEmpty": "nGQL语句不能为空", - "disablesUseToSwitchSpace": "禁止使用命令切换Space", - "NGQLHistoryList": "nGQL历史列表", - "empty": "清空", - "run":"运行", - "console": "控制台", - "ok": "确认", - "success": "成功", - "fail": "失败", - "cancel": "取消", - "confirm": "确认", - "import": "导入", - "ask": "确定进行当前操作?", - "openInExplore": "导入图探索", - "schema": "Schema", - "create": "创建", - "name": "名称", - "operation": "操作", - "delete": "删除", - "optional": "可选", - "exportNGQL": "对应的nGQL语句", - "relatedProperties": "相关属性", - "type": "类型", - "edit": "编辑", - "deleteSuccess": "删除成功", - "propertyName": "属性名称", - "dataType": "数据类型", - "allowNull": "允许空值", - "defaults": "默认值", - "addProperty": "添加属性", - "updateSuccess": "更新成功", - "add": "添加", - "tag": "标签", - "edge": "边类型", - "index": "索引", - "yes": "确定", - "no": "取消", - "graph": "可视化", - "color": "颜色", - "total": "共计", - "namePlaceholder":"请输入{name}名", - "comment": "描述", - "space": "图空间", - "version": "版本", - "statistics": "统计", - "duplicate": "复制", - "copy": "复制", - "copySuccess": "复制成功", - "sketch": "Schema 草图", - "viewSchema": "查看 Schema", - "beta": "Beta", - "danglingEdge": "悬挂边", - "columnName": "列名", - "src": "起点", - "dst": "终点", - "value": "值", - "continue": "继续", - "update": "更新", - "prev": "上一步", - "createTime": "创建时间", - "rerun": "重新导入" + 'common': { + 'requestError': '请求错误', + 'currentSpace': '当前图空间', + 'seeTheHistory': '查看历史', + 'table': '表格', + 'log': '日志', + 'sorryNGQLCannotBeEmpty': 'nGQL语句不能为空', + 'disablesUseToSwitchSpace': '禁止使用命令切换Space', + 'NGQLHistoryList': 'nGQL历史列表', + 'empty': '清空', + 'run': '运行', + 'console': '控制台', + 'ok': '确认', + 'success': '成功', + 'fail': '失败', + 'cancel': '取消', + 'confirm': '确认', + 'import': '导入', + 'ask': '确定进行当前操作?', + 'openInExplore': '导入图探索', + 'schema': 'Schema', + 'create': '创建', + 'name': '名称', + 'operation': '操作', + 'delete': '删除', + 'optional': '可选', + 'exportNGQL': '对应的nGQL语句', + 'relatedProperties': '相关属性', + 'type': '类型', + 'edit': '编辑', + 'deleteSuccess': '删除成功', + 'propertyName': '属性名称', + 'dataType': '数据类型', + 'allowNull': '允许空值', + 'defaults': '默认值', + 'addProperty': '添加属性', + 'updateSuccess': '更新成功', + 'add': '添加', + 'tag': '标签', + 'edge': '边类型', + 'index': '索引', + 'yes': '确定', + 'no': '取消', + 'graph': '可视化', + 'color': '颜色', + 'total': '共计', + 'namePlaceholder': '请输入{name}名', + 'comment': '描述', + 'space': '图空间', + 'version': '版本', + 'statistics': '统计', + 'duplicate': '复制', + 'copy': '复制', + 'copySuccess': '复制成功', + 'sketch': 'Schema 草图', + 'viewSchema': '查看 Schema', + 'beta': 'Beta', + 'danglingEdge': '悬挂边', + 'columnName': '列名', + 'src': '起点', + 'dst': '终点', + 'value': '值', + 'continue': '继续', + 'update': '更新', + 'prev': '上一步', + 'createTime': '创建时间', + 'rerun': '重新导入' }, - "doc": { - "welcome": "欢迎使用", - "functionIntro": "功能介绍", - "schemaIntro": `您可以在 schema 模块对 ${window.gConfig.databaseName} 图空间进行管理。`, - "importIntro": `您可以使用导入模块将数据批量导入 ${window.gConfig.databaseName}。`, - "consoleIntro": `您可以使用控制台模块对 ${window.gConfig.databaseName} 内的数据进行查询操作。`, - "learningDoc": "学习文档", - "getStarted": `认识 ${window.gConfig.databaseName} Studio`, - "getStartedTip": `什么是 ${window.gConfig.databaseName} Studio。`, - "useGuide": `${window.gConfig.databaseName} Studio 使用手册`, - "useGuideTip": `学习如何使用 ${window.gConfig.databaseName} Studio。`, - "ngqlIntro": `${window.gConfig.databaseName} 查询语言 (nGQL)`, - "ngqlIntroTip": `nGQL 是 ${window.gConfig.databaseName} 使用的的声明式图查询语言,是为开发和运维人员设计的类 SQL 查询语言,易于学习。`, - "start": "快速开始", - "sketchIntro": "Schema 草图", - "basketballplayerIntro": "最简单的示例图谱空间,最广泛被文档中引用的数据集", - "snsIntro": "社交网络示例图谱空间,包含用户、好友、帖子、评论等数据,新好友推荐、时间线生成、社交分析", - "movieIntro": "电影推荐图谱,尝试在图上做 CBF、ItemCF 和 UserCF 算法", - "datalineageIntro": "元数据管理实例数据集,血缘查询、血缘依赖分析、大数据治理", - "idMappingIntro": "ID Mapping,用户系统上的实体分析案例", - "fifa2022Intro": "面向关系而非复杂属性的世界杯图谱,尝试利用图算法预测冠军吧(假设我们还不知道冠军)", - "shareholdingIntro": "股权关系图谱,图上实做股权穿透、公司实控人分析、背景调查", - "openstackIntro": "图驱动的复杂基础设施智能运维实操,基于 OpenStack 全资源抓取图谱的例子", - "fraudDetectionIntro": "欺诈检测的图应用,以借贷场景为例" + 'doc': { + 'welcome': '欢迎使用', + 'functionIntro': '功能介绍', + 'schemaIntro': `您可以在 schema 模块对 ${window.gConfig.databaseName} 图空间进行管理。`, + 'importIntro': `您可以使用导入模块将数据批量导入 ${window.gConfig.databaseName}。`, + 'consoleIntro': `您可以使用控制台模块对 ${window.gConfig.databaseName} 内的数据进行查询操作。`, + 'learningDoc': '学习文档', + 'getStarted': `认识 ${window.gConfig.databaseName} Studio`, + 'getStartedTip': `什么是 ${window.gConfig.databaseName} Studio。`, + 'useGuide': `${window.gConfig.databaseName} Studio 使用手册`, + 'useGuideTip': `学习如何使用 ${window.gConfig.databaseName} Studio。`, + 'ngqlIntro': `${window.gConfig.databaseName} 查询语言 (nGQL)`, + 'ngqlIntroTip': `nGQL 是 ${window.gConfig.databaseName} 使用的的声明式图查询语言,是为开发和运维人员设计的类 SQL 查询语言,易于学习。`, + 'start': '快速开始', + 'sketchIntro': 'Schema 草图', + 'basketballplayerIntro': '最简单的示例图谱空间,最广泛被文档中引用的数据集', + 'snsIntro': '社交网络示例图谱空间,包含用户、好友、帖子、评论等数据,新好友推荐、时间线生成、社交分析', + 'movieIntro': '电影推荐图谱,尝试在图上做 CBF、ItemCF 和 UserCF 算法', + 'datalineageIntro': '元数据管理实例数据集,血缘查询、血缘依赖分析、大数据治理', + 'idMappingIntro': 'ID Mapping,用户系统上的实体分析案例', + 'fifa2022Intro': '面向关系而非复杂属性的世界杯图谱,尝试利用图算法预测冠军吧(假设我们还不知道冠军)', + 'shareholdingIntro': '股权关系图谱,图上实做股权穿透、公司实控人分析、背景调查', + 'openstackIntro': '图驱动的复杂基础设施智能运维实操,基于 OpenStack 全资源抓取图谱的例子', + 'fraudDetectionIntro': '欺诈检测的图应用,以借贷场景为例' }, - "warning": { - "connectError": "数据库连接有误,请重新配置", - "crashPage": "页面崩溃了", - "crashPageTip": "服务崩溃,请联系管理员", - "refreshPage": "刷新页面", - "contactStaff": "联系客服", - "errorMessage": "错误信息" + 'warning': { + 'connectError': '数据库连接有误,请重新配置', + 'crashPage': '页面崩溃了', + 'crashPageTip': '服务崩溃,请联系管理员', + 'refreshPage': '刷新页面', + 'contactStaff': '联系客服', + 'errorMessage': '错误信息' }, - "configServer": { - "connect": "连接", - "host": "Graphd IP 地址", - "port": "Port", - "username": "用户名", - "password": "密码", - "success": "配置成功", - "clear": "登出", - "title": "配置数据库", - "tip": "连接数据库说明文档->" + 'configServer': { + 'connect': '连接', + 'host': 'Graphd IP 地址', + 'port': 'Port', + 'username': '用户名', + 'password': '密码', + 'success': '配置成功', + 'clear': '登出', + 'title': '配置数据库', + 'tip': '连接数据库说明文档->' }, - "formRules": { - "hostRequired": "请填写数据库服务器的IP地址", - "portRequired": "请填写数据库服务器的端口", - "usernameRequired": "请填写用户名", - "passwordRequired": "请填写密码", - "positiveIntegerRequired": "请输入一个非负整数", - "nameValidate": "命名必须以字母开头,且只支持输入英文字母、数字以及下划线_", - "nameRequired": "请输入名称", - "numberRequired": "请输入正整数", - "replicaLimit": "副本数量不得超过你当前 online 机器数量({number})", - "ttlRequired": "请选择TTL指定的属性, 且属性的数据类型需为 integer 或 timestamp", - "ttlDurationRequired": "请输入时间(s)", - "dataTypeRequired": "请选择数据类型", - "edgeTypeRequired": "请选择边类型", - "srcIdRequired": "请选择起点 VID", - "dstIdRequired": "请选择终点 VID", - "vidRequired": "请选择 VID", - "vidTypeRequired": "请选择 VID 类型", - "fixStringLengthRequired": "请输入字符串固定长度", - "spaceRequired": "图空间不能为空", - "maxBytes": "不能超过 {max} 字节", - "ttlLimit": "属性的数据类型必须是int或者timestamp", - "associateNameRequired": "请选择关联 {type} 名称", - "fileRequired": "请选择文件", - "formHostRequired": "请填写服务器IP地址", - "formPortRequired": "请填写服务器端口", - "regionRequired": "请选择区域", - "endpointRequired": "请填写 Endpoint", - "bucketRequired": "请填写 Bucket", - "accessKeyIdRequired": "请填写 Access Key ID", - "accessKeySecretRequired": "请填写 Access Key Secret", - "platformRequired": "请选择平台" + 'formRules': { + 'hostRequired': '请填写数据库服务器的IP地址', + 'portRequired': '请填写数据库服务器的端口', + 'usernameRequired': '请填写用户名', + 'passwordRequired': '请填写密码', + 'positiveIntegerRequired': '请输入一个非负整数', + 'nameValidate': '命名必须以字母开头,且只支持输入英文字母、数字以及下划线_', + 'nameRequired': '请输入名称', + 'numberRequired': '请输入正整数', + 'replicaLimit': '副本数量不得超过你当前 online 机器数量({number})', + 'ttlRequired': '请选择TTL指定的属性, 且属性的数据类型需为 integer 或 timestamp', + 'ttlDurationRequired': '请输入时间(s)', + 'dataTypeRequired': '请选择数据类型', + 'edgeTypeRequired': '请选择边类型', + 'srcIdRequired': '请选择起点 VID', + 'dstIdRequired': '请选择终点 VID', + 'vidRequired': '请选择 VID', + 'vidTypeRequired': '请选择 VID 类型', + 'fixStringLengthRequired': '请输入字符串固定长度', + 'spaceRequired': '图空间不能为空', + 'maxBytes': '不能超过 {max} 字节', + 'ttlLimit': '属性的数据类型必须是int或者timestamp', + 'associateNameRequired': '请选择关联 {type} 名称', + 'fileRequired': '请选择文件', + 'formHostRequired': '请填写服务器IP地址', + 'formPortRequired': '请填写服务器端口', + 'regionRequired': '请选择区域', + 'endpointRequired': '请填写 Endpoint', + 'bucketRequired': '请填写 Bucket', + 'accessKeyIdRequired': '请填写 Access Key ID', + 'accessKeySecretRequired': '请填写 Access Key Secret', + 'platformRequired': '请选择平台' }, - "console": { - "execTime": "执行时间消耗", - "exportVertex": "请选择表中代表点VID的列", - "exportEdge": "请选择结果中分别代表边的起点(src_vid)、终点(dst_vid)和权重(rank)的列", - "deleteHistory": "清除历史", - "cypherParam": "自定义参数", - "favorites": "收藏夹", - "addToFavorites": "添加到收藏夹", - "unfavorite": "取消收藏", - "clearFavorites": "清空收藏夹", - "graphviz": "Graphviz", - "selectSpace": "请选择图空间" + 'console': { + 'execTime': '执行时间消耗', + 'exportVertex': '请选择表中代表点VID的列', + 'exportEdge': '请选择结果中分别代表边的起点(src_vid)、终点(dst_vid)和权重(rank)的列', + 'deleteHistory': '清除历史', + 'cypherParam': '自定义参数', + 'favorites': '收藏夹', + 'addToFavorites': '添加到收藏夹', + 'unfavorite': '取消收藏', + 'clearFavorites': '清空收藏夹', + 'graphviz': 'Graphviz', + 'selectSpace': '请选择图空间' }, - "explore": { - "vertexStyle": "节点颜色", - "notExist": "不存在", - "expandItem": "展开", - "collapseItem": "收起" + 'explore': { + 'vertexStyle': '节点颜色', + 'notExist': '不存在', + 'expandItem': '展开', + 'collapseItem': '收起' }, - "import": { - "uploadFile": "上传文件", - "dataSourceManagement": "数据源管理", - "importData": "导入数据", - "createTask": "创建导入任务", - "uploadTemp": "导入模板", - "downloadConfig": "下载配置文件", - "downloadLog": "下载日志", - "viewLogs": "查看日志", - "details": "详情", - "task": "导入任务", - "taskList": "任务列表", - "taskName": "任务名称", - "tag": "关联标签", - "edge": "关联边", - "runImport": "导入", - "fileName": "文件名", - "withHeader": "表头", - "fileSize": "大小", - "fileTitle": "文件列表", - "bindDatasource": "添加导入文件", - "endImport": "终止导入", - "prop": "属性", - "mapping": "对应列标", - "edgeText": "边", - "choose": "选择", - "ignore": "忽略", - "vertexText": "点", - "indexNotEmpty": "对应列标不能为空", - "enterPassword": "请输入 database 账号密码以继续", - "isEmpty": "为空", - "startImporting": "开始导入", - "stopImportingSuccess": "已停止导入", - "deleteSuccess": "已删除任务记录", - "batchSize": "批处理量", - "importCompleted": "导入完成", - "importStopped": "导入中止", - "importFailed": "导入失败", - "importRunning": "导入中", - "importPending": "等待导入", - "notImported": "{total}条记录未导入", - "selectFile": "选择绑定文件", - "addTag": "添加 Tag", - "addEdge": "添加 Edge Type", - "selectTag": "选择 Tag", - "selectEdge": "选择 Edge 类型", - "config": "任务配置", - "parseFailed": "文件解析失败", - "uploadTemplate": "将 YAML 配置文件拖放到该区域", - "uploadBoxTip": "使用 YAML 配置文件用来描述待导入文件信息、数据库服务器等信息。", - "fileUploadRequired": "1. 请确保在导入 YAML 文件之前上传所有 CSV 数据文件。 如果没有,请先前往", - "fileUploadRequired2": "数据文件", - "exampleDownload": "2. 配置文件示例:", - "uploadTemplateTip": "3. 配置Yaml文件:模板中所有文件路径(path、logPath)请只保留文件名(保留文件扩展名),例如: 日志路径:config.csv", - "reUpload": "重新上传", - "fileNotExist": "文件 {name} 不存在", - "importYaml": "导入 YAML 文件", - "templateMatchError": "配置中的用户姓名与当前登录账号不一致", - "uploadSuccessfully": "上传文件成功", - "fileSizeLimit": "{name}文件过大,超过上传限制({size}),请将文件通过 scp 的方式上传到安装目录下的 data/upload 目录", - "noHttp": "配置文件中的 address 不支持携带 http 协议,请去除 http(s)://", - "addressMatch": "配置文件中的 address 字段必须包含当前登录的 Graph 地址。多个地址用“,”隔开。", - "dataSourceFile": "文件源", - "vidColumn": "VID 列", - "srcVidColumn": "起点 VID 列", - "dstVidColumn": "终点 VID 列", - "vidFunction": "VID 函数", - "vidPrefix": "VID 前缀", - "vidSuffix": "VID 后缀", - "concurrencyTip": `${window.gConfig.databaseName} 客户端并发数`, - "batchSizeTip": "单批次插入数据的语句数量", - "retryTip": "nGQL 语句执行失败的重试次数", - "vidFunctionTip": "生成 VID 的函数。目前只支持 hash 函数", - "vidPrefixTip": "给原始 VID 添加的前缀", - "vidSuffixTip": "给原始 VID 添加的后缀", - "selectCsvColumn": "选择 CSV 列", - "graphAddress": "Graph 服务地址", - "concurrency": "并发数", - "retry": "重试次数", - "graphAddressTip": "Graph 服务的地址和端口。将使用以下 Graph 节点进行数据导入", - "currentHost": "当前登录的 Graph 节点", - "expandMoreConfig": "展开更多配置", - "pickUpConfig": "收起配置", - "tagRequired": "请添加标签", - "edgeRequired": "请添加边类型", - "tagFileRequired": "请添加标签导入文件源", - "edgeFileRequired": "请添加边类型导入文件源", - "tagFileSelect": "请选择标签导入文件源", - "edgeFileSelect": "请选择边类型导入文件源", - "configDisplay": "配置展示", - "loadToTag": "导入文件 {file} 到标签 {name}", - "loadToEdge": "导入文件 {file} 到边类型 {name}", - "importConfirm": "导入任务确认", - "delimiter": "分隔符", - "previewFiles": "上传文件预览", - "sampleData": "示例数据", - "hasHeader": "携带表头", - "noHeader": "无表头", - "enterDelimiter": "请输入分隔符", - "applicateToAll": "应用到所有文件", - "deleteFiles": "删除选中文件", - "fileRepeatTip": "上述文件已存在,继续上传将覆盖原文件", - "filePreview": "预览文件 {name}", - "uploadConfirm": "上传文件确认", - "localFiles": "本地文件", - "s3": "云存储", - "sftp": "SFTP", - "newDataSource": "新建数据源", - "editDataSource": "编辑数据源", - "deleteDataSource": "删除数据源", - "datasourceList": "{type}列表", - "ipAddress": "IP 地址:端口", - "bucketName": "Bucket 名称", - "accessKeyId": "AccessKeyId", - "region": "区域", - "createTime": "添加日期", - "account": "账号", - "endpoint": "Endpoint", - "accessKeySecret": "AccessKeySecret", - "dataSourceType": "数据源类型", - "selectPlatform": "选择平台", - "enterAddress": "请输入终端节点地址", - "enterRegion": "请输入区域", - "serverAddress": "服务器地址", - "port": "端口", - "newDataSourceTip": "请先添加数据源", - "addNewImport": "添加导入任务", - "addNewImportTip": "添加数据源后,创建导入任务将数据导入数据库", - "start": "开始", - "s3Tip": "只支持兼容Amazon S3接口的云服务", - "readerConcurrency": "读取并发数", - "readerConcurrencyTip": "读取文件的并发数", - "importerConcurrency": "导入并发数", - "importerConcurrencyTip": "导入数据的并发数", - "selectDatasourceFile": "选择数据源文件", - "datasourceType": "数据源类型", - "filePath": "文件路径", - "directory": "目录", - "preview": "预览", - "customize": "自定义", - "s3Platform": "S3 服务提供商", - "endpointTip": "请使用域名中不含 bucket 名称的节点,例如 {sample}", - "awsTip": "https://s3.us-east-2.amazonaws.com", - "ossTip": "https://oss-cn-hangzhou.aliyuncs.com", - "cosTip": "https://cos.ap-shanghai.myqcloud.com", - "customizeTip": "http://127.0.0.1:9000", - "addressRequired": "请在配置文件中输入导入地址", - "usernameRequired": "请在配置文件中输入用户名", - "passwordRequired": "请在配置文件中输入密码", - "s3AccessKeyRequired": "请在配置文件中输入 s3 的 accessKey", - "s3SecretKeyRequired": "请在配置文件中输入 s3 的 secretKey", - "sftpUsernameRequired": "请在配置文件中输入 sftp 的用户名", - "sftpPasswordRequired": "请在配置文件中输入 sftp 的密码", - "ossAccessKeyRequired": "请在配置文件中输入 oss 的 accessKey", - "ossSecretKeyRequired": "请在配置文件中输入 oss 的 secretKey", - "draft": "草稿", - "saveDraft": "保存草稿", - "modifyTime": "编辑时间", - "taskNameRequired": "请填写任务名称并选择图空间", - "fileMissing": "{files} 文件不存在,请重新上传文件或添加相关数据源", - "datasourceMissing": "{files} 所在数据源未找到,请重新添加相关数据源并重新配置任务" + 'import': { + 'uploadFile': '上传文件', + 'dataSourceManagement': '数据源管理', + 'importData': '导入数据', + 'createTask': '创建导入任务', + 'uploadTemp': '导入模板', + 'downloadConfig': '下载配置文件', + 'downloadLog': '下载日志', + 'viewLogs': '查看日志', + 'details': '详情', + 'task': '导入任务', + 'taskList': '任务列表', + 'taskName': '任务名称', + 'tag': '关联标签', + 'edge': '关联边', + 'runImport': '导入', + 'fileName': '文件名', + 'withHeader': '表头', + 'fileSize': '大小', + 'fileTitle': '文件列表', + 'bindDatasource': '添加导入文件', + 'endImport': '终止导入', + 'prop': '属性', + 'mapping': '对应列标', + 'edgeText': '边', + 'choose': '选择', + 'ignore': '忽略', + 'vertexText': '点', + 'indexNotEmpty': '对应列标不能为空', + 'enterPassword': '请输入 database 账号密码以继续', + 'isEmpty': '为空', + 'startImporting': '开始导入', + 'stopImportingSuccess': '已停止导入', + 'deleteSuccess': '已删除任务记录', + 'batchSize': '批处理量', + 'importCompleted': '导入完成', + 'importStopped': '导入中止', + 'importFailed': '导入失败', + 'importRunning': '导入中', + 'importPending': '等待导入', + 'notImported': '{total}条记录未导入', + 'selectFile': '选择绑定文件', + 'addTag': '添加 Tag', + 'addEdge': '添加 Edge Type', + 'selectTag': '选择 Tag', + 'selectEdge': '选择 Edge 类型', + 'config': '任务配置', + 'parseFailed': '文件解析失败', + 'uploadTemplate': '将 YAML 配置文件拖放到该区域', + 'uploadBoxTip': '使用 YAML 配置文件用来描述待导入文件信息、数据库服务器等信息。', + 'fileUploadRequired': '1. 请确保在导入 YAML 文件之前上传所有 CSV 数据文件。 如果没有,请先前往', + 'fileUploadRequired2': '数据文件', + 'exampleDownload': '2. 配置文件示例:', + 'uploadTemplateTip': '3. 配置Yaml文件:模板中所有文件路径(path、logPath)请只保留文件名(保留文件扩展名),例如: 日志路径:config.csv', + 'reUpload': '重新上传', + 'fileNotExist': '文件 {name} 不存在', + 'importYaml': '导入 YAML 文件', + 'templateMatchError': '配置中的用户姓名与当前登录账号不一致', + 'uploadSuccessfully': '上传文件成功', + 'fileSizeLimit': '{name}文件过大,超过上传限制({size}),请将文件通过 scp 的方式上传到安装目录下的 data/upload 目录', + 'noHttp': '配置文件中的 address 不支持携带 http 协议,请去除 http(s)://', + 'addressMatch': '配置文件中的 address 字段必须包含当前登录的 Graph 地址。多个地址用“,”隔开。', + 'dataSourceFile': '文件源', + 'vidColumn': 'VID 列', + 'srcVidColumn': '起点 VID 列', + 'dstVidColumn': '终点 VID 列', + 'vidFunction': 'VID 函数', + 'vidPrefix': 'VID 前缀', + 'vidSuffix': 'VID 后缀', + 'concurrencyTip': `${window.gConfig.databaseName} 客户端并发数`, + 'batchSizeTip': '单批次插入数据的语句数量', + 'retryTip': 'nGQL 语句执行失败的重试次数', + 'vidFunctionTip': '生成 VID 的函数。目前只支持 hash 函数', + 'vidPrefixTip': '给原始 VID 添加的前缀', + 'vidSuffixTip': '给原始 VID 添加的后缀', + 'selectCsvColumn': '选择 CSV 列', + 'graphAddress': 'Graph 服务地址', + 'concurrency': '并发数', + 'retry': '重试次数', + 'graphAddressTip': 'Graph 服务的地址和端口。将使用以下 Graph 节点进行数据导入', + 'currentHost': '当前登录的 Graph 节点', + 'expandMoreConfig': '展开更多配置', + 'pickUpConfig': '收起配置', + 'tagRequired': '请添加标签', + 'edgeRequired': '请添加边类型', + 'tagFileRequired': '请添加标签导入文件源', + 'edgeFileRequired': '请添加边类型导入文件源', + 'tagFileSelect': '请选择标签导入文件源', + 'edgeFileSelect': '请选择边类型导入文件源', + 'configDisplay': '配置展示', + 'loadToTag': '导入文件 {file} 到标签 {name}', + 'loadToEdge': '导入文件 {file} 到边类型 {name}', + 'importConfirm': '导入任务确认', + 'delimiter': '分隔符', + 'previewFiles': '上传文件预览', + 'sampleData': '示例数据', + 'hasHeader': '携带表头', + 'noHeader': '无表头', + 'enterDelimiter': '请输入分隔符', + 'applicateToAll': '应用到所有文件', + 'deleteFiles': '删除选中文件', + 'fileRepeatTip': '上述文件已存在,继续上传将覆盖原文件', + 'filePreview': '预览文件 {name}', + 'uploadConfirm': '上传文件确认', + 'localFiles': '本地文件', + 's3': '云存储', + 'sftp': 'SFTP', + 'newDataSource': '新建数据源', + 'editDataSource': '编辑数据源', + 'deleteDataSource': '删除数据源', + 'datasourceList': '{type}列表', + 'ipAddress': 'IP 地址:端口', + 'bucketName': 'Bucket 名称', + 'accessKeyId': 'AccessKeyId', + 'region': '区域', + 'createTime': '添加日期', + 'account': '账号', + 'endpoint': 'Endpoint', + 'accessKeySecret': 'AccessKeySecret', + 'dataSourceType': '数据源类型', + 'selectPlatform': '选择平台', + 'enterAddress': '请输入终端节点地址', + 'enterRegion': '请输入区域', + 'serverAddress': '服务器地址', + 'port': '端口', + 'newDataSourceTip': '请先添加数据源', + 'addNewImport': '添加导入任务', + 'addNewImportTip': '添加数据源后,创建导入任务将数据导入数据库', + 'start': '开始', + 's3Tip': '只支持兼容Amazon S3接口的云服务', + 'readerConcurrency': '读取并发数', + 'readerConcurrencyTip': '读取文件的并发数', + 'importerConcurrency': '导入并发数', + 'importerConcurrencyTip': '导入数据的并发数', + 'selectDatasourceFile': '选择数据源文件', + 'datasourceType': '数据源类型', + 'filePath': '文件路径', + 'directory': '目录', + 'preview': '预览', + 'customize': '自定义', + 's3Platform': 'S3 服务提供商', + 'endpointTip': '请使用域名中不含 bucket 名称的节点,例如 {sample}', + 'awsTip': 'https://s3.us-east-2.amazonaws.com', + 'ossTip': 'https://oss-cn-hangzhou.aliyuncs.com', + 'cosTip': 'https://cos.ap-shanghai.myqcloud.com', + 'customizeTip': 'http://127.0.0.1:9000', + 'addressRequired': '请在配置文件中输入导入地址', + 'usernameRequired': '请在配置文件中输入用户名', + 'passwordRequired': '请在配置文件中输入密码', + 's3AccessKeyRequired': '请在配置文件中输入 s3 的 accessKeyID', + 's3SecretKeyRequired': '请在配置文件中输入 s3 的 accessKeySecret', + 'sftpUsernameRequired': '请在配置文件中输入 sftp 的用户名', + 'sftpPasswordRequired': '请在配置文件中输入 sftp 的密码', + 'ossAccessKeyRequired': '请在配置文件中输入 oss 的 accessKeyID', + 'ossSecretKeyRequired': '请在配置文件中输入 oss 的 accessKeySecret', + 'draft': '草稿', + 'saveDraft': '保存草稿', + 'modifyTime': '编辑时间', + 'taskNameRequired': '请填写任务名称并选择图空间', + 'fileMissing': '{files} 文件不存在,请重新上传文件或添加相关数据源', + 'datasourceMissing': '{files} 所在数据源未找到,请重新添加相关数据源并重新配置任务' }, - "schema": { - "spaceList": "图空间列表", - "useSpaceErrTip": "图空间未找到。立刻尝试使用刚创建的图空间可能会失败,因为创建是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。", - "createSuccess": "创建成功", - "defineFields": "定义属性", - "uniqProperty": "属性名称不允许重名", - "cancelOperation": "是否取消配置并关闭面板", - "cancelPropmt": "关闭面板将删除所有属性,是否继续?", - "fieldDisabled": "该属性被 ttl_col 引用,不支持更改操作,如要更改,请先更新 ttl", - "indexExist": "已拥有索引,无法同时配置 TTL", - "indexType": "索引类型", - "indexName": "索引名称", - "indexFields": "索引属性", - "associateName": "关联 {type} 名称", - "dragSorting": "(可拖拽排序)", - "selectFields": "请选择关联的属性", - "indexedLength": "请输入索引长度", - "indexedLengthDescription": "设置索引字符串的长度。如果索引定长字符串,则索引长度无法修改。", - "indexedLengthRequired": "索引长度应为正整数", - "rebuild": "重建索引", - "createSpace": "创建图空间", - "No": "序号", - "spaceName": "名称", - "partitionNumber": "Partition Number", - "replicaFactor": "Replica Factor", - "charset": "Charset", - "collate": "Collate", - "vidType": "Vid Type", - "group": "Group", - "comment": "Comment", - "operations": "操作", - "spaceNameEnter": "请输入图空间名称", - "propertyCount": "属性数量", - "configTypeList": "{type}列表", - "configTypeAction": "{action}{type}", - "timestampFormat": "时间类型支持插入方式:
1. 调用函数 now()
2. 调用函数 timestamp(),例如:timestamp('2021-07-05T06:18:43.984000')
3. 直接输入时间戳,即从 1970-01-01 00:00:00 开始的秒数", - "dateFormat": "日期类型支持插入方式:
调用函数 date(),例如:date('2021-03-17')", - "timeFormat": "时间类型支持插入方式:
调用函数 time(),例如time('17:53:59')", - "datetimeFormat": "日期时间类型支持插入方式:
调用函数 datetime(),例如:datetime('2021-03-17T17:53:59')", - "geographyFormat": "geo 类型支持插入方式:
调用函数 ST_GeogFromText(),例如:ST_GeogFromText('POINT(6 10)')", - "geography(point)Format": "geo(point) 类型支持插入方式:
调用函数 ST_GeogFromText('POINT()'),例如:ST_GeogFromText('POINT(6 10)')", - "geography(linestring)Format": "geo(linestring) 类型支持插入方式:
调用函数 ST_GeogFromText('LINESTRING()'),例如:ST_GeogFromText('LINESTRING(3 4,10 50,20 25)')", - "geography(polygon)Format": "geo(polygon) 类型支持插入方式:
调用函数 ST_GeogFromText('POLYGON()'),例如:ST_GeogFromText('POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))')", - "durationFormat": "duration 类型支持插入方式:
调用函数 duration(),例如:duration({years: 1, seconds: 0})", - "setTTL": "设置TTL(存活时间)", - "refresh": "更新", - "startStat": "开始统计", - "statTip": "统计执行时间受数据量影响。", - "lastRefreshTime": "上次更新时间", - "statsType": "维度", - "statsName": "名称", - "statsCount": "数量", - "statError": "统计失败,请重试", - "statFinished": "统计结束", - "deleteSpace": "删除图空间", - "cloneSpace": "克隆图空间", - "length": "长度", - "selectVidTypeTip": "选择 Vid 类型", - "csvDownload": "导出 CSV", - "pngDownload": " 导出 PNG", - "rebuildSuccess": "{names}重建完成", - "rebuildFailed": "{names}重建失败", - "startRebuildIndex": "开始重建索引{name}", - "getSchema": "获取 Schema", - "getSchemaTip": `因为当前 ${window.gConfig.databaseName} 版本下不存在点边的强绑定关系,结果将依据随机捞取到的数据生成,仅供参考。`, - "danglingEdge": "悬挂边", - "showDDL": "查看 Schema DDL", - "downloadNGQL": "下载 .NGQL 文件", - "getDDLError": "获取 Schema DDL 失败, 请重试", - "totalVertices": "总计点数量", - "totalEdges": "总计边数量" + 'schema': { + 'spaceList': '图空间列表', + 'useSpaceErrTip': '图空间未找到。立刻尝试使用刚创建的图空间可能会失败,因为创建是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。', + 'createSuccess': '创建成功', + 'defineFields': '定义属性', + 'uniqProperty': '属性名称不允许重名', + 'cancelOperation': '是否取消配置并关闭面板', + 'cancelPropmt': '关闭面板将删除所有属性,是否继续?', + 'fieldDisabled': '该属性被 ttl_col 引用,不支持更改操作,如要更改,请先更新 ttl', + 'indexExist': '已拥有索引,无法同时配置 TTL', + 'indexType': '索引类型', + 'indexName': '索引名称', + 'indexFields': '索引属性', + 'associateName': '关联 {type} 名称', + 'dragSorting': '(可拖拽排序)', + 'selectFields': '请选择关联的属性', + 'indexedLength': '请输入索引长度', + 'indexedLengthDescription': '设置索引字符串的长度。如果索引定长字符串,则索引长度无法修改。', + 'indexedLengthRequired': '索引长度应为正整数', + 'rebuild': '重建索引', + 'createSpace': '创建图空间', + 'No': '序号', + 'spaceName': '名称', + 'partitionNumber': 'Partition Number', + 'replicaFactor': 'Replica Factor', + 'charset': 'Charset', + 'collate': 'Collate', + 'vidType': 'Vid Type', + 'group': 'Group', + 'comment': 'Comment', + 'operations': '操作', + 'spaceNameEnter': '请输入图空间名称', + 'propertyCount': '属性数量', + 'configTypeList': '{type}列表', + 'configTypeAction': '{action}{type}', + 'timestampFormat': '时间类型支持插入方式:
1. 调用函数 now()
2. 调用函数 timestamp(),例如:timestamp(\'2021-07-05T06:18:43.984000\')
3. 直接输入时间戳,即从 1970-01-01 00:00:00 开始的秒数', + 'dateFormat': '日期类型支持插入方式:
调用函数 date(),例如:date(\'2021-03-17\')', + 'timeFormat': '时间类型支持插入方式:
调用函数 time(),例如time(\'17:53:59\')', + 'datetimeFormat': '日期时间类型支持插入方式:
调用函数 datetime(),例如:datetime(\'2021-03-17T17:53:59\')', + 'geographyFormat': 'geo 类型支持插入方式:
调用函数 ST_GeogFromText(),例如:ST_GeogFromText(\'POINT(6 10)\')', + 'geography(point)Format': 'geo(point) 类型支持插入方式:
调用函数 ST_GeogFromText(\'POINT()\'),例如:ST_GeogFromText(\'POINT(6 10)\')', + 'geography(linestring)Format': 'geo(linestring) 类型支持插入方式:
调用函数 ST_GeogFromText(\'LINESTRING()\'),例如:ST_GeogFromText(\'LINESTRING(3 4,10 50,20 25)\')', + 'geography(polygon)Format': 'geo(polygon) 类型支持插入方式:
调用函数 ST_GeogFromText(\'POLYGON()\'),例如:ST_GeogFromText(\'POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))\')', + 'durationFormat': 'duration 类型支持插入方式:
调用函数 duration(),例如:duration({years: 1, seconds: 0})', + 'setTTL': '设置TTL(存活时间)', + 'refresh': '更新', + 'startStat': '开始统计', + 'statTip': '统计执行时间受数据量影响。', + 'lastRefreshTime': '上次更新时间', + 'statsType': '维度', + 'statsName': '名称', + 'statsCount': '数量', + 'statError': '统计失败,请重试', + 'statFinished': '统计结束', + 'deleteSpace': '删除图空间', + 'cloneSpace': '克隆图空间', + 'length': '长度', + 'selectVidTypeTip': '选择 Vid 类型', + 'csvDownload': '导出 CSV', + 'pngDownload': ' 导出 PNG', + 'rebuildSuccess': '{names}重建完成', + 'rebuildFailed': '{names}重建失败', + 'startRebuildIndex': '开始重建索引{name}', + 'getSchema': '获取 Schema', + 'getSchemaTip': `因为当前 ${window.gConfig.databaseName} 版本下不存在点边的强绑定关系,结果将依据随机捞取到的数据生成,仅供参考。`, + 'danglingEdge': '悬挂边', + 'showDDL': '查看 Schema DDL', + 'downloadNGQL': '下载 .NGQL 文件', + 'getDDLError': '获取 Schema DDL 失败, 请重试', + 'totalVertices': '总计点数量', + 'totalEdges': '总计边数量' }, - "empty": { - "stats": "暂无统计数据", - "statsTip": "请点击按钮开始统计", - "tag": "暂无标签数据", - "tagTip": "请点击按钮创建标签", - "edge": "暂无边类型数据", - "edgeTip": "请点击按钮创建边类型", - "index": "暂无索引数据", - "indexTip": "请点击按钮创建索引" + 'empty': { + 'stats': '暂无统计数据', + 'statsTip': '请点击按钮开始统计', + 'tag': '暂无标签数据', + 'tagTip': '请点击按钮创建标签', + 'edge': '暂无边类型数据', + 'edgeTip': '请点击按钮创建边类型', + 'index': '暂无索引数据', + 'indexTip': '请点击按钮创建索引' }, - "menu": { - "use": "使用手册", - "release": "更新日志", - "forum": "求助论坛", - "nGql": "nGQL", - "feedback": "问题反馈", - "repo": "GitHub项目", - "trial": "企业版试用", - "contact":"联系我们" + 'menu': { + 'use': '使用手册', + 'release': '更新日志', + 'forum': '求助论坛', + 'nGql': 'nGQL', + 'feedback': '问题反馈', + 'repo': 'GitHub项目', + 'trial': '企业版试用', + 'contact': '联系我们' }, - "link": { - "nGQLHref": "https://docs.nebula-graph.com.cn/3.4.0/3.ngql-guide/1.nGQL-overview/1.overview/", - "mannualHref": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/", - "startStudioHref": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/quick-start/st-ug-plan-schema/", - "versionLogHref": "https://docs.nebula-graph.com.cn/3.4.0/20.appendix/release-notes/studio-release-note/", - "forumHref": "https://discuss.nebula-graph.com.cn/", - "feedback": "https://discuss.nebula-graph.com.cn/tag/nebula-studio", - "trial": "https://wj.qq.com/s2/10158890/69a8", - "contact":"https://www.nebula-graph.com.cn/contact", - "loginHref": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/deploy-connect/st-ug-connect/" + 'link': { + 'nGQLHref': 'https://docs.nebula-graph.com.cn/3.5.0/3.ngql-guide/1.nGQL-overview/1.overview/', + 'mannualHref': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/about-studio/st-ug-what-is-graph-studio/', + 'startStudioHref': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/quick-start/st-ug-plan-schema/', + 'versionLogHref': 'https://docs.nebula-graph.com.cn/3.5.0/20.appendix/release-notes/studio-release-note/', + 'forumHref': 'https://discuss.nebula-graph.com.cn/', + 'feedback': 'https://discuss.nebula-graph.com.cn/tag/nebula-studio', + 'trial': 'https://wj.qq.com/s2/10158890/69a8', + 'contact': 'https://www.nebula-graph.com.cn/contact', + 'loginHref': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/deploy-connect/st-ug-connect/' }, - "sketch": { - "dragTip": "拖放到画布上", - "tag": "标签", - "edge": "边类型", - "name": "{name}名称", - "detail": "{name}详情", - "comment": "描述", - "properties": "属性", - "propertyName": "属性名称", - "dataType": "数据类型", - "addProperty": "添加属性", - "type": "类型", - "list": "草图列表", - "new": "新建", - "applyToSpace": "应用到图空间", - "createSpace": "创建图空间", - "selectSpace": "选择图空间", - "noCurrentSketch": "当前没有选中草图", - "noCurrentSketchTips": "请在左侧列表中选择草图", - "sketchInvalid": "请完善当前 Schema 信息。", - "saveSuccess": "保存成功", - "saveReminder": "当前草图有修改未保存,是否继续切换草图?", - "saveTip": "当前草图有修改未保存, 请先保存。", - "confirmDelete": "请确认是否删除", - "saveDraft": "保存草稿", - "export": "导出", - "applySpaceTip": "新的 schema 不会覆盖图空间中已有的 schema 信息", - "sameSchemaWarning": "图空间中已存在{content},请修改{hasType}名称,或者选择其他图空间。", - "noData": "暂无数据,请先导入数据", - "uniqName": "标签和边类型名称不允许重名", - "spaceExisted": "图空间已存在", - "updateNameSuccess": "更新名称成功", - "search": "搜索草图名称" + 'sketch': { + 'dragTip': '拖放到画布上', + 'tag': '标签', + 'edge': '边类型', + 'name': '{name}名称', + 'detail': '{name}详情', + 'comment': '描述', + 'properties': '属性', + 'propertyName': '属性名称', + 'dataType': '数据类型', + 'addProperty': '添加属性', + 'type': '类型', + 'list': '草图列表', + 'new': '新建', + 'applyToSpace': '应用到图空间', + 'createSpace': '创建图空间', + 'selectSpace': '选择图空间', + 'noCurrentSketch': '当前没有选中草图', + 'noCurrentSketchTips': '请在左侧列表中选择草图', + 'sketchInvalid': '请完善当前 Schema 信息。', + 'saveSuccess': '保存成功', + 'saveReminder': '当前草图有修改未保存,是否继续切换草图?', + 'saveTip': '当前草图有修改未保存, 请先保存。', + 'confirmDelete': '请确认是否删除', + 'saveDraft': '保存草稿', + 'export': '导出', + 'applySpaceTip': '新的 schema 不会覆盖图空间中已有的 schema 信息', + 'sameSchemaWarning': '图空间中已存在{content},请修改{hasType}名称,或者选择其他图空间。', + 'noData': '暂无数据,请先导入数据', + 'uniqName': '标签和边类型名称不允许重名', + 'spaceExisted': '图空间已存在', + 'updateNameSuccess': '更新名称成功', + 'search': '搜索草图名称' }, - "welcome": { - "doc": "文档", - "guide": "新手引导", - "quickStart": "开始", - "quickStartDesc": "文档", - "demos": "示例", - "starterDatasets": "入门数据集", - "solutionDatasets": "行业数据集", - "demoDownload": "下载", - "demoDownloading": "下载中", - "demoIntro": "Demo 介绍", - "loadWaiting": "数据加载中,请稍等...预计将在 {second}s 后结束", - "downloadSuccess": "数据集 `{space}` 下载成功", - "spaceExist": "图空间 `{space}` 已存在", - "schemaModuleLink": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/quick-start/st-ug-create-schema/", - "importModuleLink": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/quick-start/st-ug-import-data/", - "consoleModuleLink": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/quick-start/st-ug-console/", - "sketchModuleLink": "https://docs.nebula-graph.com.cn/3.4.0/nebula-studio/quick-start/draft/", - "basketballplayerDocLink": "https://nebula-graph.com.cn/posts/playground-basketball-player", - "shareholdingDocLink": "https://nebula-graph.com.cn/demo/shared-holding", - "openstackDocLink": "https://www.siwei.io/graph-enabled-infra-ops", - "snsDocLink": "https://www.siwei.io/nebulagraph-sns/", - "datalineageDocLink": "https://www.siwei.io/data-lineage-oss-ref-solution/", - "movieDocLink": "https://www.siwei.io/recommendation-system-with-graphdb/", - "idMappingDocLink": "https://www.siwei.io/identity-resolution/", - "fraudDetectionDocLink": "https://www.siwei.io/fraud-detection-with-nebulagraph/", - "fifa2022DocLink": "https://www.siwei.io/chatgpt-and-nebulagraph-predict-fifa-world-cup/", - "alwaysShow": "始终展示欢迎页", - "progressTitle": "下载 & 导入数据" + 'welcome': { + 'doc': '文档', + 'guide': '新手引导', + 'quickStart': '开始', + 'quickStartDesc': '文档', + 'demos': '示例', + 'starterDatasets': '入门数据集', + 'solutionDatasets': '行业数据集', + 'demoDownload': '下载', + 'demoDownloading': '下载中', + 'demoIntro': 'Demo 介绍', + 'loadWaiting': '数据加载中,请稍等...预计将在 {second}s 后结束', + 'downloadSuccess': '数据集 `{space}` 下载成功', + 'spaceExist': '图空间 `{space}` 已存在', + 'schemaModuleLink': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/quick-start/st-ug-create-schema/', + 'importModuleLink': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/quick-start/st-ug-import-data/', + 'consoleModuleLink': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/quick-start/st-ug-console/', + 'sketchModuleLink': 'https://docs.nebula-graph.com.cn/3.5.0/nebula-studio/quick-start/draft/', + 'basketballplayerDocLink': 'https://nebula-graph.com.cn/posts/playground-basketball-player', + 'shareholdingDocLink': 'https://nebula-graph.com.cn/demo/shared-holding', + 'openstackDocLink': 'https://www.siwei.io/graph-enabled-infra-ops', + 'snsDocLink': 'https://www.siwei.io/nebulagraph-sns/', + 'datalineageDocLink': 'https://www.siwei.io/data-lineage-oss-ref-solution/', + 'movieDocLink': 'https://www.siwei.io/recommendation-system-with-graphdb/', + 'idMappingDocLink': 'https://www.siwei.io/identity-resolution/', + 'fraudDetectionDocLink': 'https://www.siwei.io/fraud-detection-with-nebulagraph/', + 'fifa2022DocLink': 'https://www.siwei.io/chatgpt-and-nebulagraph-predict-fifa-world-cup/', + 'alwaysShow': '始终展示欢迎页', + 'progressTitle': '下载 & 导入数据' } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/app/interfaces/datasource.ts b/app/interfaces/datasource.ts index 4a38c681..18341c3d 100644 --- a/app/interfaces/datasource.ts +++ b/app/interfaces/datasource.ts @@ -20,7 +20,7 @@ export interface IDatasourceItem { platform?: string; createTime: string; s3Config?: { - accessKey: string; + accessKeyID: string; accessSecret?: string; endpoint: string; bucket: string; diff --git a/app/interfaces/import.ts b/app/interfaces/import.ts index 45ef6730..3cddb9d2 100644 --- a/app/interfaces/import.ts +++ b/app/interfaces/import.ts @@ -62,7 +62,7 @@ export interface IImportFile { export interface IS3Config { region: string; endpoint: string; - accessKey: string; + accessKeyID: string; accessSecret: string; bucket: string; token?: string; diff --git a/app/pages/Import/DatasourceList/DatasourceConfig/PlatformConfig/S3ConfigForm.tsx b/app/pages/Import/DatasourceList/DatasourceConfig/PlatformConfig/S3ConfigForm.tsx index 06af611c..5e47169a 100644 --- a/app/pages/Import/DatasourceList/DatasourceConfig/PlatformConfig/S3ConfigForm.tsx +++ b/app/pages/Import/DatasourceList/DatasourceConfig/PlatformConfig/S3ConfigForm.tsx @@ -61,7 +61,7 @@ const S3ConfigForm = (props: IProps) => { - + diff --git a/app/pages/Import/DatasourceList/RemoteList/index.tsx b/app/pages/Import/DatasourceList/RemoteList/index.tsx index c8001e59..5732084c 100644 --- a/app/pages/Import/DatasourceList/RemoteList/index.tsx +++ b/app/pages/Import/DatasourceList/RemoteList/index.tsx @@ -26,7 +26,7 @@ const s3Columns: TableColumnType[] = [ }, { title: {(i) => i.get('import.accessKeyId')}, - dataIndex: ['s3Config', 'accessKey'], + dataIndex: ['s3Config', 'accessKeyID'], }, { title: {(i) => i.get('import.region')}, diff --git a/app/pages/Import/TaskList/TemplateModal/index.tsx b/app/pages/Import/TaskList/TemplateModal/index.tsx index c0529637..93539a2e 100644 --- a/app/pages/Import/TaskList/TemplateModal/index.tsx +++ b/app/pages/Import/TaskList/TemplateModal/index.tsx @@ -97,9 +97,9 @@ const TemplateModal = (props: IProps) => { } }, [currentLocale, username]); const validatePassword = useCallback((client) => validateEmpty('password', client.password), []); - const validateS3 = useCallback((s3) => validateEmpty('s3AccessKey', s3.accessKey) || validateEmpty('s3SecretKey', s3.secretKey), []); + const validateS3 = useCallback((s3) => validateEmpty('s3AccessKey', s3.accessKeyID) || validateEmpty('s3SecretKey', s3.accessKeySecret), []); const validateSftp = useCallback((sftp) => validateEmpty('sftpUsername', sftp.user) || validateEmpty('sftpPassword', sftp.password), []); - const validateOSS = useCallback((oss) => validateEmpty('ossAccessKey', oss.accessKey) || validateEmpty('ossSecretKey', oss.secretKey), []); + const validateOSS = useCallback((oss) => validateEmpty('ossAccessKey', oss.accessKeyID) || validateEmpty('ossSecretKey', oss.accessKeySecret), []); const validateClient = useCallback((content) => { const client = content.client || {}; return validateAddress(client) || validateUser(client) || validatePassword(client); diff --git a/app/stores/global.ts b/app/stores/global.ts index b26588a5..99c45314 100644 --- a/app/stores/global.ts +++ b/app/stores/global.ts @@ -33,6 +33,7 @@ export class GlobalStore { ngqlRunner: observable.ref, update: action, }); + this.ngqlRunner.logoutFun = this.logout; } get rootStore() { diff --git a/app/utils/websocket.ts b/app/utils/websocket.ts index 21c5e18e..4bd47748 100644 --- a/app/utils/websocket.ts +++ b/app/utils/websocket.ts @@ -135,7 +135,7 @@ export class NgqlRunner { this.socket = socket; this.socketUrl = url; this.socketProtocols = protocols; - this.logoutFun = logoutFun; + logoutFun && (this.logoutFun = logoutFun); localStorage.setItem('socketUrl', JSON.stringify(url)); protocols && localStorage.setItem('socketProtocols', JSON.stringify(protocols)); @@ -181,6 +181,7 @@ export class NgqlRunner { const msgReceive = safeParse>(e.data, { paser: JSONBigint.parse }); if (msgReceive?.body?.content?.code === HttpResCode.ErrSession) { + msgReceive?.body?.content?.message && message.error(msgReceive.body.content.message); this.logoutFun?.(); return; } diff --git a/server/api/studio/internal/service/datasource.go b/server/api/studio/internal/service/datasource.go index 2ec7456e..d7fbb9d1 100644 --- a/server/api/studio/internal/service/datasource.go +++ b/server/api/studio/internal/service/datasource.go @@ -89,7 +89,7 @@ func (d *datasourceService) Update(request types.DatasourceUpdateRequest) error s3Config.AccessSecret = dbs.Secret } cfg = &types.DatasourceS3Config{ - AccessKey: s3Config.AccessKey, + AccessKeyID: s3Config.AccessKeyID, AccessSecret: s3Config.AccessSecret, Endpoint: s3Config.Endpoint, Bucket: s3Config.Bucket, @@ -384,7 +384,7 @@ func validateSftp(cfg *types.DatasourceSFTPConfig) error { } func validateS3(platform string, cfg *types.DatasourceS3Config) error { - _, err := filestore.NewS3Store(platform, cfg.Endpoint, cfg.Region, cfg.Bucket, cfg.AccessKey, cfg.AccessSecret) + _, err := filestore.NewS3Store(platform, cfg.Endpoint, cfg.Region, cfg.Bucket, cfg.AccessKeyID, cfg.AccessSecret) if err != nil { return fmt.Errorf("connect the s3 client error: %s", err) } diff --git a/server/api/studio/internal/service/import.go b/server/api/studio/internal/service/import.go index b7d1ec49..d180e24b 100644 --- a/server/api/studio/internal/service/import.go +++ b/server/api/studio/internal/service/import.go @@ -100,28 +100,28 @@ func (i *importService) updateDatasourceConfig(conf *types.CreateImportTaskReque // endpoint is not required in importer aws config // some format of endpoint will cause error, for example: https://s3.amazonaws.com source.S3 = &types.S3Config{ - AccessKey: cfg.AccessKey, - SecretKey: string(secret), - Bucket: cfg.Bucket, - Region: cfg.Region, - Key: *source.DatasourceFilePath, + AccessKeyID: cfg.AccessKeyID, + AccessKeySecret: string(secret), + Bucket: cfg.Bucket, + Region: cfg.Region, + Key: *source.DatasourceFilePath, } case "oss": source.OSS = &types.OSSConfig{ - AccessKey: cfg.AccessKey, - SecretKey: string(secret), - Bucket: cfg.Bucket, - Endpoint: cfg.Endpoint, - Key: *source.DatasourceFilePath, + AccessKeyID: cfg.AccessKeyID, + AccessKeySecret: string(secret), + Bucket: cfg.Bucket, + Endpoint: cfg.Endpoint, + Key: *source.DatasourceFilePath, } case "cos", "customize": source.S3 = &types.S3Config{ - AccessKey: cfg.AccessKey, - SecretKey: string(secret), - Bucket: cfg.Bucket, - Region: cfg.Region, - Endpoint: cfg.Endpoint, - Key: *source.DatasourceFilePath, + AccessKeyID: cfg.AccessKeyID, + AccessKeySecret: string(secret), + Bucket: cfg.Bucket, + Region: cfg.Region, + Endpoint: cfg.Endpoint, + Key: *source.DatasourceFilePath, } if cfg.Region == "" { source.S3.Region = "us-east-1" diff --git a/server/api/studio/internal/service/importer/taskmgr.go b/server/api/studio/internal/service/importer/taskmgr.go index f022498e..7497778e 100644 --- a/server/api/studio/internal/service/importer/taskmgr.go +++ b/server/api/studio/internal/service/importer/taskmgr.go @@ -68,16 +68,16 @@ func CreateConfigFile(taskdir string, cfgBytes []byte) error { SFTPConfig := source.SourceConfig.SFTP OSSConfig := source.SourceConfig.OSS if S3Config != nil { - S3Config.AccessKey = "${YOUR_S3_ACCESS_KEY}" - S3Config.SecretKey = "${YOUR_S3_SECRET_KEY}" + S3Config.AccessKeyID = "${YOUR_S3_ACCESS_KEY}" + S3Config.AccessKeySecret = "${YOUR_S3_SECRET_KEY}" } if SFTPConfig != nil { SFTPConfig.User = "${YOUR_SFTP_USER}" SFTPConfig.Password = "${YOUR_SFTP_PASSWORD}" } if OSSConfig != nil { - OSSConfig.AccessKey = "${YOUR_OSS_ACCESS_KEY}" - OSSConfig.SecretKey = "${YOUR_OSS_SECRET_KEY}" + OSSConfig.AccessKeyID = "${YOUR_OSS_ACCESS_KEY}" + OSSConfig.AccessKeySecret = "${YOUR_OSS_SECRET_KEY}" } } outYaml, err := yaml.Marshal(confv3) diff --git a/server/api/studio/internal/types/types.go b/server/api/studio/internal/types/types.go index 1d348760..86add8e7 100644 --- a/server/api/studio/internal/types/types.go +++ b/server/api/studio/internal/types/types.go @@ -97,13 +97,13 @@ type EdgeRank struct { } type S3Config struct { - Endpoint string `json:"endpoint,optional,omitempty"` - Region string `json:"region,omitempty"` - AccessKey string `json:"accessKey,omitempty"` - SecretKey string `json:"secretKey,omitempty"` - Token string `json:"token,optional,omitempty"` - Bucket string `json:"bucket,omitempty"` - Key string `json:"key,omitempty"` + Endpoint string `json:"endpoint,optional,omitempty"` + Region string `json:"region,omitempty"` + AccessKeyID string `json:"accessKeyID,omitempty"` + AccessKeySecret string `json:"accessKeySecret,omitempty"` + Token string `json:"token,optional,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` } type SFTPConfig struct { @@ -118,11 +118,11 @@ type SFTPConfig struct { } type OSSConfig struct { - Endpoint string `json:"endpoint,omitempty"` - AccessKey string `json:"accessKey,omitempty"` - SecretKey string `json:"secretKey,omitempty"` - Bucket string `json:"bucket,omitempty"` - Key string `json:"key,omitempty"` + Endpoint string `json:"endpoint,omitempty"` + AccessKeyID string `json:"accessKeyID,omitempty"` + AccessKeySecret string `json:"accessKeySecret,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` } type LocalConfig struct { @@ -366,7 +366,7 @@ type DatasourceS3Config struct { Endpoint string `json:"endpoint"` Region string `json:"region,optional"` Bucket string `json:"bucket"` - AccessKey string `json:"accessKey"` + AccessKeyID string `json:"accessKeyID"` AccessSecret string `json:"accessSecret,optional"` } @@ -381,7 +381,7 @@ type DatasourceS3UpdateConfig struct { Endpoint string `json:"endpoint,optional,omitempty"` Region string `json:"region,optional,omitempty"` Bucket string `json:"bucket,optional,omitempty"` - AccessKey string `json:"accessKey,optional,omitempty"` + AccessKeyID string `json:"accessKeyID,optional,omitempty"` AccessSecret string `json:"accessSecret,optional,omitempty"` } diff --git a/server/api/studio/pkg/filestore/filestore.go b/server/api/studio/pkg/filestore/filestore.go index 4f0d9ba6..78f6a565 100644 --- a/server/api/studio/pkg/filestore/filestore.go +++ b/server/api/studio/pkg/filestore/filestore.go @@ -29,7 +29,7 @@ type ( Endpoint string Region string Bucket string - AccessKey string + AccessKeyID string AccessSecret string } ) @@ -41,7 +41,7 @@ func NewFileStore(typ, config, secret, platform string) (FileStore, error) { if err := json.Unmarshal([]byte(config), &c); err != nil { return nil, errors.New("parse the s3 config error") } - return NewS3Store(platform, c.Endpoint, c.Region, c.Bucket, c.AccessKey, secret) + return NewS3Store(platform, c.Endpoint, c.Region, c.Bucket, c.AccessKeyID, secret) case "sftp": var c SftpConfig if err := json.Unmarshal([]byte(config), &c); err != nil { diff --git a/server/api/studio/pkg/filestore/filestore_test.go b/server/api/studio/pkg/filestore/filestore_test.go index 938f52ca..56b7342d 100644 --- a/server/api/studio/pkg/filestore/filestore_test.go +++ b/server/api/studio/pkg/filestore/filestore_test.go @@ -9,7 +9,7 @@ func TestS3Store(t *testing.T) { s3Config := map[string]string{ "endpoint": "s3.us-east-1.amazonaws.com", "region": "us-east-1", - "accessKey": "", + "accessKeyID": "", "accessSecret": "", } bytes, _ := json.Marshal(s3Config) diff --git a/server/api/studio/pkg/filestore/s3store.go b/server/api/studio/pkg/filestore/s3store.go index 5bddbb7c..2e780f1d 100644 --- a/server/api/studio/pkg/filestore/s3store.go +++ b/server/api/studio/pkg/filestore/s3store.go @@ -20,10 +20,10 @@ type S3Store struct { Bucket string } -func NewS3Store(platform, endpoint, region, bucket, accessKey, accessSecret string) (*S3Store, error) { +func NewS3Store(platform, endpoint, region, bucket, accessKeyID, accessSecret string) (*S3Store, error) { cfg := &aws.Config{ Region: aws.String(region), - Credentials: credentials.NewStaticCredentials(accessKey, accessSecret, ""), + Credentials: credentials.NewStaticCredentials(accessKeyID, accessSecret, ""), } switch platform { case "oss": diff --git a/server/api/studio/restapi/datasource.api b/server/api/studio/restapi/datasource.api index a84713cf..208c1d5b 100644 --- a/server/api/studio/restapi/datasource.api +++ b/server/api/studio/restapi/datasource.api @@ -5,7 +5,7 @@ type ( Endpoint string `json:"endpoint"` Region string `json:"region,optional"` Bucket string `json:"bucket"` - AccessKey string `json:"accessKey"` + AccessKeyID string `json:"accessKeyID"` AccessSecret string `json:"accessSecret,optional"` } @@ -19,7 +19,7 @@ type ( Endpoint string `json:"endpoint,optional,omitempty"` Region string `json:"region,optional,omitempty"` Bucket string `json:"bucket,optional,omitempty"` - AccessKey string `json:"accessKey,optional,omitempty"` + AccessKeyID string `json:"accessKeyID,optional,omitempty"` AccessSecret string `json:"accessSecret,optional,omitempty"` } diff --git a/server/api/studio/restapi/import.api b/server/api/studio/restapi/import.api index ad9f760c..40fa476e 100644 --- a/server/api/studio/restapi/import.api +++ b/server/api/studio/restapi/import.api @@ -49,13 +49,13 @@ type ( } S3Config { - Endpoint string `json:"endpoint,optional,omitempty"` - Region string `json:"region,omitempty"` - AccessKey string `json:"accessKey,omitempty"` - SecretKey string `json:"secretKey,omitempty"` - Token string `json:"token,optional,omitempty"` - Bucket string `json:"bucket,omitempty"` - Key string `json:"key,omitempty"` + Endpoint string `json:"endpoint,optional,omitempty"` + Region string `json:"region,omitempty"` + AccessKeyID string `json:"accessKeyID,omitempty"` + AccessKeySecret string `json:"accessKeySecret,omitempty"` + Token string `json:"token,optional,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` } SFTPConfig { @@ -70,11 +70,11 @@ type ( } OSSConfig { - Endpoint string `json:"endpoint,omitempty"` - AccessKey string `json:"accessKey,omitempty"` - SecretKey string `json:"secretKey,omitempty"` - Bucket string `json:"bucket,omitempty"` - Key string `json:"key,omitempty"` + Endpoint string `json:"endpoint,omitempty"` + AccessKeyID string `json:"accessKeyID,omitempty"` + AccessKeySecret string `json:"accessKeySecret,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` } LocalConfig { diff --git a/server/go.mod b/server/go.mod index 4d9f5052..c6e34dcc 100644 --- a/server/go.mod +++ b/server/go.mod @@ -7,7 +7,7 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b github.com/vesoft-inc/go-pkg v0.0.0-20230307111816-a43d6a342d23 - github.com/vesoft-inc/nebula-importer/v4 v4.0.0-20230302074940-d97c824a6225 + github.com/vesoft-inc/nebula-importer/v4 v4.0.0 github.com/zeromicro/go-zero v1.3.3 ) @@ -16,7 +16,7 @@ require ( github.com/aws/aws-sdk-go v1.44.217 github.com/pkg/sftp v1.13.5 github.com/stretchr/testify v1.8.0 - github.com/vesoft-inc/nebula-go/v3 v3.4.0 + github.com/vesoft-inc/nebula-go/v3 v3.5.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -54,8 +54,6 @@ require ( golang.org/x/time v0.3.0 // indirect ) -replace github.com/vesoft-inc/nebula-importer/v4 => github.com/veezhang/nebula-importer/v4 v4.0.0-20230327073838-1faf638e9c88 - require ( github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/beorn7/perks v1.0.1 // indirect @@ -88,9 +86,9 @@ require ( go.uber.org/automaxprocs v1.4.0 // indirect go.uber.org/zap v1.23.0 golang.org/x/crypto v0.5.0 - golang.org/x/net v0.5.0 // indirect - golang.org/x/sys v0.4.0 // indirect - golang.org/x/text v0.6.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect google.golang.org/grpc v1.46.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/server/go.sum b/server/go.sum index 8fbe87a4..3c76f7aa 100644 --- a/server/go.sum +++ b/server/go.sum @@ -451,12 +451,14 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/veezhang/nebula-importer/v4 v4.0.0-20230327073838-1faf638e9c88 h1:Su4WPEFm+vwWpj0Kx6GUNt/Rek7IzzbuR3XyJdsBUKo= -github.com/veezhang/nebula-importer/v4 v4.0.0-20230327073838-1faf638e9c88/go.mod h1:6Z0GAlZdHWMQCyLkq377Li6ibIHkcwkzmBTEwIorAoU= github.com/vesoft-inc/go-pkg v0.0.0-20230307111816-a43d6a342d23 h1:uiuSGlc1MTuEOy+VKBFxXA8WayxXeGigh6DT0On5r/I= github.com/vesoft-inc/go-pkg v0.0.0-20230307111816-a43d6a342d23/go.mod h1:HCAXRhF2io+nPLQnl+RQ6XyVcp1Xdv6NgslXRBBCiEU= -github.com/vesoft-inc/nebula-go/v3 v3.4.0 h1:7q2DSW4QABwI2oGPSVuC+Ql7kGwj26G/YVPGD7gETys= -github.com/vesoft-inc/nebula-go/v3 v3.4.0/go.mod h1:+sXv05jYQBARdTbTcIEsWVXCnF/6ttOlDK35xQ6m54s= +github.com/vesoft-inc/nebula-go/v3 v3.5.0 h1:2ZSkoBxtIfs15AXJXqrAPDPd0Z9HrzKR7YKXPqlJcR0= +github.com/vesoft-inc/nebula-go/v3 v3.5.0/go.mod h1:+sXv05jYQBARdTbTcIEsWVXCnF/6ttOlDK35xQ6m54s= +github.com/vesoft-inc/nebula-importer/v4 v4.0.0-alpha.1 h1:lZ29IUlZrE+hWwMi4VWFadgDFNPY7k724DlsecgNn6Y= +github.com/vesoft-inc/nebula-importer/v4 v4.0.0-alpha.1/go.mod h1:r7yAWjK9hXfPbPYk0jSFwK2UTUcwA/uqbcaEGp4AP8o= +github.com/vesoft-inc/nebula-importer/v4 v4.0.0 h1:7BuYynDNf/Vrg34ka/ctGbKlT7INgZgk38ULSWVbPHE= +github.com/vesoft-inc/nebula-importer/v4 v4.0.0/go.mod h1:r7yAWjK9hXfPbPYk0jSFwK2UTUcwA/uqbcaEGp4AP8o= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= @@ -596,8 +598,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220421235706-1d1ef9303861/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -675,13 +677,13 @@ golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -691,8 +693,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=