diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 196d00d69..9d9a0f1d5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -85,3 +85,11 @@ Follow these steps to update a locale for the SAS Extension for VSCode: - Update any untranslated strings. - Verify your changes using `Launch Client`. - After you've verified changes, you can create a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) for review. + +### Locale contributors + +| Language | VSCode Language ID | Contributor | +| ------------------------ | ------------------ | ----------- | +| **German** | de | David Weik | +| **Chinese (Simplified)** | zh-cn | Wei Wu | +| **Portuguese (Brazil)** | pt-br | Mark Jordan | diff --git a/client/src/components/ContentNavigator/ContentDataProvider.ts b/client/src/components/ContentNavigator/ContentDataProvider.ts index de37be914..70b2742db 100644 --- a/client/src/components/ContentNavigator/ContentDataProvider.ts +++ b/client/src/components/ContentNavigator/ContentDataProvider.ts @@ -1,19 +1,23 @@ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { + CancellationToken, DataTransfer, DataTransferItem, Disposable, + DocumentDropEdit, Event, EventEmitter, FileChangeEvent, FileStat, FileSystemProvider, FileType, + Position, ProviderResult, Tab, TabInputNotebook, TabInputText, + TextDocument, TextDocumentContentProvider, ThemeIcon, TreeDataProvider, @@ -24,6 +28,7 @@ import { Uri, commands, l10n, + languages, window, } from "vscode"; @@ -45,6 +50,7 @@ import { convertNotebookToFlow } from "./convert"; import { ContentItem } from "./types"; import { getCreationDate, + getFileStatement, getId, isContainer as getIsContainer, getLabel, @@ -71,6 +77,7 @@ class ContentDataProvider private _onDidChangeTreeData: EventEmitter; private _onDidChange: EventEmitter; private _treeView: TreeView; + private _dropEditProvider: Disposable; private readonly model: ContentModel; private extensionUri: Uri; @@ -93,6 +100,10 @@ class ContentDataProvider dragAndDropController: this, canSelectMany: true, }); + this._dropEditProvider = languages.registerDocumentDropEditProvider( + { language: "sas" }, + this, + ); this._treeView.onDidChangeVisibility(async () => { if (this._treeView.visible) { @@ -140,8 +151,35 @@ class ContentDataProvider dataTransfer.set(this.dragMimeTypes[0], dataTransferItem); } + public async provideDocumentDropEdits( + document: TextDocument, + position: Position, + dataTransfer: DataTransfer, + token: CancellationToken, + ): Promise { + const dataTransferItem = dataTransfer.get(this.dragMimeTypes[0]); + const contentItem = + dataTransferItem && JSON.parse(dataTransferItem.value)[0]; + if (token.isCancellationRequested || !contentItem) { + return undefined; + } + + const fileFolderPath = await this.model.getFileFolderPath(contentItem); + if (!fileFolderPath) { + return undefined; + } + + return { + insertText: getFileStatement( + contentItem.name, + document.getText(), + fileFolderPath, + ), + }; + } + public getSubscriptions(): Disposable[] { - return [this._treeView]; + return [this._treeView, this._dropEditProvider]; } get onDidChangeFile(): Event { diff --git a/client/src/components/ContentNavigator/ContentModel.ts b/client/src/components/ContentNavigator/ContentModel.ts index 2c63ecbd8..60987bbfd 100644 --- a/client/src/components/ContentNavigator/ContentModel.ts +++ b/client/src/components/ContentNavigator/ContentModel.ts @@ -640,6 +640,30 @@ export class ContentModel { } return "unknown"; } + + public async getFileFolderPath(contentItem: ContentItem): Promise { + if (isContainer(contentItem)) { + return ""; + } + + const filePathParts = []; + let currentContentItem: Pick = + contentItem; + do { + try { + const { data: parentData } = await this.connection.get( + currentContentItem.parentFolderUri, + ); + currentContentItem = parentData; + } catch (e) { + return ""; + } + + filePathParts.push(currentContentItem.name); + } while (currentContentItem.parentFolderUri); + + return "/" + filePathParts.reverse().join("/"); + } } const getPermission = (item: ContentItem): Permission => { diff --git a/client/src/components/ContentNavigator/utils.ts b/client/src/components/ContentNavigator/utils.ts index f7c1ba6e2..13ad5e835 100644 --- a/client/src/components/ContentNavigator/utils.ts +++ b/client/src/components/ContentNavigator/utils.ts @@ -1,6 +1,6 @@ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import { Uri } from "vscode"; +import { SnippetString, Uri } from "vscode"; import { FILE_TYPE, @@ -111,3 +111,27 @@ export const isItemInRecycleBin = (item: ContentItem): boolean => !!item && item.flags?.isInRecycleBin; export const isContentItem = (item): item is ContentItem => isValidItem(item); + +// A document uses uppercase letters _if_ are no words +// (where word means gte 3 characters) that are lowercase. +const documentUsesUppercase = (documentContent: string) => + documentContent && + !documentContent + // Exclude anything in quotes from our calculations + .replace(/('|")([^('|")]*)('|")/g, "") + .match(/([a-z]{3,})\S/g); + +export const getFileStatement = ( + contentItemName: string, + documentContent: string, + fileFolderPath: string, +): SnippetString => { + const usesUppercase = documentUsesUppercase(documentContent); + const cmd = "filename ${1:fileref} filesrvc folderpath='$1' filename='$2';\n"; + + return new SnippetString( + (usesUppercase ? cmd.toUpperCase() : cmd) + .replace("$1", fileFolderPath.replace(/'/g, "''")) + .replace("$2", contentItemName.replace(/'/g, "''")), + ); +}; diff --git a/client/test/components/ContentNavigator/ContentDataProvider.test.ts b/client/test/components/ContentNavigator/ContentDataProvider.test.ts index 3608eef37..9b6214585 100644 --- a/client/test/components/ContentNavigator/ContentDataProvider.test.ts +++ b/client/test/components/ContentNavigator/ContentDataProvider.test.ts @@ -722,8 +722,6 @@ describe("ContentDataProvider", async function () { const dataTransferItem = new DataTransferItem(uri); dataTransfer.set("text/uri-list", dataTransferItem); - console.log("this bithc"); - stub.returns(new Promise((resolve) => resolve(item))); await dataProvider.handleDrop(parentItem, dataTransfer); @@ -889,4 +887,67 @@ describe("ContentDataProvider", async function () { expect(stub.calledWith(item, getLink(parentItem.links, "GET", "self")?.uri)) .to.be.true; }); + + it("getFileFolderPath - returns empty path for folder", async function () { + const item = mockContentItem({ + type: "folder", + name: "folder", + }); + + const model = new ContentModel(); + const dataProvider = new ContentDataProvider( + model, + Uri.from({ scheme: "http" }), + ); + + await dataProvider.connect("http://test.io"); + const path = await model.getFileFolderPath(item); + + expect(path).to.equal(""); + }); + + it("getFileFolderPath - traverses parentFolderUri to find path", async function () { + const grandparent = mockContentItem({ + type: "folder", + name: "grandparent", + id: "/id/grandparent", + }); + const parent = mockContentItem({ + type: "folder", + name: "parent", + id: "/id/parent", + parentFolderUri: "/id/grandparent", + }); + const item = mockContentItem({ + type: "file", + name: "file.sas", + parentFolderUri: "/id/parent", + }); + const item2 = mockContentItem({ + type: "file", + name: "file2.sas", + parentFolderUri: "/id/parent", + }); + + const model = new ContentModel(); + const dataProvider = new ContentDataProvider( + model, + Uri.from({ scheme: "http" }), + ); + + axiosInstance.get.withArgs("/id/parent").resolves({ + data: parent, + }); + axiosInstance.get.withArgs("/id/grandparent").resolves({ + data: grandparent, + }); + + await dataProvider.connect("http://test.io"); + + // We expect both files to have the same folder path + expect(await model.getFileFolderPath(item)).to.equal("/grandparent/parent"); + expect(await model.getFileFolderPath(item2)).to.equal( + "/grandparent/parent", + ); + }); }); diff --git a/client/test/components/ContentNavigator/utils.test.ts b/client/test/components/ContentNavigator/utils.test.ts new file mode 100644 index 000000000..5cf907483 --- /dev/null +++ b/client/test/components/ContentNavigator/utils.test.ts @@ -0,0 +1,27 @@ +import { expect } from "chai"; + +import { getFileStatement } from "../../../src/components/ContentNavigator/utils"; + +describe("utils", async function () { + it("getFileStatement - returns extensionless name + numeric suffix with no content", () => { + expect(getFileStatement("testcsv.csv", "", "/path").value).to.equal( + `filename \${1:fileref} filesrvc folderpath='/path' filename='testcsv.csv';\n`, + ); + }); + + it("getFileStatement - returns uppercase name + suffix with uppercase content", () => { + expect( + getFileStatement("testcsv.csv", "UPPER CASE CONTENT", "/path").value, + ).to.equal( + `FILENAME \${1:FILEREF} FILESRVC FOLDERPATH='/path' FILENAME='testcsv.csv';\n`, + ); + }); + + it("getFileStatement - returns encoded filename when filename contains quotes", () => { + expect( + getFileStatement("testcsv-'withquotes'.csv", "", "/path").value, + ).to.equal( + `filename \${1:fileref} filesrvc folderpath='/path' filename='testcsv-''withquotes''.csv';\n`, + ); + }); +}); diff --git a/l10n/bundle.l10n.ko.json b/l10n/bundle.l10n.ko.json new file mode 100644 index 000000000..67bbbd8c5 --- /dev/null +++ b/l10n/bundle.l10n.ko.json @@ -0,0 +1,115 @@ +{ + "Are you sure you want to permanently delete all the items? You cannot undo this action.": "모든 항목을 영구적으로 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "Are you sure you want to permanently delete the item \"{name}\"?": "항목 \"{name}\"을(를) 영구적으로 삭제하시겠습니까?", + "Cancelling job...": "작업 취소 중...", + "Cannot call self on ComputeSession with no id": "id가 없는 ComputeSession에서 self를 호출할 수 없습니다", + "Cannot call self on object with no id": "id가 없는 개체에서 self를 호출할 수 없습니다", + "Cannot connect to SAS Studio service": "SAS Studio 서비스에 연결할 수 없습니다", + "Cannot find file: {file}": "파일을 찾을 수 없습니다: {file}", + "Client ID": "클라이언트 ID", + "Client Secret": "클라이언트 비밀번호", + "Compute Context not found: {name}": "컴퓨팅 컨텍스트를 찾을 수 없음: {name}", + "Connecting to SAS session...": "SAS 세션에 연결 중...", + "Connection Type": "연결 유형", + "Delete": "삭제", + "Enter a client ID": "클라이언트 ID를 입력하세요", + "Enter a client secret": "클라이언트 비밀번호를 입력하세요", + "Enter a file name.": "파일 이름을 입력하세요.", + "Enter a folder name.": "폴더 이름을 입력하세요.", + "Enter a name for the new .flw file": "새 .flw 파일의 이름을 입력하세요", + "Enter a new name.": "새 이름을 입력하세요.", + "Enter a port number": "포트 번호를 입력하세요", + "Enter a port number.": "포트 번호를 입력하세요.", + "Enter connection name": "연결 이름을 입력하세요", + "Enter secret for client ID. An example is myapp.secret.": "클라이언트 ID의 비밀번호를 입력하세요. 예시: myapp.secret.", + "Enter the SAS compute context": "SAS 컴퓨팅 컨텍스트를 입력하세요", + "Enter the SAS compute context.": "SAS 컴퓨팅 컨텍스트를 입력하세요.", + "Enter the URL": "URL을 입력하세요", + "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "SAS Viya 서버의 URL을 입력하세요. 예시: https://example.sas.com", + "Enter the name of the SAS 9 SSH server.": "SAS 9 SSH 서버의 이름을 입력하세요.", + "Enter the registered client ID. An example is myapp.client.": "등록된 클라이언트 ID를 입력하세요. 예시: myapp.client.", + "Enter the server name": "서버 이름을 입력하세요", + "Enter the server path": "서버 경로를 입력하세요", + "Enter the server path of the SAS Executable.": "SAS 실행 파일의 서버 경로를 입력하세요.", + "Enter your SAS server username.": "SAS 서버 사용자 이름을 입력하세요.", + "Enter your username": "사용자 이름을 입력하세요", + "Error converting the notebook file to .flw format.": "노트북 파일을 .flw 형식으로 변환하는 중 오류가 발생했습니다.", + "Error getting server with ID {id} - {message}": "ID {id} - {message} 서버를 가져오는 중 오류 발생", + "Error getting session with ID {id} - {message}": "ID {id} - {message} 세션을 가져오는 중 오류 발생", + "Failed to connect to Session. Check profile settings.": "세션에 연결하지 못했습니다. 프로필 설정을 확인하세요.", + "Failed to get state from Session {sessionId}": "{sessionId} 세션에서 상태를 가져오지 못했습니다", + "File added to my folder.": "파일이 내 폴더에 추가되었습니다.", + "Invalid connectionType. Check Profile settings.": "유효하지 않은 연결 유형입니다. 프로필 설정을 확인하세요.", + "Invalid file name.": "유효하지 않은 파일 이름입니다.", + "Job does not have '{linkName}' link": "작업에 '{linkName}' 링크가 없습니다", + "Method not implemented.": "메서드가 구현되지 않았습니다.", + "Missing connectionType in active profile.": "활성 프로필에 연결 유형이 누락되었습니다.", + "Missing endpoint in active profile.": "활성 프로필에 엔드포인트가 누락되었습니다.", + "Missing host in active profile.": "활성 프로필에 호스트가 누락되었습니다.", + "Missing port in active profile.": "활성 프로필에 포트가 누락되었습니다.", + "Missing sas path in active profile.": "활성 프로필에 SAS 경로가 누락되었습니다.", + "Missing username in active profile.": "활성 프로필에 사용자 이름이 누락되었습니다.", + "New File": "새 파일", + "New Folder": "새 폴더", + "New SAS Connection Profile Name": "새 SAS 연결 프로필 이름", + "No Active Profile": "활성 프로필 없음", + "No Profile": "프로필 없음", + "No Profiles available to delete": "삭제할 수 있는 프로필이 없습니다", + "No SAS Connection Profile": "SAS 연결 프로필 없음", + "No authorization code": "인증 코드 없음", + "No opened file": "열린 파일 없음", + "No valid sas code": "유효한 sas 코드 없음", + "Not a valid sas file: {file}": "유효한 SAS 파일이 아닙니다: {file}", + "Not implemented": "구현되지 않음", + "Paste authorization code here": "여기에 인증 코드 붙여넣기", + "Port Number": "포트 번호", + "Rename File": "파일 이름 변경", + "Rename Folder": "폴더 이름 변경", + "Result": "결과", + "Result: {result}": "결과: {result}", + "SAS 9 SSH Server": "SAS 9 SSH 서버", + "SAS Compute Context": "SAS 컴퓨팅 컨텍스트", + "SAS Log": "SAS 로그", + "SAS Server Username": "SAS 서버 사용자 이름", + "SAS Viya Server": "SAS Viya 서버", + "SAS code running...": "SAS 코드 실행 중...", + "SSH_AUTH_SOCK not set. Check Environment Variables.": "SSH_AUTH_SOCK가 설정되지 않았습니다. 환경 변수를 확인하세요.", + "Saving {itemName}.": "{itemName} 저장 중...", + "Select a Connection Type": "연결 유형 선택", + "Select a Connection Type.": "연결 유형을 선택하십시오.", + "Select a SAS connection profile": "SAS 연결 프로필 선택", + "Server Path": "서버 경로", + "Server does not have createSession link": "서버에 createSession 링크가 없습니다", + "Server does not have state link": "서버에 상태 링크가 없습니다", + "Session does not have '{linkName}' link": "세션에 '{linkName}' 링크가 없습니다", + "Show results...": "결과 표시 중...", + "Something went wrong": "문제가 발생했습니다", + "Switch Current SAS Profile": "현재 SAS 프로필 전환", + "Task is cancelled.": "작업이 취소되었습니다.", + "Task is complete.": "작업이 완료되었습니다.", + "The SAS session has closed.": "SAS 세션이 종료되었습니다.", + "The file type is unsupported.": "지원되지 않는 파일 형식입니다.", + "The folder name cannot contain more than 100 characters.": "폴더 이름은 100자를 초과할 수 없습니다.", + "The item could not be added to My Favorites.": "항목을 즐겨찾기에 추가할 수 없습니다.", + "The item could not be removed from My Favorites.": "항목을 즐겨찾기에서 제거할 수 없습니다.", + "The notebook file does not contain any code to convert.": "노트북 파일에 변환할 코드가 포함되어 있지 않습니다.", + "The notebook has been successfully converted to a flow. You can now open it in SAS Studio.": "노트북이 성공적으로 플로우로 변환되었습니다. 이제 SAS Studio에서 열 수 있습니다.", + "The output file name must end with the .flw extension.": "출력 파일 이름은 .flw 확장자로 끝나야 합니다.", + "The {selected} SAS connection profile has been deleted from the settings.json file.": "{selected} SAS 연결 프로필이 settings.json 파일에서 삭제되었습니다.", + "Unable to add file to my folder.": "파일을 내 폴더에 추가할 수 없습니다.", + "Unable to create file \"{name}\".": "\"{name}\" 파일을 생성할 수 없습니다.", + "Unable to create folder \"{name}\".": "\"{name}\" 폴더를 생성할 수 없습니다.", + "Unable to delete file.": "파일을 삭제할 수 없습니다.", + "Unable to delete folder.": "폴더를 삭제할 수 없습니다.", + "Unable to delete table {tableName}.": "{tableName} 테이블을 삭제할 수 없습니다.", + "Unable to drag files from my favorites.": "즐겨찾기에서 파일을 드래그할 수 없습니다.", + "Unable to drag files from trash.": "휴지통에서 파일을 드래그할 수 없습니다.", + "Unable to drop item \"{name}\".": "\"{name}\" 항목을 놓을 수 없습니다.", + "Unable to empty the recycle bin.": "휴지통을 비울 수 없습니다", + "Unable to rename \"{oldName}\" to \"{newName}\".": "\"{oldName}\"을(를) \"{newName}\" 이름으로 바꿀 수 없습니다.", + "Unable to restore file.": "파일을 복원할 수 없습니다.", + "Unable to restore folder.": "폴더를 복원할 수 없습니다.", + "View SAS Table": "SAS 테이블 보기", + "You can also specify connection profile using the settings.json file.": "settings.json 파일을 사용하여 연결 프로필을 지정할 수도 있습니다.", + "You must save your file before you can rename it.": "파일 이름을 바꾸기 전에 파일을 저장해야 합니다." +} diff --git a/l10n/bundle.l10n.pt-br.json b/l10n/bundle.l10n.pt-br.json new file mode 100644 index 000000000..f0091d98f --- /dev/null +++ b/l10n/bundle.l10n.pt-br.json @@ -0,0 +1,115 @@ +{ + "Are you sure you want to permanently delete all the items? You cannot undo this action.": "Tem certeza que deseja excluir todos estes itens permanentemente? Não é possível desfazer esta ação.", + "Are you sure you want to permanently delete the item \"{name}\"?": "Tem certeza que desejas excluir este iten permanentemente \"{name}\"?", + "Cancelling job...": "Cancellando esta tarefa...", + "Cannot call self on ComputeSession with no id": "Uma Compute Session sem identificação (ID) não pode chamar a si mesmo", + "Cannot call self on object with no id": "Um objeto sem ID não pode chamar a si mesmo", + "Cannot connect to SAS Studio service": "Não é possível conectar ao serviço SAS Studio", + "Cannot find file: {file}": "Não é possível localizar o arquivo: {file}", + "Client ID": "ID do Cliente", + "Client Secret": "Segredo do Cliente", + "Compute Context not found: {name}": "Contexto Computacional não encontrado: {name}", + "Connecting to SAS session...": "Conectando à sessão de SAS...", + "Connection Type": "Tipo de ligação", + "Delete": "Exclui", + "Enter a client ID": "Insere o ID do cliente", + "Enter a client secret": "Insere o segredo do cliente", + "Enter a file name.": "Token.", + "Enter a folder name.": "Insere o nome de uma pasta.", + "Enter a name for the new .flw file": "Insira o nome do novo arquivo .flw", + "Enter a new name.": "Insere o nome novo.", + "Enter a port number": "Insira o número da porta", + "Enter a port number.": "Insira o número da porta.", + "Enter connection name": "Insere o nome do conexão", + "Enter secret for client ID. An example is myapp.secret.": "Insere o segredo do ID do cliente. Por exemplo: myapp.secret.", + "Enter the SAS compute context": "Insere o contexto computacional de SAS", + "Enter the SAS compute context.": "Insere o contexto computacional de SAS.", + "Enter the URL": "Insere o URL", + "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Insere o URL do servidor SAS Viya. Por exemplo: https://example.sas.com.", + "Enter the name of the SAS 9 SSH server.": "Insere o nome do servidor SSH SAS 9", + "Enter the registered client ID. An example is myapp.client.": "Insira o ID registrado do cliente. Por exemplo: myapp.client.", + "Enter the server name": "Insere o nome do servidor", + "Enter the server path": "Insere o caminho ao servidor", + "Enter the server path of the SAS Executable.": "Insira o caminho no servidor ao arquivo executável de SAS.", + "Enter your SAS server username.": "Insira seu nome de usuário para o servidor de SAS.", + "Enter your username": "Insira seu nome de usuário", + "Error converting the notebook file to .flw format.": "Erro convertendo o arquivo notebook para o formato .flw.", + "Error getting server with ID {id} - {message}": "Erro obtendo servidor com o ID {id} - {message}", + "Error getting session with ID {id} - {message}": "Erro obtendo uma sessão com o ID {id} - {message}", + "Failed to connect to Session. Check profile settings.": "Falhou fazendo conexão a Sessão. Verifique as configurações do perfil.", + "Failed to get state from Session {sessionId}": "Falhou obtendo o estado da Sessão {sessionId}", + "File added to my folder.": "Arquivo adicionado na minha pasta.", + "Invalid connectionType. Check Profile settings.": "Tipo de conexão (connectionType) inválido. Verifique as configurações do perfil.", + "Invalid file name.": "Nome do arquivo é inválido.", + "Job does not have '{linkName}' link": "A tarefa não possui o link chamado '{linkName}'", + "Method not implemented.": "Método não é implementado.", + "Missing connectionType in active profile.": "Tipo de conexão (connectionType) ausente no perfil ativo.", + "Missing endpoint in active profile.": "Ponto final (endpoint) ausente no perfil ativo.", + "Missing host in active profile.": "Host ausente no perfil ativo.", + "Missing port in active profile.": "Porta ausente no perfil ativo.", + "Missing sas path in active profile.": "Caminho ao arquivo executável de SAS ausente no perfil ativo.", + "Missing username in active profile.": "Nome de usuário ausente no perfil ativo.", + "New File": "Arquivo novo", + "New Folder": "Pasta nova", + "New SAS Connection Profile Name": "Nome nova do perfil de conexão a SAS", + "No Active Profile": "Não ha Perfil Ativo", + "No Profile": "Não ha Perfil", + "No Profiles available to delete": "Nenhum perfil disponível para exclusão", + "No SAS Connection Profile": "Não ha perfil de conexão a SAS", + "No authorization code": "Não ha código de autorização", + "No opened file": "Não ha arquivo aberto", + "No valid sas code": "Não ha código válido de SAS", + "Not a valid sas file: {file}": "Não é arquivo SAS válido: {file}", + "Not implemented": "Não é implementado", + "Paste authorization code here": "Cole aqui o código de autorização", + "Port Number": "Número da Porta", + "Rename File": "Renomear um arquivo", + "Rename Folder": "Renomear uma pasta", + "Result": "Resultado", + "Result: {result}": "Resultado: {result}", + "SAS 9 SSH Server": "Servidor SSH do SAS 9", + "SAS Compute Context": "Contexto de computação SAS", + "SAS Log": "Registro de SAS", + "SAS Server Username": "Nome de usuário para o servidor de SAS", + "SAS Viya Server": "Servidor de SAS Viya", + "SAS code running...": "Executando o programa de SAS...", + "SSH_AUTH_SOCK not set. Check Environment Variables.": "SSH_AUTH_SOCK não é configurado. Verifique as variáveis ambientes.", + "Saving {itemName}.": "Salvando {itemName}.", + "Select a Connection Type": "Escolha o tipo de conexão", + "Select a Connection Type.": "Escolha o tipo de conexão.", + "Select a SAS connection profile": "Escolha o perfil do conexão a SAS", + "Server Path": "Caminho ao servidor", + "Server does not have createSession link": "O servidor não tem o link createSession", + "Server does not have state link": "O servidor não tem o link de status", + "Session does not have '{linkName}' link": "O sessão não tem o link '{linkName}'", + "Show results...": "Mostra os resultados...", + "Something went wrong": "Algo deu errado", + "Switch Current SAS Profile": "Mudar o perfil atual de SAS", + "Task is cancelled.": "Tarefa cancelado.", + "Task is complete.": "Tarefa completado.", + "The SAS session has closed.": "A sessão de SAS foi encerrada.", + "The file type is unsupported.": "Este tipo de arquivo não é compatível.", + "The folder name cannot contain more than 100 characters.": "O nome da pasta não pode conter mais de 100 caracteres.", + "The item could not be added to My Favorites.": "Não foi possível adicionar o iten a My Favorites.", + "The item could not be removed from My Favorites.": "Não foi possível excluir o iten do My Favorites.", + "The notebook file does not contain any code to convert.": "O arquivo notebook não contém nenhum código para converter.", + "The notebook has been successfully converted to a flow. You can now open it in SAS Studio.": "O notebook foi convertido com sucesso em um flow. Podes agora abri-lo no SAS Studio.", + "The output file name must end with the .flw extension.": "Precisas terminar o nome do arquivo de saída com a extensão .flw.", + "The {selected} SAS connection profile has been deleted from the settings.json file.": "O perfil de conexão a SAS {selected} foi excluído do arquivo settings.json.", + "Unable to add file to my folder.": "Não foi possível adicionar o arquivo a my folder.", + "Unable to create file \"{name}\".": "Não foi possível criar o arquivo \"{name}\".", + "Unable to create folder \"{name}\".": "Não foi possível criar a pasta \"{name}\".", + "Unable to delete file.": "Não foi possível excluir o arquivo.", + "Unable to delete folder.": "Não foi possível excluir a pasta.", + "Unable to delete table {tableName}.": "Não foi possível excluir a tabela {tableName}.", + "Unable to drag files from my favorites.": "Não foi possível arrastar arquivos de my favorites.", + "Unable to drag files from trash.": "Não foi possível arrastar arquivos do lixo.", + "Unable to drop item \"{name}\".": "Não foi possível descartar o iten \"{name}\".", + "Unable to empty the recycle bin.": "Não foi possível esvaziar a lixeira.", + "Unable to rename \"{oldName}\" to \"{newName}\".": "Não foi possível renomear \"{oldName}\" a \"{newName}\".", + "Unable to restore file.": "Não foi possível recuperar o arquivo.", + "Unable to restore folder.": "Não foi possível recuperar a pasta.", + "View SAS Table": "Veja a tabela de SAS", + "You can also specify connection profile using the settings.json file.": "Também pode especificar o perfil de conexão no arquivo settings.json.", + "You must save your file before you can rename it.": "Precisas salvar o arquivo antes de renomeá-lo." +} diff --git a/package-lock.json b/package-lock.json index a0206981d..fd279bb3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,15 +13,15 @@ "@trivago/prettier-plugin-sort-imports": "^4.2.0", "@types/chai": "^4.3.6", "@types/mocha": "^10.0.2", - "@types/node": "^20.8.4", - "@types/sinon": "^10.0.17", - "@typescript-eslint/eslint-plugin": "^6.7.3", - "@typescript-eslint/parser": "^6.7.4", + "@types/node": "^20.8.6", + "@types/sinon": "^10.0.19", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.8.0", "@vscode/l10n-dev": "^0.0.29", "chai": "^4.3.10", "concurrently": "^8.2.1", "esbuild": "^0.19.4", - "eslint": "^8.50.0", + "eslint": "^8.51.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "mocha": "^10.2.0", @@ -849,9 +849,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1193,9 +1193,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", "dev": true, "dependencies": { "undici-types": "~5.25.1" @@ -1208,9 +1208,9 @@ "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.17", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.17.tgz", - "integrity": "sha512-+6ILpcixQ0Ma3dHMTLv4rSycbDXkDljgKL+E0nI2RUxxhYTFyPSjt6RVMxh7jUshvyVcBvicb0Ktj+lAJcjgeA==", + "version": "10.0.19", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", + "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" @@ -1233,16 +1233,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", - "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", + "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/type-utils": "6.7.3", - "@typescript-eslint/utils": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/type-utils": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1268,13 +1268,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", - "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", + "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3" + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1285,9 +1285,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", + "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1298,12 +1298,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", + "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.7.5", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1315,15 +1315,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", - "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4" }, "engines": { @@ -1343,13 +1343,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", - "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4" + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1360,13 +1360,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", - "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", + "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.3", - "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/utils": "6.7.5", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1387,9 +1387,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", + "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1400,13 +1400,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", - "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", + "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1427,12 +1427,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", + "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.7.5", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1444,9 +1444,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", - "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", + "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1457,13 +1457,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", - "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", + "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1484,17 +1484,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", - "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", + "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.3", - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", "semver": "^7.5.4" }, "engines": { @@ -1509,13 +1509,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", - "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", + "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3" + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1526,9 +1526,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", - "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", + "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1539,13 +1539,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", - "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", + "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", - "@typescript-eslint/visitor-keys": "6.7.3", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1566,12 +1566,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", - "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", + "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/types": "6.7.5", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1583,12 +1583,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", - "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", + "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/types": "6.8.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2803,15 +2803,15 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", diff --git a/package.json b/package.json index 8b30e548a..99c33466a 100644 --- a/package.json +++ b/package.json @@ -929,15 +929,15 @@ "@trivago/prettier-plugin-sort-imports": "^4.2.0", "@types/chai": "^4.3.6", "@types/mocha": "^10.0.2", - "@types/node": "^20.8.4", - "@types/sinon": "^10.0.17", - "@typescript-eslint/eslint-plugin": "^6.7.3", - "@typescript-eslint/parser": "^6.7.4", + "@types/node": "^20.8.6", + "@types/sinon": "^10.0.19", + "@typescript-eslint/eslint-plugin": "^6.7.5", + "@typescript-eslint/parser": "^6.8.0", "@vscode/l10n-dev": "^0.0.29", "chai": "^4.3.10", "concurrently": "^8.2.1", "esbuild": "^0.19.4", - "eslint": "^8.50.0", + "eslint": "^8.51.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "mocha": "^10.2.0", diff --git a/package.nls.ko.json b/package.nls.ko.json new file mode 100644 index 000000000..7c89d316f --- /dev/null +++ b/package.nls.ko.json @@ -0,0 +1,68 @@ +{ + "commands.SAS.addFileResource": "새 파일...", + "commands.SAS.addFolderResource": "새 폴더...", + "commands.SAS.addProfile": "새로운 연결 프로필 추가", + "commands.SAS.addToFavorites": "내 즐겨찾기에 추가", + "commands.SAS.authorize": "로그인", + "commands.SAS.close": "현재 세션 닫기", + "commands.SAS.collapseAll": "모두 축소", + "commands.SAS.convertNotebookToFlow": "플로우로 변환...", + "commands.SAS.deleteProfile": "연결 프로필 삭제", + "commands.SAS.deleteResource": "삭제", + "commands.SAS.deleteTable": "삭제", + "commands.SAS.download": "다운로드", + "commands.SAS.emptyRecycleBin": "휴지통 비우기", + "commands.SAS.notebook.new": "새로운 SAS 노트북", + "commands.SAS.notebook.new.short": "SAS 노트북", + "commands.SAS.refresh": "새로고침", + "commands.SAS.removeFromFavorites": "내 즐겨찾기에서 제거", + "commands.SAS.renameResource": "이름 변경...", + "commands.SAS.restoreResource": "복원", + "commands.SAS.run": "모든 SAS 코드 실행", + "commands.SAS.runRegion": "영역 실행", + "commands.SAS.runSelected": "선택한 코드 또는 모든 SAS 코드 실행", + "commands.SAS.switchProfile": "현재 연결 프로필 전환", + "commands.SAS.updateProfile": "연결 프로필 업데이트", + "configuration.SAS.connectionProfiles": "SAS 서버에 연결하기 위한 연결 프로필을 정의합니다. 두 개 이상의 프로필을 정의하는 경우 서로 전환할 수 있습니다.", + "configuration.SAS.connectionProfiles.activeProfile": "활성 SAS 연결 프로필", + "configuration.SAS.connectionProfiles.profiles": "SAS 연결 프로필", + "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS 연결 자동 실행", + "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS 연결 자동 실행 파일 경로", + "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS 연결 자동 실행 라인", + "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS 연결 자동 실행 유형", + "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya 클라이언트 ID", + "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya 클라이언트 비밀번호", + "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM 연결 호스트", + "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS 프로필 연결 유형", + "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya 컨텍스트", + "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya 연결 프로필 엔드포인트", + "configuration.SAS.connectionProfiles.profiles.name": "SAS 연결 프로필 이름", + "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS 연결 SAS 옵션", + "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH 연결 SSH 호스트", + "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH 연결 포트", + "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "SAS SSH 연결 실행 파일 경로", + "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH 연결 사용자 이름", + "configuration.SAS.connectionProfiles.profiles.tokenFile": "SAS Viya 토큰 파일", + "configuration.SAS.connectionProfiles.profiles.username": "SAS Viya 사용자 ID", + "configuration.SAS.flowConversionMode": "노트북의 변환 모드 선택", + "configuration.SAS.flowConversionModeNode": "각 노트북 셀을 노드로 변환", + "configuration.SAS.flowConversionModeSwimlane": "각 노트북 셀을 스윔레인으로 변환", + "configuration.SAS.results.html.enabled": "ODS HTML5 출력 활성화/비활성화", + "configuration.SAS.results.html.style": "ODS HTML5 결과에 대한 스타일 지정", + "configuration.SAS.results.html.style.(auto)": "확장 기능이 색상 테마와 가장 일치하는 스타일을 선택하도록 합니다.", + "configuration.SAS.results.html.style.(server default)": "SAS 서버에서 구성한 스타일을 기본값으로 설정합니다.", + "configuration.SAS.results.sideBySide": "코드 옆에 결과 표시", + "configuration.SAS.results.singlePanel": "결과 표시에 단일 패널 재사용", + "configuration.SAS.userProvidedCertificates": "신뢰할 수 있는 CA 인증서 파일 제공", + "notebooks.SAS.htmlRenderer": "SAS HTML 렌더러", + "notebooks.SAS.logRenderer": "SAS 로그 렌더러", + "notebooks.SAS.sasNotebook": "SAS 노트북", + "themes.SAS.dark": "SAS 다크", + "themes.SAS.highContrast": "SAS 고대비", + "themes.SAS.light": "SAS 라이트", + "views.SAS.explorer": "탐색기", + "views.SAS.libraries": "라이브러리", + "views.SAS.signIn": "로그인", + "views.SAS.unsupportedConnection": "귀하의 연결은 SAS Extension for Visual Studio Code 내에서 SAS 콘텐츠 탐색을 지원하지 않습니다. 탐색기 뷰를 사용하여야 파일을 방문할 수 있습니다.", + "views.SAS.welcome": "SAS Extension for Visual Studio Code를 사용하려면 SAS에 로그인해야 합니다.\n[로그인](command:SAS.authorize)" +} diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json new file mode 100644 index 000000000..09a53564a --- /dev/null +++ b/package.nls.pt-br.json @@ -0,0 +1,68 @@ +{ + "commands.SAS.addFileResource": "Arquivo novo...", + "commands.SAS.addFolderResource": "Pasta nova...", + "commands.SAS.addProfile": "Adicionar um Perfil de Conexão novo", + "commands.SAS.addToFavorites": "Adiciona ao My Favorites", + "commands.SAS.authorize": "Conecte-se", + "commands.SAS.close": "Fecha a sessão atual", + "commands.SAS.collapseAll": "Recolher todos", + "commands.SAS.convertNotebookToFlow": "Converta a Flow...", + "commands.SAS.deleteProfile": "Exclui Perfil de Conexão", + "commands.SAS.deleteResource": "Exclui recurso", + "commands.SAS.deleteTable": "Exclui tabela", + "commands.SAS.download": "Download", + "commands.SAS.emptyRecycleBin": "Esvazia a lixeira", + "commands.SAS.notebook.new": "Novo Notebook SAS", + "commands.SAS.notebook.new.short": "Notebook SAS", + "commands.SAS.refresh": "Refrescar", + "commands.SAS.removeFromFavorites": "Exclui iten de My Favorites", + "commands.SAS.renameResource": "Renomeia...", + "commands.SAS.restoreResource": "Restabelece", + "commands.SAS.run": "Execute o inteiro programa SAS", + "commands.SAS.runRegion": "Execute o código da região", + "commands.SAS.runSelected": "Execute o selecão ou o programa SAS inteiro", + "commands.SAS.switchProfile": "Troca o perfil de conexão atual", + "commands.SAS.updateProfile": "Atualiza o perfil de conexão", + "configuration.SAS.connectionProfiles": "Define os perfis de conexão para conectar-se aos servidores SAS. Se defines mais de um perfil, poderá alternar entre eles.", + "configuration.SAS.connectionProfiles.activeProfile": "Ativa Perfil de Conexão SAS", + "configuration.SAS.connectionProfiles.profiles": "Perfils de Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.autoExec": "Arquivo AutoExec da Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "Caminho do Arquivo AutoExec da Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.autoExec.line": "Linha no Arquivo AutoExec da Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.autoExec.type": "Tipo do Arquivo AutoExec da Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.clientId": "ID do Cliente do SAS Viya", + "configuration.SAS.connectionProfiles.profiles.clientSecret": "Segredo do Cliente do SAS Viya ", + "configuration.SAS.connectionProfiles.profiles.com.host": "Host de conexão SAS COM", + "configuration.SAS.connectionProfiles.profiles.connectionType": "Tipo de Conexão do Perfil SAS", + "configuration.SAS.connectionProfiles.profiles.context": "Contexto SAS Viya", + "configuration.SAS.connectionProfiles.profiles.endpoint": "Ponto final do perfil de conexão SAS Viya", + "configuration.SAS.connectionProfiles.profiles.name": "Nome do Perfil de Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.sasOptions": "Opções SAS da conexão SAS", + "configuration.SAS.connectionProfiles.profiles.ssh.host": "Host SSH da Conexão SSH SAS", + "configuration.SAS.connectionProfiles.profiles.ssh.port": "Porta da Conexão SSH SAS", + "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Caminho executável da Conexão SSH SAS", + "configuration.SAS.connectionProfiles.profiles.ssh.username": "Nome de Usuário do Conexão SAS", + "configuration.SAS.connectionProfiles.profiles.tokenFile": "Arquivo Token de SAS Viya", + "configuration.SAS.connectionProfiles.profiles.username": "ID de Usuário SAS Viya", + "configuration.SAS.flowConversionMode": "Escolha o modo de conversão para os notebooks", + "configuration.SAS.flowConversionModeNode": "Converta cada célula do notebook a um nó", + "configuration.SAS.flowConversionModeSwimlane": "Converta cada célula do notebook em uma raia (swimlane)", + "configuration.SAS.results.html.enabled": "Habilitar/desabilitar resultados HTML5 do ODS", + "configuration.SAS.results.html.style": "Especifica o estilo dos resultados HTML5 do ODS.", + "configuration.SAS.results.html.style.(auto)": "Deixa que a extensão escolha o estilo que corresponda melhor ao tema de cores.", + "configuration.SAS.results.html.style.(server default)": "Use o estilo padrão configurado no servidor SAS.", + "configuration.SAS.results.sideBySide": "Exibir resultados ao lado do código", + "configuration.SAS.results.singlePanel": "Exibe os resultados em um painel único e reutilizado", + "configuration.SAS.userProvidedCertificates": "Forneça os arquivos de certifiçao CA confiáveis.", + "notebooks.SAS.htmlRenderer": "Renderizador SAS de HTML", + "notebooks.SAS.logRenderer": "SAS Log Renderer", + "notebooks.SAS.sasNotebook": "Notebook SAS", + "themes.SAS.dark": "SAS Escuro", + "themes.SAS.highContrast": "SAS Alta Contrasto", + "themes.SAS.light": "SAS Clara", + "views.SAS.explorer": "Explorador", + "views.SAS.libraries": "Bibliotecas", + "views.SAS.signIn": "Sign In", + "views.SAS.unsupportedConnection": "Este conexão não suporte a navegação de conteúdo SAS na extensão Visual Studio Code SAS. Somente pode acessar arquivos usando o Explorador.", + "views.SAS.welcome": "Para usar a extensão SAS no Visual Studio Code, precisas fazer login ao SAS.\n[Sign In](command:SAS.authorize)" +}