Compare commits

...

49 Commits
1.3.9 ... 1.4.2

Author SHA1 Message Date
Karl Burtram
637dc9b9b2 Bump Azure Data Studio to 1.4.2 2019-01-18 09:48:44 -08:00
Karl Burtram
1de16d4715 Reset query messages for each execution (#3772) 2019-01-17 17:53:05 -08:00
Kevin Cunnane
49090d774d Null ref occurred when doing some UI interactions before the notebook model was set (#3769) 2019-01-17 14:41:56 -08:00
Karl Burtram
9a695b5cdd Reenable results stream by default (#3752) 2019-01-17 10:28:48 -08:00
Raj
e0339b50c0 #3753: User settings configuration - python installation path (#3754)
* #3753: User settings configuration - python installation path

* Text change

* #3753: Text change

* Message change
2019-01-16 16:29:06 -08:00
Karl Burtram
d0c584672f Fix Top Operations tab title (#3751) 2019-01-15 16:06:51 -08:00
Anthony Dresser
27816acaeb Remove custom splitview (#3467)
* working on options dialog

* working through options dialog

* trying to work through modifying options dialog

* working on converting scrollablesplitview

* fixed options working through profiler

* fix profiler

* fix account dialog

* trying to fix problems with splitpanel

* fix insights dialog

* moving through

* fix last list, need to verify looks and functionality

* fix look of account dialog

* formatting

* formatting

* working through scrollable bugs

* working on problem with view size

* fix margin issues

* fix styler for dialogs

* add panel styles to insights

* create instantiation issues

* fix test

* fix test

* remove unused code

* formatting

* working through insight dialog issues

* fix table updating

* remove console logs
2019-01-15 15:00:34 -08:00
Mustafa Sadedil
4de3cc8a09 Completed: Missing feature request: Save as XML (#3729)
* Save as XML feature added to grid

* Unrelated code removed
2019-01-15 14:36:42 -08:00
Karl Burtram
5c16ceb2fa Bump SQL Tools Service to pick up https://github.com/Microsoft/sqltoolsservice/pull/763 (#3748) 2019-01-15 14:12:20 -08:00
Raj
9db3f73413 Notebook Doesn't Prompt for Save even when isDirty #3568 (#3656)
This is temp fix until native save is implemented.
2019-01-15 11:41:05 -08:00
Chris LaFreniere
e0ceddce09 Notebooks: Add Placeholder Cell, Fix Link Styling (#3728)
* Placeholder cell to add new real cells

* Fix links in notebooks to show correct color, rely on angular ngif for placeholder

* Fix failing test where one cell was expected by default

* Remove unnecessary TODO
2019-01-14 17:29:06 -08:00
Chris LaFreniere
6dc4096299 Editor focus based on activeCell, create text in edit, scroll to active (#3725) 2019-01-14 16:39:36 -08:00
Chris LaFreniere
1fa03b5c74 Ensure we always get all providers (#3724) 2019-01-14 16:38:57 -08:00
Kevin Cunnane
f8f57a93c3 Fix #3736 Notebook: cannot connect to SQL big data cluster due to empty config.json file (#3738)
- Writing the config file in the core for now, will look to move to the extension in Feb release
2019-01-14 14:14:32 -08:00
Karl Burtram
960fe63312 Bump Data Protocol client to 0.2.11 (#3739) 2019-01-14 14:04:35 -08:00
Karl Burtram
7545b94128 Turn off "something went wrong" message (#3606) 2019-01-11 17:39:13 -08:00
Karl Burtram
1263a27c1c Fix date in change log to 2019 (#3726) 2019-01-11 16:55:18 -08:00
Anthony Dresser
e1c084d365 fix html formatting in grid (#3722) 2019-01-11 16:24:50 -08:00
Karl Burtram
7465ec0bbd Add connection dialog icon dark theme and HC styles (#3721) 2019-01-11 13:38:43 -08:00
Chris LaFreniere
17ed57836f Fix focus issue when opening notebooks (#3711) 2019-01-11 11:37:49 -08:00
Chris LaFreniere
d0acb51fd7 Fix contentManager undefined when builtin manager used (#3710)
* Fix for contentManager undefined for builtin manager

* Clean up code some more
2019-01-11 10:36:36 -08:00
Anthony Dresser
71c1ed6c49 Add state for column sizing (#3683)
* add state for column sizing

* work properly with auto size columns
2019-01-11 10:25:57 -08:00
AlexFsmn
bfb68254a4 Added context menu for DBs in explorer view to backup & restore db. (#2277)
* Added context menu for DBs in explorer view to backup & restore db.
Fixed bug where progress bar didn't complete on backup/restore menuclick
#2084

* Fix merge conflicts
2019-01-11 10:00:16 -08:00
Anthony Dresser
18f7662209 Duplicate Result sets (#3620)
* remove debouncing and echoing to fix rendering bug

* fix access of internal member

* fix issue with using splice rather than slice

* fix compile issues
2019-01-10 13:44:14 -08:00
Karl Burtram
a0d84f383c Generate temp files as not dirty (#3698)
* Generate temp files as not dirty

* Remove whitespace
2019-01-10 12:51:41 -08:00
Karl Burtram
1f447ae681 Add Idera extension to recommendation list (#3709) 2019-01-10 11:54:39 -08:00
Kevin Cunnane
8bd6691331 Added v3 Notebook format support (#3697)
* Added v3 format support
2019-01-09 17:00:56 -08:00
Chris LaFreniere
42afcf9322 Integrate first SQL Notebooks Bits into Master (#3679)
* First crack tsql notebook (no output rendered yet)

* getting messages back

* intellisense working first cell, no connection errors

* sql notebook cell output functioning

* Latest SQL noteobook changes

* Undo change to launch.json

* Plumbing providers through

* Kernels shown from multiple providers, can switch between them. No mementos yet

* Ensure we have a feature flag for SQL notebooks, ensure existing functionality still works

* Fix tslint duplicate imports issue

* Addressing PR comments

* second round of PR feedback to cleanup notebook service manager code

* merge latest from master
2019-01-09 14:58:57 -08:00
David Shiflet
3d3694bb8d Add --command command line argument (#3690) 2019-01-09 17:36:01 -05:00
Anthony Dresser
589b913960 Readd Top Operations (#3628)
* workin on top operations

* added top operations, changed default sorter to handle number string better
2019-01-09 13:52:38 -08:00
kisantia
7ba4f42494 Moving onValidityChanged listener to showPage() so that it gets added to pages that are added to the wizard after the initial start up (#3691) 2019-01-09 13:19:24 -08:00
Chris LaFreniere
c96118d2b5 Fix activeCell nullref issue (#3689) 2019-01-09 11:45:05 -08:00
Karl Burtram
0285d8cd38 Update readme for January release (#3595)
* Update readme for December release

* Fix spelling

* Update release date to 12/13

* added release note items and fixed a small misspell

* Update release date to Dec 18

* Update release date
2019-01-09 10:12:14 -08:00
Matt Irvine
ee87604a4d Save grid selection/vertical scroll when switching tabs (#3682) 2019-01-08 15:51:57 -08:00
Kevin Cunnane
2235ebaf20 Fix #3680 Notebooks: outputs with string arrays rendered incorrectly (#3681)
* Refactor JSON and format files to model and fix tabs -> spaces issues

This is in prep for some work to reuse these code files inside the model,
so pushing as its own PR to keep the next piece of work clean.

* Fix #3680 Notebooks: outputs with string arrays rendered incorrectly
- Add support for processing v4 format files loaded from disk
- Prep support for v3 notebooks by adding placeholder code for that

* Fix failing tests and add specific one for this bug

* Remove references to v5
2019-01-08 15:24:16 -08:00
Anthony Dresser
954d0d954f Auto Column Sizing (#2778)
* add auto column sizing

* add break for performance

* update with new library
2019-01-08 13:05:53 -08:00
Kevin Cunnane
e31747d087 Refactor JSON and format files to model and fix tabs -> spaces issues (#3675)
This is in prep for some work to reuse these code files inside the model,
so pushing as its own PR to keep the next piece of work clean.
2019-01-07 14:02:12 -08:00
Anthony Dresser
fc581253a4 Fix gap with result streaming (#3629)
* handle updating item sizing when being updated

* change back scrolling delay

* remove unused code
2019-01-07 12:58:00 -08:00
Chris LaFreniere
47c4609f23 Ensure we call Dispose() on NotebookModel when notebook component is destroyed (#3667) 2019-01-04 12:00:42 -08:00
Chris LaFreniere
2d52bc2a49 Notebooks: Fix Selection/Focus when New Cells Added (#3649)
* Improvemnents to Active Cell

* Fix minor spacing issue

* fix editor focus order

* Fix for add cell above/below

* cleanup logic to have activeCell logic all reside in notebook model
2019-01-02 15:20:05 -08:00
kisantia
5367101330 Fix database not getting set correctly in DacFx wizard deploy scenario (#3641)
* fix db not getting set correctly for deploy scenario if coming from import page

* removed space so that comments go directly after //
2018-12-19 18:45:40 -05:00
Matt Irvine
db145b4999 Run TSLint in Azure Pipelines (#3639) 2018-12-19 12:17:23 -08:00
Matt Irvine
7f950ddb80 Update edit data for result set streaming changes (#3634) 2018-12-18 11:07:26 -08:00
Vincent Feng
50e2251e74 Feature/extensible azure resource explorer (#3504)
Extensible Azure Resource Explorer
2018-12-18 15:44:08 +08:00
Karl Burtram
33d5455b6f Update Azure Data Studio to 1.4.1 2018-12-15 14:47:47 -08:00
khoiph1
ac018500cd Loc Update (#3548) 2018-12-13 09:53:22 -08:00
Aditya Bist
3e661db283 removed potentially PII (#3619) 2018-12-12 13:55:22 -08:00
Anthony Dresser
18fb78b3ec Account for different situations for stream setting (#3615)
* add cases for different situation

* default streaming setting false
2018-12-12 12:03:59 -08:00
Matt Irvine
58ff13d399 Fix some TSLint issues (#3605) 2018-12-11 16:27:32 -08:00
262 changed files with 49692 additions and 7807 deletions

24
.vscode/launch.json vendored
View File

@@ -92,6 +92,30 @@
"webRoot": "${workspaceFolder}",
"timeout": 45000
},
{
"type": "chrome",
"request": "launch",
"name": "Launch azuredatastudio with new notebook command",
"windows": {
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat"
},
"osx": {
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh"
},
"linux": {
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh"
},
"urlFilter": "*index.html*",
"runtimeArgs": [
"--inspect=5875",
"--command=notebook.command.new"
],
"skipFiles": [
"**/winjs*.js"
],
"webRoot": "${workspaceFolder}",
"timeout": 45000
},
{
"type": "node",
"request": "launch",

View File

@@ -1,5 +1,27 @@
# Change Log
## Version 1.3.8
* Release date: January 9, 2019
* Release status: General Availability
## What's new in this version
* #13 Feature Request: Azure Active Directory Authentication
* #1040 Stream initial query results as they become available
* #3298 Сan't add an azure account.
* #2387 Support Per-User Installer
* SQL Server Import updates for DACPAC\BACPAC
* SQL Server Profiler UI and UX improvements
* Updates to [SQL Server 2019 extension](https://docs.microsoft.com/sql/azure-data-studio/sql-server-2019-extension?view=sql-server-ver15)
* **sp_executesql to SQL** and **New Database** extensions
## Contributions and "thank you"
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
* Tarig0 for `Add Routine_Type to CreateStoredProc fixes #3257 (#3286)`
* oltruong for `typo fix #3025'`
* Thomas-S-B for `Removed unnecessary IErrorDetectionStrategy #749`
* Thomas-S-B for `Simplified code #750`
## Version 1.2.4
* Release date: November 6, 2018
* Release status: General Availability

View File

@@ -9,12 +9,13 @@ Azure Data Studio is a data management tool that enables you to work with SQL Se
Platform | Link
-- | --
Windows Setup Installer | https://go.microsoft.com/fwlink/?linkid=2038320
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2038323
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2038327
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2038332
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2038401
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2038405
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2049972
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2049975
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2050146
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2049981
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2049986
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2049989
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2050157
Go to our [download page](https://aka.ms/azuredatastudio) for more specific instructions.
@@ -62,6 +63,10 @@ The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.micro
## Contributions and "Thank You"
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
* Tarig0 for `Add Routine_Type to CreateStoredProc fixes #3257 (#3286)`
* oltruong for `typo fix #3025'`
* Thomas-S-B for `Removed unnecessary IErrorDetectionStrategy #749`
* Thomas-S-B for `Simplified code #750`
* rdaniels6813 for `Add query plan theme support #3031`
* Ruturaj123 for `Fixed some typos and grammatical errors #3027`
* PromoFaux for `Use emoji shortcodes in CONTRIBUTING.md instead of <20> #3009`

View File

@@ -34,5 +34,9 @@ steps:
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/test-results.xml'
condition: succeededOrFailed()
testResultsFiles: '**/test-results.xml'
condition: succeededOrFailed()
- script: |
yarn run tslint
displayName: 'Run TSLint'

View File

@@ -23,4 +23,8 @@ steps:
- task: PublishTestResults@2
inputs:
testResultsFiles: 'test-results.xml'
condition: succeededOrFailed()
condition: succeededOrFailed()
- script: |
yarn run tslint
displayName: 'Run TSLint'

View File

@@ -17,12 +17,12 @@
"configuration": [
{
"type": "object",
"title": "%azure.config.title%",
"title": "%azure.resource.config.title%",
"properties": {
"azureResource.resourceFilter": {
"azure.resource.config.filter": {
"type": "array",
"default": null,
"description": "%azure.resourceFilter.description%"
"description": "%azure.resource.config.filter.description%"
}
}
},
@@ -61,39 +61,47 @@
"category": "Azure Accounts"
},
{
"command": "azureresource.refreshall",
"title": "%azureresource.refreshall%",
"command": "azure.resource.refreshall",
"title": "%azure.resource.refreshall.title%",
"icon": {
"dark": "resources/dark/refresh_inverse.svg",
"light": "resources/light/refresh.svg"
}
},
{
"command": "azureresource.refresh",
"title": "%azureresource.refresh%",
"command": "azure.resource.refresh",
"title": "%azure.resource.refresh.title%",
"icon": {
"dark": "resources/dark/refresh_inverse.svg",
"light": "resources/light/refresh.svg"
}
},
{
"command": "azureresource.signin",
"title": "%azureresource.signin%"
"command": "azure.resource.signin",
"title": "%azure.resource.signin.title%"
},
{
"command": "azureresource.connectsqldb",
"title": "%azureresource.connectsqldb%",
"command": "azure.resource.selectsubscriptions",
"title": "%azure.resource.selectsubscriptions.title%",
"icon": {
"dark": "resources/dark/filter_inverse.svg",
"light": "resources/light/filter.svg"
}
},
{
"command": "azure.resource.connectsqlserver",
"title": "%azure.resource.connectsqlserver.title%",
"icon": {
"dark": "resources/dark/connect_to_inverse.svg",
"light": "resources/light/connect_to.svg"
}
},
{
"command": "azureresource.selectsubscriptions",
"title": "%azureresource.selectsubscriptions%",
"command": "azure.resource.connectsqldb",
"title": "%azure.resource.connectsqldb.title%",
"icon": {
"dark": "resources/dark/filter_inverse.svg",
"light": "resources/light/filter.svg"
"dark": "resources/dark/connect_to_inverse.svg",
"light": "resources/light/connect_to.svg"
}
}
],
@@ -110,46 +118,47 @@
"azureResource": [
{
"id": "azureResourceExplorer",
"name": "%azure.resourceExplorer.title%"
"name": "%azure.resource.explorer.title%"
}
]
},
"menus": {
"view/title": [
{
"command": "azureresource.refreshall",
"command": "azure.resource.refreshall",
"when": "view == azureResourceExplorer",
"group": "navigation@1"
}
],
"view/item/context": [
{
"command": "azureresource.connectsqldb",
"when": "viewItem =~ /^azureResource\\.itemType\\.database(?:Server){0,1}$/",
"group": "1azureresource@1"
},
{
"command": "azureresource.connectsqldb",
"when": "viewItem =~ /^azureResource\\.itemType\\.database(?:Server){0,1}$/",
"command": "azure.resource.selectsubscriptions",
"when": "viewItem == azure.resource.itemType.account",
"group": "inline"
},
{
"command": "azureresource.selectsubscriptions",
"when": "viewItem == azureResource.itemType.account",
"command": "azure.resource.refresh",
"when": "viewItem =~ /^azure\\.resource\\.itemType\\.(?:account|subscription|databaseContainer|databaseServerContainer)$/",
"group": "inline"
},
{
"command": "azureresource.refresh",
"when": "viewItem =~ /^azureResource\\.itemType\\.(?:account|subscription|databaseContainer|databaseServerContainer)$/",
"command": "azure.resource.connectsqlserver",
"when": "viewItem == azure.resource.itemType.databaseServer",
"group": "inline"
},
{
"command": "azure.resource.connectsqldb",
"when": "viewItem == azure.resource.itemType.database",
"group": "inline"
}
]
}
},
"hasAzureResourceProviders": true
},
"dependencies": {
"request": "2.88.0",
"azure-arm-resource": "^7.0.0",
"azure-arm-sql": "^5.0.1",
"request": "2.88.0",
"vscode-nls": "^4.0.0"
},
"devDependencies": {
@@ -157,6 +166,7 @@
"@types/node": "^8.0.24",
"mocha": "^5.2.0",
"should": "^13.2.1",
"vscode": "^1.1.26",
"typemoq": "^2.1.0"
}
}
}

View File

@@ -1,16 +1,20 @@
{
"azure.displayName": "Azure (Core)",
"azure.description": "Browse and work with Azure resources",
"azure.config.title": "Azure Resource Configuration",
"azure.resourceFilter.description": "The resource filter, each element is an account id, a subscription id and name separated by a slash",
"azureresource.refreshall": "Refresh All",
"azureresource.refresh": "Refresh",
"azureresource.signin": "Sign In",
"azureresource.connectsqldb": "Connect",
"azureresource.selectsubscriptions": "Select Subscriptions",
"azure.title": "Azure",
"azure.resourceExplorer.title": "Resource Explorer",
"azure.resource.config.title": "Azure Resource Configuration",
"azure.resource.config.filter.description": "The resource filter, each element is an account id, a subscription id and name separated by a slash",
"azure.resource.explorer.title": "Resource Explorer",
"azure.resource.refreshall.title": "Refresh All",
"azure.resource.refresh.title": "Refresh",
"azure.resource.signin.title": "Sign In",
"azure.resource.selectsubscriptions.title": "Select Subscriptions",
"azure.resource.connectsqlserver.title": "Connect",
"azure.resource.connectsqldb.title": "Connect",
"accounts.clearTokenCache": "Clear Azure Account Token Cache",
"config.enablePublicCloudDescription": "Should Azure public cloud integration be enabled",
"config.enableUsGovCloudDescription": "Should US Government Azure cloud (Fairfax) integration be enabled",
"config.enableChinaCloudDescription": "Should Azure China integration be enabled",

View File

@@ -0,0 +1,28 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TreeDataProvider, TreeItem } from 'vscode';
import { DataProvider, Account } from 'sqlops';
export namespace azureResource {
export interface IAzureResourceProvider extends DataProvider {
getTreeDataProvider(): IAzureResourceTreeDataProvider;
}
export interface IAzureResourceTreeDataProvider extends TreeDataProvider<IAzureResourceNode> {
}
export interface IAzureResourceNode {
readonly account: Account;
readonly subscription: AzureResourceSubscription;
readonly tenantId: string;
readonly treeItem: TreeItem;
}
export interface AzureResourceSubscription {
id: string;
name: string;
}
}

View File

@@ -6,35 +6,48 @@
'use strict';
import { window, QuickPickItem } from 'vscode';
import * as sqlops from 'sqlops';
import { generateGuid } from './utils';
import { ApiWrapper } from '../apiWrapper';
import { TreeNode } from '../treeNodes';
import { AzureResource } from 'sqlops';
import { TokenCredentials } from 'ms-rest';
import { AppContext } from '../appContext';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { azureResource } from './azure-resource';
import { TreeNode } from './treeNode';
import { AzureResourceCredentialError } from './errors';
import { AzureResourceTreeProvider } from './tree/treeProvider';
import { AzureResourceDatabaseServerTreeNode } from './tree/databaseServerTreeNode';
import { AzureResourceDatabaseTreeNode } from './tree/databaseTreeNode';
import { AzureResourceAccountTreeNode } from './tree/accountTreeNode';
import { AzureResourceServicePool } from './servicePool';
import { AzureResourceSubscription } from './models';
import { IAzureResourceSubscriptionService, IAzureResourceSubscriptionFilterService } from '../azureResource/interfaces';
import { AzureResourceServiceNames } from './constants';
export function registerAzureResourceCommands(apiWrapper: ApiWrapper, tree: AzureResourceTreeProvider): void {
apiWrapper.registerCommand('azureresource.selectsubscriptions', async (node?: TreeNode) => {
export function registerAzureResourceCommands(appContext: AppContext, tree: AzureResourceTreeProvider): void {
appContext.apiWrapper.registerCommand('azure.resource.selectsubscriptions', async (node?: TreeNode) => {
if (!(node instanceof AzureResourceAccountTreeNode)) {
return;
}
const subscriptionService = appContext.getService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService);
const subscriptionFilterService = appContext.getService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService);
const accountNode = node as AzureResourceAccountTreeNode;
const servicePool = AzureResourceServicePool.getInstance();
const subscriptions = (await accountNode.getCachedSubscriptions()) || <azureResource.AzureResourceSubscription[]>[];
if (subscriptions.length === 0) {
try {
const tokens = await this.servicePool.apiWrapper.getSecurityToken(this.account, AzureResource.ResourceManagement);
let subscriptions = await accountNode.getCachedSubscriptions();
if (!subscriptions || subscriptions.length === 0) {
const credentials = await servicePool.credentialService.getCredentials(accountNode.account, sqlops.AzureResource.ResourceManagement);
subscriptions = await servicePool.subscriptionService.getSubscriptions(accountNode.account, credentials);
for (const tenant of this.account.properties.tenants) {
const token = tokens[tenant.id].token;
const tokenType = tokens[tenant.id].tokenType;
subscriptions.push(...await subscriptionService.getSubscriptions(accountNode.account, new TokenCredentials(token, tokenType)));
}
} catch (error) {
throw new AzureResourceCredentialError(localize('azure.resource.selectsubscriptions.credentialError', 'Failed to get credential for account {0}. Please refresh the account.', this.account.key.accountId), error);
}
}
const selectedSubscriptions = (await servicePool.subscriptionFilterService.getSelectedSubscriptions(accountNode.account)) || <AzureResourceSubscription[]>[];
let selectedSubscriptions = (await subscriptionFilterService.getSelectedSubscriptions(accountNode.account)) || <azureResource.AzureResourceSubscription[]>[];
const selectedSubscriptionIds: string[] = [];
if (selectedSubscriptions.length > 0) {
selectedSubscriptionIds.push(...selectedSubscriptions.map((subscription) => subscription.id));
@@ -43,11 +56,11 @@ export function registerAzureResourceCommands(apiWrapper: ApiWrapper, tree: Azur
selectedSubscriptionIds.push(...subscriptions.map((subscription) => subscription.id));
}
interface SubscriptionQuickPickItem extends QuickPickItem {
subscription: AzureResourceSubscription;
interface AzureResourceSubscriptionQuickPickItem extends QuickPickItem {
subscription: azureResource.AzureResourceSubscription;
}
const subscriptionItems: SubscriptionQuickPickItem[] = subscriptions.map((subscription) => {
const subscriptionQuickPickItems: AzureResourceSubscriptionQuickPickItem[] = subscriptions.map((subscription) => {
return {
label: subscription.name,
picked: selectedSubscriptionIds.indexOf(subscription.id) !== -1,
@@ -55,66 +68,22 @@ export function registerAzureResourceCommands(apiWrapper: ApiWrapper, tree: Azur
};
});
const pickedSubscriptionItems = (await window.showQuickPick(subscriptionItems, { canPickMany: true }));
if (pickedSubscriptionItems && pickedSubscriptionItems.length > 0) {
const selectedSubscriptionQuickPickItems = (await window.showQuickPick(subscriptionQuickPickItems, { canPickMany: true }));
if (selectedSubscriptionQuickPickItems && selectedSubscriptionQuickPickItems.length > 0) {
tree.refresh(node, false);
const pickedSubscriptions = pickedSubscriptionItems.map((subscriptionItem) => subscriptionItem.subscription);
await servicePool.subscriptionFilterService.saveSelectedSubscriptions(accountNode.account, pickedSubscriptions);
selectedSubscriptions = selectedSubscriptionQuickPickItems.map((subscriptionItem) => subscriptionItem.subscription);
await subscriptionFilterService.saveSelectedSubscriptions(accountNode.account, selectedSubscriptions);
}
});
apiWrapper.registerCommand('azureresource.refreshall', () => tree.notifyNodeChanged(undefined));
appContext.apiWrapper.registerCommand('azure.resource.refreshall', () => tree.notifyNodeChanged(undefined));
apiWrapper.registerCommand('azureresource.refresh', async (node?: TreeNode) => {
appContext.apiWrapper.registerCommand('azure.resource.refresh', async (node?: TreeNode) => {
tree.refresh(node, true);
});
apiWrapper.registerCommand('azureresource.connectsqldb', async (node?: TreeNode) => {
let connectionProfile: sqlops.IConnectionProfile = {
id: generateGuid(),
connectionName: undefined,
serverName: undefined,
databaseName: undefined,
userName: undefined,
password: '',
authenticationType: undefined,
savePassword: true,
groupFullName: '',
groupId: '',
providerName: undefined,
saveProfile: true,
options: {
}
};
if (node instanceof AzureResourceDatabaseServerTreeNode) {
let databaseServer = node.databaseServer;
connectionProfile.connectionName = `connection to '${databaseServer.defaultDatabaseName}' on '${databaseServer.fullName}'`;
connectionProfile.serverName = databaseServer.fullName;
connectionProfile.databaseName = databaseServer.defaultDatabaseName;
connectionProfile.userName = databaseServer.loginName;
connectionProfile.authenticationType = 'SqlLogin';
connectionProfile.providerName = 'MSSQL';
}
if (node instanceof AzureResourceDatabaseTreeNode) {
let database = node.database;
connectionProfile.connectionName = `connection to '${database.name}' on '${database.serverFullName}'`;
connectionProfile.serverName = database.serverFullName;
connectionProfile.databaseName = database.name;
connectionProfile.userName = database.loginName;
connectionProfile.authenticationType = 'SqlLogin';
connectionProfile.providerName = 'MSSQL';
}
const conn = await apiWrapper.openConnectionDialog(undefined, connectionProfile, { saveConnection: true, showDashboard: true });
if (conn) {
apiWrapper.executeCommand('workbench.view.connections');
}
});
apiWrapper.registerCommand('azureresource.signin', async (node?: TreeNode) => {
apiWrapper.executeCommand('sql.action.accounts.manageLinkedAccount');
appContext.apiWrapper.registerCommand('azure.resource.signin', async (node?: TreeNode) => {
appContext.apiWrapper.executeCommand('sql.action.accounts.manageLinkedAccount');
});
}

View File

@@ -6,11 +6,19 @@
'use strict';
export enum AzureResourceItemType {
account = 'azureResource.itemType.account',
subscription = 'azureResource.itemType.subscription',
databaseContainer = 'azureResource.itemType.databaseContainer',
database = 'azureResource.itemType.database',
databaseServerContainer = 'azureResource.itemType.databaseServerContainer',
databaseServer = 'azureResource.itemType.databaseServer',
message = 'azureResource.itemType.message'
account = 'azure.resource.itemType.account',
subscription = 'azure.resource.itemType.subscription',
databaseContainer = 'azure.resource.itemType.databaseContainer',
database = 'azure.resource.itemType.database',
databaseServerContainer = 'azure.resource.itemType.databaseServerContainer',
databaseServer = 'azure.resource.itemType.databaseServer',
message = 'azure.resource.itemType.message'
}
export enum AzureResourceServiceNames {
cacheService = 'AzureResourceCacheService',
accountService = 'AzureResourceAccountService',
subscriptionService = 'AzureResourceSubscriptionService',
subscriptionFilterService = 'AzureResourceSubscriptionFilterService',
tenantService = 'AzureResourceTenantService'
}

View File

@@ -8,7 +8,7 @@
export class AzureResourceCredentialError extends Error {
constructor(
message: string,
public innerError: Error
public readonly innerError: Error
) {
super(message);
}

View File

@@ -6,49 +6,40 @@
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import * as sqlops from 'sqlops';
import { Account, DidChangeAccountsParams } from 'sqlops';
import { Event } from 'vscode';
import { AzureResourceSubscription, AzureResourceDatabaseServer, AzureResourceDatabase } from './models';
import { azureResource } from './azure-resource';
export interface IAzureResourceAccountService {
getAccounts(): Promise<sqlops.Account[]>;
getAccounts(): Promise<Account[]>;
readonly onDidChangeAccounts: Event<sqlops.DidChangeAccountsParams>;
}
export interface IAzureResourceCredentialService {
getCredentials(account: sqlops.Account, resource: sqlops.AzureResource): Promise<ServiceClientCredentials[]>;
readonly onDidChangeAccounts: Event<DidChangeAccountsParams>;
}
export interface IAzureResourceSubscriptionService {
getSubscriptions(account: sqlops.Account, credentials: ServiceClientCredentials[]): Promise<AzureResourceSubscription[]>;
getSubscriptions(account: Account, credential: ServiceClientCredentials): Promise<azureResource.AzureResourceSubscription[]>;
}
export interface IAzureResourceSubscriptionFilterService {
getSelectedSubscriptions(account: sqlops.Account): Promise<AzureResourceSubscription[]>;
getSelectedSubscriptions(account: Account): Promise<azureResource.AzureResourceSubscription[]>;
saveSelectedSubscriptions(account: sqlops.Account, selectedSubscriptions: AzureResourceSubscription[]): Promise<void>;
}
export interface IAzureResourceDatabaseServerService {
getDatabaseServers(subscription: AzureResourceSubscription, credentials: ServiceClientCredentials[]): Promise<AzureResourceDatabaseServer[]>;
}
export interface IAzureResourceDatabaseService {
getDatabases(subscription: AzureResourceSubscription, credentials: ServiceClientCredentials[]): Promise<AzureResourceDatabase[]>;
saveSelectedSubscriptions(account: Account, selectedSubscriptions: azureResource.AzureResourceSubscription[]): Promise<void>;
}
export interface IAzureResourceCacheService {
generateKey(id: string): string;
get<T>(key: string): T | undefined;
update<T>(key: string, value: T): void;
}
export interface IAzureResourceContextService {
getAbsolutePath(relativePath: string): string;
executeCommand(commandId: string, ...args: any[]): void;
showErrorMessage(errorMessage: string): void;
export interface IAzureResourceTenantService {
getTenantId(subscription: azureResource.AzureResourceSubscription): Promise<string>;
}
export interface IAzureResourceNodeWithProviderId {
resourceProviderId: string;
resourceNode: azureResource.IAzureResourceNode;
}

View File

@@ -7,9 +7,9 @@
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import { AzureResourceItemType } from '../constants';
import { TreeNode } from './treeNode';
import { AzureResourceItemType } from './constants';
export class AzureResourceMessageTreeNode extends TreeNode {
public constructor(

View File

@@ -0,0 +1,53 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { IConnectionProfile } from 'sqlops';
import { AppContext } from '../../../appContext';
import { TreeNode } from '../../treeNode';
import { generateGuid } from '../../utils';
import { AzureResourceItemType } from '../../constants';
import { IAzureResourceDatabaseNode } from './interfaces';
import { AzureResourceResourceTreeNode } from '../../resourceTreeNode';
export function registerAzureResourceDatabaseCommands(appContext: AppContext): void {
appContext.apiWrapper.registerCommand('azure.resource.connectsqldb', async (node?: TreeNode) => {
if (!node)
{
return;
}
const treeItem = await node.getTreeItem();
if (treeItem.contextValue !== AzureResourceItemType.database) {
return;
}
const resourceNode = (node as AzureResourceResourceTreeNode).resourceNodeWithProviderId.resourceNode;
const database = (resourceNode as IAzureResourceDatabaseNode).database;
let connectionProfile: IConnectionProfile = {
id: generateGuid(),
connectionName: undefined,
serverName: database.serverFullName,
databaseName: database.name,
userName: database.loginName,
password: '',
authenticationType: 'SqlLogin',
savePassword: true,
groupFullName: '',
groupId: '',
providerName: 'MSSQL',
saveProfile: true,
options: {}
};
const conn = await appContext.apiWrapper.openConnectionDialog(undefined, connectionProfile, { saveConnection: true, showDashboard: true });
if (conn) {
appContext.apiWrapper.executeCommand('workbench.view.connections');
}
});
}

View File

@@ -0,0 +1,37 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ExtensionContext } from 'vscode';
import { ApiWrapper } from '../../../apiWrapper';
import { azureResource } from '../../azure-resource';
import { IAzureResourceDatabaseService } from './interfaces';
import { AzureResourceDatabaseTreeDataProvider } from './databaseTreeDataProvider';
export class AzureResourceDatabaseProvider implements azureResource.IAzureResourceProvider {
public constructor(
databaseService: IAzureResourceDatabaseService,
apiWrapper: ApiWrapper,
extensionContext: ExtensionContext
) {
this._databaseService = databaseService;
this._apiWrapper = apiWrapper;
this._extensionContext = extensionContext;
}
public getTreeDataProvider(): azureResource.IAzureResourceTreeDataProvider {
return new AzureResourceDatabaseTreeDataProvider(this._databaseService, this._apiWrapper, this._extensionContext);
}
public get providerId(): string {
return 'azure.resource.providers.database';
}
private _databaseService: IAzureResourceDatabaseService = undefined;
private _apiWrapper: ApiWrapper = undefined;
private _extensionContext: ExtensionContext = undefined;
}

View File

@@ -0,0 +1,41 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import { SqlManagementClient } from 'azure-arm-sql';
import { azureResource } from '../../azure-resource';
import { IAzureResourceDatabaseService } from './interfaces';
import { AzureResourceDatabase } from './models';
export class AzureResourceDatabaseService implements IAzureResourceDatabaseService {
public async getDatabases(subscription: azureResource.AzureResourceSubscription, credential: ServiceClientCredentials): Promise<AzureResourceDatabase[]> {
const databases: AzureResourceDatabase[] = [];
const sqlManagementClient = new SqlManagementClient(credential, subscription.id);
const svrs = await sqlManagementClient.servers.list();
for (const svr of svrs) {
// Extract resource group name from svr.id
const svrIdRegExp = new RegExp(`\/subscriptions\/${subscription.id}\/resourceGroups\/(.+)\/providers\/Microsoft\.Sql\/servers\/${svr.name}`);
if (!svrIdRegExp.test(svr.id)) {
continue;
}
const founds = svrIdRegExp.exec(svr.id);
const resouceGroup = founds[1];
const dbs = await sqlManagementClient.databases.listByServer(resouceGroup, svr.name);
dbs.forEach((db) => databases.push({
name: db.name,
serverName: svr.name,
serverFullName: svr.fullyQualifiedDomainName,
loginName: svr.administratorLogin
}));
}
return databases;
}
}

View File

@@ -0,0 +1,87 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { AzureResource } from 'sqlops';
import { TreeItem, TreeItemCollapsibleState, ExtensionContext } from 'vscode';
import { TokenCredentials } from 'ms-rest';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { azureResource } from '../../azure-resource';
import { IAzureResourceDatabaseService, IAzureResourceDatabaseNode } from './interfaces';
import { AzureResourceDatabase } from './models';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { ApiWrapper } from '../../../apiWrapper';
export class AzureResourceDatabaseTreeDataProvider implements azureResource.IAzureResourceTreeDataProvider {
public constructor(
databaseService: IAzureResourceDatabaseService,
apiWrapper: ApiWrapper,
extensionContext: ExtensionContext
) {
this._databaseService = databaseService;
this._apiWrapper = apiWrapper;
this._extensionContext = extensionContext;
}
public getTreeItem(element: azureResource.IAzureResourceNode): TreeItem | Thenable<TreeItem> {
return element.treeItem;
}
public async getChildren(element?: azureResource.IAzureResourceNode): Promise<azureResource.IAzureResourceNode[]> {
if (!element) {
return [this.createContainerNode()];
}
const tokens = await this._apiWrapper.getSecurityToken(element.account, AzureResource.ResourceManagement);
const credential = new TokenCredentials(tokens[element.tenantId].token, tokens[element.tenantId].tokenType);
const databases: AzureResourceDatabase[] = (await this._databaseService.getDatabases(element.subscription, credential)) || <AzureResourceDatabase[]>[];
return databases.map((database) => <IAzureResourceDatabaseNode>{
account: element.account,
subscription: element.subscription,
tenantId: element.tenantId,
database: database,
treeItem: {
id: `databaseServer_${database.serverFullName}.database_${database.name}`,
label: `${database.name} (${database.serverName})`,
iconPath: {
dark: this._extensionContext.asAbsolutePath('resources/dark/sql_database_inverse.svg'),
light: this._extensionContext.asAbsolutePath('resources/light/sql_database.svg')
},
collapsibleState: TreeItemCollapsibleState.None,
contextValue: AzureResourceItemType.database
}
});
}
private createContainerNode(): azureResource.IAzureResourceNode {
return {
account: undefined,
subscription: undefined,
tenantId: undefined,
treeItem: {
id: AzureResourceDatabaseTreeDataProvider.containerId,
label: AzureResourceDatabaseTreeDataProvider.containerLabel,
iconPath: {
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseContainer
}
};
}
private _databaseService: IAzureResourceDatabaseService = undefined;
private _apiWrapper: ApiWrapper = undefined;
private _extensionContext: ExtensionContext = undefined;
private static readonly containerId = 'azure.resource.providers.database.treeDataProvider.databaseContainer';
private static readonly containerLabel = localize('azure.resource.providers.database.treeDataProvider.databaseContainerLabel', 'SQL Databases');
}

View File

@@ -0,0 +1,19 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import { azureResource } from '../../azure-resource';
import { AzureResourceDatabase } from './models';
export interface IAzureResourceDatabaseService {
getDatabases(subscription: azureResource.AzureResourceSubscription, credential: ServiceClientCredentials): Promise<AzureResourceDatabase[]>;
}
export interface IAzureResourceDatabaseNode extends azureResource.IAzureResourceNode {
readonly database: AzureResourceDatabase;
}

View File

@@ -0,0 +1,13 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
export interface AzureResourceDatabase {
name: string;
serverName: string;
serverFullName: string;
loginName: string;
}

View File

@@ -0,0 +1,53 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { IConnectionProfile } from 'sqlops';
import { AppContext } from '../../../appContext';
import { TreeNode } from '../../treeNode';
import { generateGuid } from '../../utils';
import { AzureResourceItemType } from '../../constants';
import { IAzureResourceDatabaseServerNode } from './interfaces';
import { AzureResourceResourceTreeNode } from '../../resourceTreeNode';
export function registerAzureResourceDatabaseServerCommands(appContext: AppContext): void {
appContext.apiWrapper.registerCommand('azure.resource.connectsqlserver', async (node?: TreeNode) => {
if (!node)
{
return;
}
const treeItem = await node.getTreeItem();
if (treeItem.contextValue !== AzureResourceItemType.databaseServer) {
return;
}
const resourceNode = (node as AzureResourceResourceTreeNode).resourceNodeWithProviderId.resourceNode;
const databaseServer = (resourceNode as IAzureResourceDatabaseServerNode).databaseServer;
let connectionProfile: IConnectionProfile = {
id: generateGuid(),
connectionName: undefined,
serverName: databaseServer.fullName,
databaseName: databaseServer.defaultDatabaseName,
userName: databaseServer.loginName,
password: '',
authenticationType: 'SqlLogin',
savePassword: true,
groupFullName: '',
groupId: '',
providerName: 'MSSQL',
saveProfile: true,
options: {}
};
const conn = await appContext.apiWrapper.openConnectionDialog(undefined, connectionProfile, { saveConnection: true, showDashboard: true });
if (conn) {
appContext.apiWrapper.executeCommand('workbench.view.connections');
}
});
}

View File

@@ -0,0 +1,37 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ExtensionContext } from 'vscode';
import { ApiWrapper } from '../../../apiWrapper';
import { azureResource } from '../../azure-resource';
import { IAzureResourceDatabaseServerService } from './interfaces';
import { AzureResourceDatabaseServerTreeDataProvider } from './databaseServerTreeDataProvider';
export class AzureResourceDatabaseServerProvider implements azureResource.IAzureResourceProvider {
public constructor(
databaseServerService: IAzureResourceDatabaseServerService,
apiWrapper: ApiWrapper,
extensionContext: ExtensionContext
) {
this._databaseServerService = databaseServerService;
this._apiWrapper = apiWrapper;
this._extensionContext = extensionContext;
}
public getTreeDataProvider(): azureResource.IAzureResourceTreeDataProvider {
return new AzureResourceDatabaseServerTreeDataProvider(this._databaseServerService, this._apiWrapper, this._extensionContext);
}
public get providerId(): string {
return 'azure.resource.providers.databaseServer';
}
private _databaseServerService: IAzureResourceDatabaseServerService = undefined;
private _apiWrapper: ApiWrapper = undefined;
private _extensionContext: ExtensionContext = undefined;
}

View File

@@ -0,0 +1,31 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import { SqlManagementClient } from 'azure-arm-sql';
import { azureResource } from '../../azure-resource';
import { IAzureResourceDatabaseServerService } from './interfaces';
import { AzureResourceDatabaseServer } from './models';
export class AzureResourceDatabaseServerService implements IAzureResourceDatabaseServerService {
public async getDatabaseServers(subscription: azureResource.AzureResourceSubscription, credential: ServiceClientCredentials): Promise<AzureResourceDatabaseServer[]> {
const databaseServers: AzureResourceDatabaseServer[] = [];
const sqlManagementClient = new SqlManagementClient(credential, subscription.id);
const svrs = await sqlManagementClient.servers.list();
svrs.forEach((svr) => databaseServers.push({
name: svr.name,
fullName: svr.fullyQualifiedDomainName,
loginName: svr.administratorLogin,
defaultDatabaseName: 'master'
}));
return databaseServers;
}
}

View File

@@ -0,0 +1,87 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { AzureResource } from 'sqlops';
import { TreeItem, TreeItemCollapsibleState, ExtensionContext } from 'vscode';
import { TokenCredentials } from 'ms-rest';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { azureResource } from '../../azure-resource';
import { IAzureResourceDatabaseServerService, IAzureResourceDatabaseServerNode } from './interfaces';
import { AzureResourceDatabaseServer } from './models';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { ApiWrapper } from '../../../apiWrapper';
export class AzureResourceDatabaseServerTreeDataProvider implements azureResource.IAzureResourceTreeDataProvider {
public constructor(
databaseServerService: IAzureResourceDatabaseServerService,
apiWrapper: ApiWrapper,
extensionContext: ExtensionContext
) {
this._databaseServerService = databaseServerService;
this._apiWrapper = apiWrapper;
this._extensionContext = extensionContext;
}
public getTreeItem(element: azureResource.IAzureResourceNode): TreeItem | Thenable<TreeItem> {
return element.treeItem;
}
public async getChildren(element?: azureResource.IAzureResourceNode): Promise<azureResource.IAzureResourceNode[]> {
if (!element) {
return [this.createContainerNode()];
}
const tokens = await this._apiWrapper.getSecurityToken(element.account, AzureResource.ResourceManagement);
const credential = new TokenCredentials(tokens[element.tenantId].token, tokens[element.tenantId].tokenType);
const databaseServers: AzureResourceDatabaseServer[] = (await this._databaseServerService.getDatabaseServers(element.subscription, credential)) || <AzureResourceDatabaseServer[]>[];
return databaseServers.map((databaseServer) => <IAzureResourceDatabaseServerNode>{
account: element.account,
subscription: element.subscription,
tenantId: element.tenantId,
databaseServer: databaseServer,
treeItem: {
id: `databaseServer_${databaseServer.name}`,
label: databaseServer.name,
iconPath: {
dark: this._extensionContext.asAbsolutePath('resources/dark/sql_server_inverse.svg'),
light: this._extensionContext.asAbsolutePath('resources/light/sql_server.svg')
},
collapsibleState: TreeItemCollapsibleState.None,
contextValue: AzureResourceItemType.databaseServer
}
});
}
private createContainerNode(): azureResource.IAzureResourceNode {
return {
account: undefined,
subscription: undefined,
tenantId: undefined,
treeItem: {
id: AzureResourceDatabaseServerTreeDataProvider.containerId,
label: AzureResourceDatabaseServerTreeDataProvider.containerLabel,
iconPath: {
dark: this._extensionContext.asAbsolutePath('resources/dark/folder_inverse.svg'),
light: this._extensionContext.asAbsolutePath('resources/light/folder.svg')
},
collapsibleState: TreeItemCollapsibleState.Collapsed,
contextValue: AzureResourceItemType.databaseServerContainer
}
};
}
private _databaseServerService: IAzureResourceDatabaseServerService = undefined;
private _apiWrapper: ApiWrapper = undefined;
private _extensionContext: ExtensionContext = undefined;
private static readonly containerId = 'azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainer';
private static readonly containerLabel = localize('azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainerLabel', 'SQL Servers');
}

View File

@@ -0,0 +1,19 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import { azureResource } from '../../azure-resource';
import { AzureResourceDatabaseServer } from './models';
export interface IAzureResourceDatabaseServerService {
getDatabaseServers(subscription: azureResource.AzureResourceSubscription, credentials: ServiceClientCredentials): Promise<AzureResourceDatabaseServer[]>;
}
export interface IAzureResourceDatabaseServerNode extends azureResource.IAzureResourceNode {
readonly databaseServer: AzureResourceDatabaseServer;
}

View File

@@ -5,21 +5,9 @@
'use strict';
export interface AzureResourceSubscription {
id: string;
name: string;
}
export interface AzureResourceDatabaseServer {
name: string;
fullName: string;
loginName: string;
defaultDatabaseName: string;
}
export interface AzureResourceDatabase {
name: string;
serverName: string;
serverFullName: string;
loginName: string;
}
}

View File

@@ -0,0 +1,129 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { extensions, TreeItem } from 'vscode';
import { Account } from 'sqlops';
import { azureResource } from './azure-resource';
import { IAzureResourceNodeWithProviderId } from './interfaces';
export class AzureResourceService {
private constructor() {
}
public static getInstance(): AzureResourceService {
return AzureResourceService._instance;
}
public async listResourceProviderIds(): Promise<string[]> {
await this.ensureResourceProvidersRegistered();
return Object.keys(this._resourceProviders);
}
public registerResourceProvider(resourceProvider: azureResource.IAzureResourceProvider): void {
this.doRegisterResourceProvider(resourceProvider);
}
public clearResourceProviders(): void {
this._resourceProviders = {};
this._treeDataProviders = {};
this._areResourceProvidersLoaded = false;
}
public async getRootChildren(resourceProviderId: string, account: Account, subscription: azureResource.AzureResourceSubscription, tenatId: string): Promise<IAzureResourceNodeWithProviderId[]> {
await this.ensureResourceProvidersRegistered();
if (!(resourceProviderId in this._resourceProviders)) {
throw new Error(`Azure resource provider doesn't exist. Id: ${resourceProviderId}`);
}
const treeDataProvider = this._treeDataProviders[resourceProviderId];
const children = await treeDataProvider.getChildren();
return children.map((child) => <IAzureResourceNodeWithProviderId>{
resourceProviderId: resourceProviderId,
resourceNode: <azureResource.IAzureResourceNode>{
account: account,
subscription: subscription,
tenantId: tenatId,
treeItem: child.treeItem
}
});
}
public async getChildren(resourceProviderId: string, element: azureResource.IAzureResourceNode): Promise<IAzureResourceNodeWithProviderId[]> {
await this.ensureResourceProvidersRegistered();
if (!(resourceProviderId in this._resourceProviders)) {
throw new Error(`Azure resource provider doesn't exist. Id: ${resourceProviderId}`);
}
const treeDataProvider = this._treeDataProviders[resourceProviderId];
const children = await treeDataProvider.getChildren(element);
return children.map((child) => <IAzureResourceNodeWithProviderId>{
resourceProviderId: resourceProviderId,
resourceNode: child
});
}
public async getTreeItem(resourceProviderId: string, element?: azureResource.IAzureResourceNode): Promise<TreeItem> {
await this.ensureResourceProvidersRegistered();
if (!(resourceProviderId in this._resourceProviders)) {
throw new Error(`Azure resource provider doesn't exist. Id: ${resourceProviderId}`);
}
const treeDataProvider = this._treeDataProviders[resourceProviderId];
return treeDataProvider.getTreeItem(element);
}
public get areResourceProvidersLoaded(): boolean {
return this._areResourceProvidersLoaded;
}
public set areResourceProvidersLoaded(value: boolean) {
this._areResourceProvidersLoaded = value;
}
private async ensureResourceProvidersRegistered(): Promise<void> {
if (this._areResourceProvidersLoaded) {
return;
}
for (const extension of extensions.all) {
const contributes = extension.packageJSON && extension.packageJSON.contributes;
if (!contributes) {
continue;
}
if (contributes['hasAzureResourceProviders']) {
await extension.activate();
if (extension.exports && extension.exports.provideResources) {
for (const resourceProvider of <azureResource.IAzureResourceProvider[]>extension.exports.provideResources()) {
this.doRegisterResourceProvider(resourceProvider);
}
}
}
}
this._areResourceProvidersLoaded = true;
}
private doRegisterResourceProvider(resourceProvider: azureResource.IAzureResourceProvider): void {
this._resourceProviders[resourceProvider.providerId] = resourceProvider;
this._treeDataProviders[resourceProvider.providerId] = resourceProvider.getTreeDataProvider();
}
private _areResourceProvidersLoaded: boolean = false;
private _resourceProviders: { [resourceProviderId: string]: azureResource.IAzureResourceProvider } = {};
private _treeDataProviders: { [resourceProviderId: string]: azureResource.IAzureResourceTreeDataProvider } = {};
private static readonly _instance = new AzureResourceService();
}

View File

@@ -0,0 +1,79 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { NodeInfo } from 'sqlops';
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { TreeNode } from './treeNode';
import { AzureResourceService } from './resourceService';
import { IAzureResourceNodeWithProviderId } from './interfaces';
import { AzureResourceMessageTreeNode } from './messageTreeNode';
import { AzureResourceErrorMessageUtil } from './utils';
export class AzureResourceResourceTreeNode extends TreeNode {
public constructor(
public readonly resourceNodeWithProviderId: IAzureResourceNodeWithProviderId,
parent: TreeNode
) {
super();
this.parent = parent;
}
public async getChildren(): Promise<TreeNode[]> {
// It is a leaf node.
if (this.resourceNodeWithProviderId.resourceNode.treeItem.collapsibleState === TreeItemCollapsibleState.None) {
return <TreeNode[]>[];
}
try {
const children = await this._resourceService.getChildren(this.resourceNodeWithProviderId.resourceProviderId, this.resourceNodeWithProviderId.resourceNode);
if (children.length === 0) {
return [AzureResourceMessageTreeNode.create(AzureResourceResourceTreeNode.noResourcesLabel, this)];
} else {
return children.map((child) => {
// To make tree node's id unique, otherwise, treeModel.js would complain 'item already registered'
child.resourceNode.treeItem.id = `${this.resourceNodeWithProviderId.resourceNode.treeItem.id}.${child.resourceNode.treeItem.id}`;
return new AzureResourceResourceTreeNode(child, this);
});
}
} catch (error) {
return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), this)];
}
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
return this._resourceService.getTreeItem(this.resourceNodeWithProviderId.resourceProviderId, this.resourceNodeWithProviderId.resourceNode);
}
public getNodeInfo(): NodeInfo {
const treeItem = this.resourceNodeWithProviderId.resourceNode.treeItem;
return {
label: treeItem.label,
isLeaf: treeItem.collapsibleState === TreeItemCollapsibleState.None ? true : false,
errorMessage: undefined,
metadata: undefined,
nodePath: this.generateNodePath(),
nodeStatus: undefined,
nodeType: treeItem.contextValue,
nodeSubType: undefined,
iconType: treeItem.contextValue
};
}
public get nodePathValue(): string {
return this.resourceNodeWithProviderId.resourceNode.treeItem.id;
}
private _resourceService = AzureResourceService.getInstance();
private static readonly noResourcesLabel = localize('azure.resource.resourceTreeNode.noResourcesLabel', 'No Resources found.');
}

View File

@@ -1,35 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {
IAzureResourceAccountService,
IAzureResourceCredentialService,
IAzureResourceSubscriptionService,
IAzureResourceSubscriptionFilterService,
IAzureResourceDatabaseService,
IAzureResourceDatabaseServerService,
IAzureResourceCacheService,
IAzureResourceContextService } from './interfaces';
export class AzureResourceServicePool {
private constructor() { }
public static getInstance(): AzureResourceServicePool {
return AzureResourceServicePool._instance;
}
public contextService: IAzureResourceContextService;
public cacheService: IAzureResourceCacheService;
public accountService: IAzureResourceAccountService;
public credentialService: IAzureResourceCredentialService;
public subscriptionService: IAzureResourceSubscriptionService;
public subscriptionFilterService: IAzureResourceSubscriptionFilterService;
public databaseService: IAzureResourceDatabaseService;
public databaseServerService: IAzureResourceDatabaseServerService;
private static readonly _instance = new AzureResourceServicePool();
}

View File

@@ -5,21 +5,30 @@
'use strict';
import { ExtensionContext } from "vscode";
import { ExtensionContext } from 'vscode';
import { IAzureResourceCacheService } from "../interfaces";
import { IAzureResourceCacheService } from '../interfaces';
export class AzureResourceCacheService implements IAzureResourceCacheService {
public constructor(
public readonly context: ExtensionContext
context: ExtensionContext
) {
this._context = context;
}
public get<T>(key: string): T | undefined {
return this.context.workspaceState.get(key);
public generateKey(id: string): string {
return `${AzureResourceCacheService.cacheKeyPrefix}.${id}`;
}
public get<T>(key: string): T | undefined {
return this._context.workspaceState.get(key);
}
public update<T>(key: string, value: T): void {
this.context.workspaceState.update(key, value);
this._context.workspaceState.update(key, value);
}
private _context: ExtensionContext = undefined;
private static readonly cacheKeyPrefix = 'azure.resource.cache';
}

View File

@@ -1,36 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ExtensionContext } from "vscode";
import { ApiWrapper } from "../../apiWrapper";
import { IAzureResourceContextService } from "../interfaces";
export class AzureResourceContextService implements IAzureResourceContextService {
public constructor(
context: ExtensionContext,
apiWrapper: ApiWrapper
) {
this._context = context;
this._apiWrapper = apiWrapper;
}
public getAbsolutePath(relativePath: string): string {
return this._context.asAbsolutePath(relativePath);
}
public executeCommand(commandId: string, ...args: any[]): void {
this._apiWrapper.executeCommand(commandId, args);
}
public showErrorMessage(errorMessage: string): void {
this._apiWrapper.showErrorMessage(errorMessage);
}
private _context: ExtensionContext = undefined;
private _apiWrapper: ApiWrapper = undefined;
}

View File

@@ -1,43 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as sqlops from 'sqlops';
import { TokenCredentials, ServiceClientCredentials } from 'ms-rest';
import { ApiWrapper } from '../../apiWrapper';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { IAzureResourceCredentialService } from '../interfaces';
import { AzureResourceCredentialError } from '../errors';
export class AzureResourceCredentialService implements IAzureResourceCredentialService {
public constructor(
apiWrapper: ApiWrapper
) {
this._apiWrapper = apiWrapper;
}
public async getCredentials(account: sqlops.Account, resource: sqlops.AzureResource): Promise<ServiceClientCredentials[]> {
try {
let credentials: TokenCredentials[] = [];
let tokens = await this._apiWrapper.getSecurityToken(account, resource);
for (let tenant of account.properties.tenants) {
let token = tokens[tenant.id].token;
let tokenType = tokens[tenant.id].tokenType;
credentials.push(new TokenCredentials(token, tokenType));
}
return credentials;
} catch (error) {
throw new AzureResourceCredentialError(localize('azureResource.services.credentialService.credentialError', 'Failed to get credential for account {0}. Please refresh the account.', account.key.accountId), error);
}
}
private _apiWrapper: ApiWrapper = undefined;
}

View File

@@ -1,39 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import { SqlManagementClient } from 'azure-arm-sql';
import { IAzureResourceDatabaseServerService } from '../interfaces';
import { AzureResourceSubscription, AzureResourceDatabaseServer } from '../models';
export class AzureResourceDatabaseServerService implements IAzureResourceDatabaseServerService {
public async getDatabaseServers(subscription: AzureResourceSubscription, credentials: ServiceClientCredentials[]): Promise<AzureResourceDatabaseServer[]> {
let databaseServers: AzureResourceDatabaseServer[] = [];
for (let cred of credentials) {
let sqlManagementClient = new SqlManagementClient(cred, subscription.id);
try {
let svrs = await sqlManagementClient.servers.list();
svrs.forEach((svr) => databaseServers.push({
name: svr.name,
fullName: svr.fullyQualifiedDomainName,
loginName: svr.administratorLogin,
defaultDatabaseName: 'master'
}));
} catch (error) {
if (error.code === 'InvalidAuthenticationTokenTenant' && error.statusCode === 401) {
/**
* There may be multiple tenants for an account and it may throw exceptions like following. Just swallow the exception here.
* The access token is from the wrong issuer. It must match one of the tenants associated with this subscription.
*/
}
}
}
return databaseServers;
}
}

View File

@@ -1,51 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { ServiceClientCredentials } from 'ms-rest';
import { SqlManagementClient } from 'azure-arm-sql';
import { IAzureResourceDatabaseService } from '../interfaces';
import { AzureResourceSubscription, AzureResourceDatabase } from '../models';
export class AzureResourceDatabaseService implements IAzureResourceDatabaseService {
public async getDatabases(subscription: AzureResourceSubscription, credentials: ServiceClientCredentials[]): Promise<AzureResourceDatabase[]> {
let databases: AzureResourceDatabase[] = [];
for (let cred of credentials) {
let sqlManagementClient = new SqlManagementClient(cred, subscription.id);
try {
let svrs = await sqlManagementClient.servers.list();
for (let svr of svrs) {
// Extract resource group name from svr.id
let svrIdRegExp = new RegExp(`\/subscriptions\/${subscription.id}\/resourceGroups\/(.+)\/providers\/Microsoft\.Sql\/servers\/${svr.name}`);
if (!svrIdRegExp.test(svr.id)) {
continue;
}
let founds = svrIdRegExp.exec(svr.id);
let resouceGroup = founds[1];
let dbs = await sqlManagementClient.databases.listByServer(resouceGroup, svr.name);
dbs.forEach((db) => databases.push({
name: db.name,
serverName: svr.name,
serverFullName: svr.fullyQualifiedDomainName,
loginName: svr.administratorLogin
}));
}
} catch (error) {
if (error.code === 'InvalidAuthenticationTokenTenant' && error.statusCode === 401) {
/**
* There may be multiple tenants for an account and it may throw exceptions like following. Just swallow the exception here.
* The access token is from the wrong issuer. It must match one of the tenants associated with this subscription.
*/
}
}
}
return databases;
}
}

View File

@@ -8,11 +8,11 @@
import { WorkspaceConfiguration, ConfigurationTarget } from 'vscode';
import { Account } from 'sqlops';
import { azureResource } from '../azure-resource';
import { IAzureResourceSubscriptionFilterService, IAzureResourceCacheService } from '../interfaces';
import { AzureResourceSubscription } from '../models';
interface AzureResourceSelectedSubscriptionsCache {
selectedSubscriptions: { [accountId: string]: AzureResourceSubscription[]};
selectedSubscriptions: { [accountId: string]: azureResource.AzureResourceSubscription[]};
}
export class AzureResourceSubscriptionFilterService implements IAzureResourceSubscriptionFilterService {
@@ -20,12 +20,14 @@ export class AzureResourceSubscriptionFilterService implements IAzureResourceSub
cacheService: IAzureResourceCacheService
) {
this._cacheService = cacheService;
this._cacheKey = this._cacheService.generateKey('selectedSubscriptions');
}
public async getSelectedSubscriptions(account: Account): Promise<AzureResourceSubscription[]> {
let selectedSubscriptions: AzureResourceSubscription[] = [];
public async getSelectedSubscriptions(account: Account): Promise<azureResource.AzureResourceSubscription[]> {
let selectedSubscriptions: azureResource.AzureResourceSubscription[] = [];
const cache = this._cacheService.get<AzureResourceSelectedSubscriptionsCache>(AzureResourceSubscriptionFilterService.CacheKey);
const cache = this._cacheService.get<AzureResourceSelectedSubscriptionsCache>(this._cacheKey);
if (cache) {
selectedSubscriptions = cache.selectedSubscriptions[account.key.accountId];
}
@@ -33,10 +35,10 @@ export class AzureResourceSubscriptionFilterService implements IAzureResourceSub
return selectedSubscriptions;
}
public async saveSelectedSubscriptions(account: Account, selectedSubscriptions: AzureResourceSubscription[]): Promise<void> {
let selectedSubscriptionsCache: { [accountId: string]: AzureResourceSubscription[]} = {};
public async saveSelectedSubscriptions(account: Account, selectedSubscriptions: azureResource.AzureResourceSubscription[]): Promise<void> {
let selectedSubscriptionsCache: { [accountId: string]: azureResource.AzureResourceSubscription[]} = {};
const cache = this._cacheService.get<AzureResourceSelectedSubscriptionsCache>(AzureResourceSubscriptionFilterService.CacheKey);
const cache = this._cacheService.get<AzureResourceSelectedSubscriptionsCache>(this._cacheKey);
if (cache) {
selectedSubscriptionsCache = cache.selectedSubscriptions;
}
@@ -47,14 +49,14 @@ export class AzureResourceSubscriptionFilterService implements IAzureResourceSub
selectedSubscriptionsCache[account.key.accountId] = selectedSubscriptions;
this._cacheService.update<AzureResourceSelectedSubscriptionsCache>(AzureResourceSubscriptionFilterService.CacheKey, { selectedSubscriptions: selectedSubscriptionsCache });
this._cacheService.update<AzureResourceSelectedSubscriptionsCache>(this._cacheKey, { selectedSubscriptions: selectedSubscriptionsCache });
const filters: string[] = [];
for (const accountId in selectedSubscriptionsCache) {
filters.push(...selectedSubscriptionsCache[accountId].map((subcription) => `${accountId}/${subcription.id}/${subcription.name}`));
}
const resourceFilterConfig = this._config.inspect<string[]>(AzureResourceSubscriptionFilterService.FilterConfigName);
const resourceFilterConfig = this._config.inspect<string[]>(AzureResourceSubscriptionFilterService.filterConfigName);
let configTarget = ConfigurationTarget.Global;
if (resourceFilterConfig) {
if (resourceFilterConfig.workspaceFolderValue) {
@@ -66,12 +68,12 @@ export class AzureResourceSubscriptionFilterService implements IAzureResourceSub
}
}
await this._config.update(AzureResourceSubscriptionFilterService.FilterConfigName, filters, configTarget);
await this._config.update(AzureResourceSubscriptionFilterService.filterConfigName, filters, configTarget);
}
private _config: WorkspaceConfiguration = undefined;
private _cacheService: IAzureResourceCacheService = undefined;
private _cacheKey: string = undefined;
private static readonly FilterConfigName = 'resourceFilter';
private static readonly CacheKey = 'azureResource.cache.selectedSubscriptions';
private static readonly filterConfigName = 'azure.resource.config.filter';
}

View File

@@ -9,24 +9,19 @@ import { Account } from 'sqlops';
import { ServiceClientCredentials } from 'ms-rest';
import { SubscriptionClient } from 'azure-arm-resource';
import { azureResource } from '../azure-resource';
import { IAzureResourceSubscriptionService } from '../interfaces';
import { AzureResourceSubscription } from '../models';
export class AzureResourceSubscriptionService implements IAzureResourceSubscriptionService {
public async getSubscriptions(account: Account, credentials: ServiceClientCredentials[]): Promise<AzureResourceSubscription[]> {
let subscriptions: AzureResourceSubscription[] = [];
for (let cred of credentials) {
let subClient = new SubscriptionClient.SubscriptionClient(cred);
try {
let subs = await subClient.subscriptions.list();
subs.forEach((sub) => subscriptions.push({
id: sub.subscriptionId,
name: sub.displayName
}));
} catch (error) {
// Swallow the exception here.
}
}
public async getSubscriptions(account: Account, credential: ServiceClientCredentials): Promise<azureResource.AzureResourceSubscription[]> {
const subscriptions: azureResource.AzureResourceSubscription[] = [];
const subClient = new SubscriptionClient.SubscriptionClient(credential);
const subs = await subClient.subscriptions.list();
subs.forEach((sub) => subscriptions.push({
id: sub.subscriptionId,
name: sub.displayName
}));
return subscriptions;
}

View File

@@ -0,0 +1,32 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as request from 'request';
import { azureResource } from '../azure-resource';
import { IAzureResourceTenantService } from '../interfaces';
export class AzureResourceTenantService implements IAzureResourceTenantService {
public async getTenantId(subscription: azureResource.AzureResourceSubscription): Promise<string> {
const requestPromisified = new Promise<string>((resolve, reject) => {
const url = `https://management.azure.com/subscriptions/${subscription.id}?api-version=2014-04-01`;
request(url, function (error, response, body) {
if (response.statusCode === 401) {
const tenantIdRegEx = /authorization_uri="https:\/\/login\.windows\.net\/([0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12})"/;
const teantIdString = response.headers['www-authenticate'];
if (tenantIdRegEx.test(teantIdString)) {
resolve(tenantIdRegEx.exec(teantIdString)[1]);
} else {
reject();
}
}
});
});
return await requestPromisified;
}
}

View File

@@ -7,10 +7,10 @@
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { TreeNode } from '../treeNode';
import { AzureResourceItemType } from '../constants';
export class AzureResourceAccountNotSignedInTreeNode extends TreeNode {
@@ -19,11 +19,11 @@ export class AzureResourceAccountNotSignedInTreeNode extends TreeNode {
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(AzureResourceAccountNotSignedInTreeNode.SignInLabel, TreeItemCollapsibleState.None);
let item = new TreeItem(AzureResourceAccountNotSignedInTreeNode.signInLabel, TreeItemCollapsibleState.None);
item.contextValue = AzureResourceItemType.message;
item.command = {
title: AzureResourceAccountNotSignedInTreeNode.SignInLabel,
command: 'azureresource.signin',
title: AzureResourceAccountNotSignedInTreeNode.signInLabel,
command: 'azure.resource.signin',
arguments: [this]
};
return item;
@@ -31,7 +31,7 @@ export class AzureResourceAccountNotSignedInTreeNode extends TreeNode {
public getNodeInfo(): NodeInfo {
return {
label: AzureResourceAccountNotSignedInTreeNode.SignInLabel,
label: AzureResourceAccountNotSignedInTreeNode.signInLabel,
isLeaf: true,
errorMessage: undefined,
metadata: undefined,
@@ -47,5 +47,5 @@ export class AzureResourceAccountNotSignedInTreeNode extends TreeNode {
return 'message_accountNotSignedIn';
}
private static readonly SignInLabel = localize('azureResource.tree.accountNotSignedInTreeNode.signIn', 'Sign in to Azure ...');
private static readonly signInLabel = localize('azure.resource.tree.accountNotSignedInTreeNode.signInLabel', 'Sign in to Azure ...');
}

View File

@@ -6,44 +6,59 @@
'use strict';
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { Account, NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import { Account, NodeInfo, AzureResource } from 'sqlops';
import { TokenCredentials } from 'ms-rest';
import { AppContext } from '../../appContext';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { azureResource } from '../azure-resource';
import { TreeNode } from '../treeNode';
import { AzureResourceCredentialError } from '../errors';
import { AzureResourceContainerTreeNodeBase } from './baseTreeNodes';
import { AzureResourceItemType } from '../constants';
import { AzureResourceItemType, AzureResourceServiceNames } from '../constants';
import { AzureResourceSubscriptionTreeNode } from './subscriptionTreeNode';
import { AzureResourceMessageTreeNode } from './messageTreeNode';
import { AzureResourceMessageTreeNode } from '../messageTreeNode';
import { AzureResourceErrorMessageUtil } from '../utils';
import { AzureResourceSubscription } from '../models';
import { IAzureResourceTreeChangeHandler } from './treeProvider';
import { IAzureResourceTreeChangeHandler } from './treeChangeHandler';
import { IAzureResourceSubscriptionService, IAzureResourceSubscriptionFilterService, IAzureResourceTenantService } from '../../azureResource/interfaces';
export class AzureResourceAccountTreeNode extends AzureResourceContainerTreeNodeBase {
public constructor(
account: Account,
public readonly account: Account,
appContext: AppContext,
treeChangeHandler: IAzureResourceTreeChangeHandler
) {
super(account, treeChangeHandler, undefined);
super(appContext, treeChangeHandler, undefined);
this._subscriptionService = this.appContext.getService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService);
this._subscriptionFilterService = this.appContext.getService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService);
this._tenantService = this.appContext.getService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService);
this._id = `account_${this.account.key.accountId}`;
this.setCacheKey(`${this._id}.subscriptions`);
this._label = this.generateLabel();
}
public async getChildren(): Promise<TreeNode[]> {
try {
let subscriptions: AzureResourceSubscription[] = [];
let subscriptions: azureResource.AzureResourceSubscription[] = [];
if (this._isClearingCache) {
const credentials = await this.getCredentials();
subscriptions = (await this.servicePool.subscriptionService.getSubscriptions(this.account, credentials)) || <AzureResourceSubscription[]>[];
try {
const tokens = await this.appContext.apiWrapper.getSecurityToken(this.account, AzureResource.ResourceManagement);
let cache = this.getCache<AzureResourceSubscriptionsCache>();
if (!cache) {
cache = { subscriptions: { } };
for (const tenant of this.account.properties.tenants) {
const token = tokens[tenant.id].token;
const tokenType = tokens[tenant.id].tokenType;
subscriptions.push(...(await this._subscriptionService.getSubscriptions(this.account, new TokenCredentials(token, tokenType)) || <azureResource.AzureResourceSubscription[]>[]));
}
} catch (error) {
throw new AzureResourceCredentialError(localize('azure.resource.tree.accountTreeNode.credentialError', 'Failed to get credential for account {0}. Please refresh the account.', this.account.key.accountId), error);
}
cache.subscriptions[this.account.key.accountId] = subscriptions;
this.updateCache<AzureResourceSubscriptionsCache>(cache);
this.updateCache<azureResource.AzureResourceSubscription[]>(subscriptions);
this._isClearingCache = false;
} else {
@@ -52,8 +67,8 @@ export class AzureResourceAccountTreeNode extends AzureResourceContainerTreeNode
this._totalSubscriptionCount = subscriptions.length;
let selectedSubscriptions = await this.servicePool.subscriptionFilterService.getSelectedSubscriptions(this.account);
let selectedSubscriptionIds = (selectedSubscriptions || <AzureResourceSubscription[]>[]).map((subscription) => subscription.id);
const selectedSubscriptions = await this._subscriptionFilterService.getSelectedSubscriptions(this.account);
const selectedSubscriptionIds = (selectedSubscriptions || <azureResource.AzureResourceSubscription[]>[]).map((subscription) => subscription.id);
if (selectedSubscriptionIds.length > 0) {
subscriptions = subscriptions.filter((subscription) => selectedSubscriptionIds.indexOf(subscription.id) !== -1);
this._selectedSubscriptionCount = selectedSubscriptionIds.length;
@@ -65,31 +80,36 @@ export class AzureResourceAccountTreeNode extends AzureResourceContainerTreeNode
this.refreshLabel();
if (subscriptions.length === 0) {
return [AzureResourceMessageTreeNode.create(AzureResourceAccountTreeNode.NoSubscriptions, this)];
return [AzureResourceMessageTreeNode.create(AzureResourceAccountTreeNode.noSubscriptionsLabel, this)];
} else {
return subscriptions.map((subscription) => new AzureResourceSubscriptionTreeNode(subscription, this.account, this.treeChangeHandler, this));
return await Promise.all(subscriptions.map(async (subscription) => {
const tenantId = await this._tenantService.getTenantId(subscription);
return new AzureResourceSubscriptionTreeNode(this.account, subscription, tenantId, this.appContext, this.treeChangeHandler, this);
}));
}
} catch (error) {
return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), this)];
if (error instanceof AzureResourceCredentialError) {
this.appContext.apiWrapper.showErrorMessage(error.message);
this.appContext.apiWrapper.executeCommand('azure.resource.signin');
} else {
return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), this)];
}
}
}
public async getCachedSubscriptions(): Promise<AzureResourceSubscription[]> {
const subscriptions: AzureResourceSubscription[] = [];
const cache = this.getCache<AzureResourceSubscriptionsCache>();
if (cache) {
subscriptions.push(...cache.subscriptions[this.account.key.accountId]);
}
return subscriptions;
public async getCachedSubscriptions(): Promise<azureResource.AzureResourceSubscription[]> {
return this.getCache<azureResource.AzureResourceSubscription[]>();
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(this._label, TreeItemCollapsibleState.Collapsed);
const item = new TreeItem(this._label, TreeItemCollapsibleState.Collapsed);
item.id = this._id;
item.contextValue = AzureResourceItemType.account;
item.iconPath = {
dark: this.servicePool.contextService.getAbsolutePath('resources/dark/account_inverse.svg'),
light: this.servicePool.contextService.getAbsolutePath('resources/light/account.svg')
dark: this.appContext.extensionContext.asAbsolutePath('resources/dark/account_inverse.svg'),
light: this.appContext.extensionContext.asAbsolutePath('resources/light/account.svg')
};
return item;
}
@@ -128,10 +148,6 @@ export class AzureResourceAccountTreeNode extends AzureResourceContainerTreeNode
}
}
protected get cacheKey(): string {
return 'azureResource.cache.subscriptions';
}
private generateLabel(): string {
let label = `${this.account.displayInfo.displayName} (${this.account.key.accountId})`;
@@ -142,14 +158,14 @@ export class AzureResourceAccountTreeNode extends AzureResourceContainerTreeNode
return label;
}
private _subscriptionService: IAzureResourceSubscriptionService = undefined;
private _subscriptionFilterService: IAzureResourceSubscriptionFilterService = undefined;
private _tenantService: IAzureResourceTenantService = undefined;
private _id: string = undefined;
private _label: string = undefined;
private _totalSubscriptionCount = 0;
private _selectedSubscriptionCount = 0;
private static readonly NoSubscriptions = localize('azureResource.tree.accountTreeNode.noSubscriptions', 'No Subscriptions found.');
}
interface AzureResourceSubscriptionsCache {
subscriptions: { [accountId: string]: AzureResourceSubscription[] };
}
private static readonly noSubscriptionsLabel = localize('azure.resource.tree.accountTreeNode.noSubscriptionsLabel', 'No Subscriptions found.');
}

View File

@@ -5,16 +5,16 @@
'use strict';
import * as sqlops from 'sqlops';
import { ServiceClientCredentials } from 'ms-rest';
import { TreeNode } from '../../treeNodes';
import { AppContext } from '../../appContext';
import { AzureResourceServicePool } from '../servicePool';
import { AzureResourceCredentialError } from '../errors';
import { TreeNode } from '../treeNode';
import { IAzureResourceTreeChangeHandler } from './treeChangeHandler';
import { IAzureResourceCacheService } from '../../azureResource/interfaces';
import { AzureResourceServiceNames } from '../constants';
export abstract class AzureResourceTreeNodeBase extends TreeNode {
public constructor(
public readonly appContext: AppContext,
public readonly treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
@@ -22,17 +22,17 @@ export abstract class AzureResourceTreeNodeBase extends TreeNode {
this.parent = parent;
}
public readonly servicePool = AzureResourceServicePool.getInstance();
}
export abstract class AzureResourceContainerTreeNodeBase extends AzureResourceTreeNodeBase {
public constructor(
public readonly account: sqlops.Account,
appContext: AppContext,
treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
super(treeChangeHandler, parent);
super(appContext, treeChangeHandler, parent);
this._cacheService = this.appContext.getService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService);
}
public clearCache(): void {
@@ -43,29 +43,19 @@ export abstract class AzureResourceContainerTreeNodeBase extends AzureResourceTr
return this._isClearingCache;
}
protected async getCredentials(): Promise<ServiceClientCredentials[]> {
try {
return await this.servicePool.credentialService.getCredentials(this.account, sqlops.AzureResource.ResourceManagement);
} catch (error) {
if (error instanceof AzureResourceCredentialError) {
this.servicePool.contextService.showErrorMessage(error.message);
this.servicePool.contextService.executeCommand('azureresource.signin');
} else {
throw error;
}
}
}
protected setCacheKey(id: string): void {
this._cacheKey = this._cacheService.generateKey(id);
}
protected updateCache<T>(cache: T): void {
this.servicePool.cacheService.update<T>(this.cacheKey, cache);
this._cacheService.update<T>(this._cacheKey, cache);
}
protected getCache<T>(): T {
return this.servicePool.cacheService.get<T>(this.cacheKey);
return this._cacheService.get<T>(this._cacheKey);
}
protected abstract get cacheKey(): string;
protected _isClearingCache = true;
private _cacheService: IAzureResourceCacheService = undefined;
private _cacheKey: string = undefined;
}

View File

@@ -1,103 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { Account, NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { AzureResourceContainerTreeNodeBase } from './baseTreeNodes';
import { AzureResourceItemType } from '../constants';
import { AzureResourceErrorMessageUtil } from '../utils';
import { AzureResourceDatabaseTreeNode } from './databaseTreeNode';
import { AzureResourceMessageTreeNode } from './messageTreeNode';
import { AzureResourceSubscription, AzureResourceDatabase } from '../models';
import { IAzureResourceTreeChangeHandler } from './treeProvider';
export class AzureResourceDatabaseContainerTreeNode extends AzureResourceContainerTreeNodeBase {
public constructor(
public readonly subscription: AzureResourceSubscription,
account: Account,
treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
super(account, treeChangeHandler, parent);
}
public async getChildren(): Promise<TreeNode[]> {
try {
let databases: AzureResourceDatabase[] = [];
if (this._isClearingCache) {
let credentials = await this.getCredentials();
databases = (await this.servicePool.databaseService.getDatabases(this.subscription, credentials)) || <AzureResourceDatabase[]>[];
let cache = this.getCache<AzureResourceDatabasesCache>();
if (!cache) {
cache = { databases: { } };
}
cache.databases[this.subscription.id] = databases;
this.updateCache(cache);
this._isClearingCache = false;
} else {
const cache = this.getCache<AzureResourceDatabasesCache>();
if (cache) {
databases = cache.databases[this.subscription.id] || <AzureResourceDatabase[]>[];
}
}
if (databases.length === 0) {
return [AzureResourceMessageTreeNode.create(AzureResourceDatabaseContainerTreeNode.NoDatabases, this)];
} else {
return databases.map((database) => new AzureResourceDatabaseTreeNode(database, this.treeChangeHandler, this));
}
} catch (error) {
return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), this)];
}
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(AzureResourceDatabaseContainerTreeNode.Label, TreeItemCollapsibleState.Collapsed);
item.contextValue = AzureResourceItemType.databaseContainer;
item.iconPath = {
dark: this.servicePool.contextService.getAbsolutePath('resources/dark/folder_inverse.svg'),
light: this.servicePool.contextService.getAbsolutePath('resources/light/folder.svg')
};
return item;
}
public getNodeInfo(): NodeInfo {
return {
label: AzureResourceDatabaseContainerTreeNode.Label,
isLeaf: false,
errorMessage: undefined,
metadata: undefined,
nodePath: this.generateNodePath(),
nodeStatus: undefined,
nodeType: AzureResourceItemType.databaseContainer,
nodeSubType: undefined,
iconType: AzureResourceItemType.databaseContainer
};
}
public get nodePathValue(): string {
return 'databaseContainer';
}
protected get cacheKey(): string {
return 'azureResource.cache.databases';
}
private static readonly Label = localize('azureResource.tree.databaseContainerTreeNode.label', 'SQL Databases');
private static readonly NoDatabases = localize('azureResource.tree.databaseContainerTreeNode.noDatabases', 'No SQL Databases found.');
}
interface AzureResourceDatabasesCache {
databases: { [subscriptionId: string]: AzureResourceDatabase[] };
}

View File

@@ -1,103 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { Account, NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { AzureResourceContainerTreeNodeBase } from './baseTreeNodes';
import { AzureResourceItemType } from '../constants';
import { AzureResourceMessageTreeNode } from './messageTreeNode';
import { AzureResourceErrorMessageUtil } from '../utils';
import { AzureResourceSubscription, AzureResourceDatabaseServer } from '../models';
import { AzureResourceDatabaseServerTreeNode } from './databaseServerTreeNode';
import { IAzureResourceTreeChangeHandler } from './treeProvider';
export class AzureResourceDatabaseServerContainerTreeNode extends AzureResourceContainerTreeNodeBase {
public constructor(
public readonly subscription: AzureResourceSubscription,
account: Account,
treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
super(account, treeChangeHandler, parent);
}
public async getChildren(): Promise<TreeNode[]> {
try {
let databaseServers: AzureResourceDatabaseServer[] = [];
if (this._isClearingCache) {
let credentials = await this.getCredentials();
databaseServers = (await this.servicePool.databaseServerService.getDatabaseServers(this.subscription, credentials)) || <AzureResourceDatabaseServer[]>[];
let cache = this.getCache<AzureResourceDatabaseServersCache>();
if (!cache) {
cache = { databaseServers: { } };
}
cache.databaseServers[this.subscription.id] = databaseServers;
this.updateCache<AzureResourceDatabaseServersCache>(cache);
this._isClearingCache = false;
} else {
const cache = this.getCache<AzureResourceDatabaseServersCache>();
if (cache) {
databaseServers = cache.databaseServers[this.subscription.id] || <AzureResourceDatabaseServer[]>[];
}
}
if (databaseServers.length === 0) {
return [AzureResourceMessageTreeNode.create(AzureResourceDatabaseServerContainerTreeNode.NoDatabaseServers, this)];
} else {
return databaseServers.map((server) => new AzureResourceDatabaseServerTreeNode(server, this.treeChangeHandler, this));
}
} catch (error) {
return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), this)];
}
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(AzureResourceDatabaseServerContainerTreeNode.Label, TreeItemCollapsibleState.Collapsed);
item.contextValue = AzureResourceItemType.databaseServerContainer;
item.iconPath = {
dark: this.servicePool.contextService.getAbsolutePath('resources/dark/folder_inverse.svg'),
light: this.servicePool.contextService.getAbsolutePath('resources/light/folder.svg')
};
return item;
}
public getNodeInfo(): NodeInfo {
return {
label: AzureResourceDatabaseServerContainerTreeNode.Label,
isLeaf: false,
errorMessage: undefined,
metadata: undefined,
nodePath: this.generateNodePath(),
nodeStatus: undefined,
nodeType: AzureResourceItemType.databaseServerContainer,
nodeSubType: undefined,
iconType: AzureResourceItemType.databaseServerContainer
};
}
public get nodePathValue(): string {
return 'databaseServerContainer';
}
protected get cacheKey(): string {
return 'azureResource.cache.databaseServers';
}
private static readonly Label = localize('azureResource.tree.databaseServerContainerTreeNode.label', 'SQL Servers');
private static readonly NoDatabaseServers = localize('azureResource.tree.databaseContainerTreeNode.noDatabaseServers', 'No SQL Servers found.');
}
interface AzureResourceDatabaseServersCache {
databaseServers: { [subscriptionId: string]: AzureResourceDatabaseServer[] };
}

View File

@@ -1,57 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import { AzureResourceTreeNodeBase } from './baseTreeNodes';
import { AzureResourceItemType } from '../constants';
import { AzureResourceDatabaseServer } from '../models';
import { IAzureResourceTreeChangeHandler } from './treeProvider';
export class AzureResourceDatabaseServerTreeNode extends AzureResourceTreeNodeBase {
public constructor(
public readonly databaseServer: AzureResourceDatabaseServer,
treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
super(treeChangeHandler, parent);
}
public async getChildren(): Promise<TreeNode[]> {
return [];
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(this.databaseServer.name, TreeItemCollapsibleState.None);
item.contextValue = AzureResourceItemType.databaseServer;
item.iconPath = {
dark: this.servicePool.contextService.getAbsolutePath('resources/dark/sql_server_inverse.svg'),
light: this.servicePool.contextService.getAbsolutePath('resources/light/sql_server.svg')
};
return item;
}
public getNodeInfo(): NodeInfo {
return {
label: this.databaseServer.name,
isLeaf: true,
errorMessage: undefined,
metadata: undefined,
nodePath: this.generateNodePath(),
nodeStatus: undefined,
nodeType: AzureResourceItemType.databaseServer,
nodeSubType: undefined,
iconType: AzureResourceItemType.databaseServer
};
}
public get nodePathValue(): string {
return `databaseServer_${this.databaseServer.name}`;
}
}

View File

@@ -1,61 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import { AzureResourceTreeNodeBase } from './baseTreeNodes';
import { AzureResourceItemType } from '../constants';
import { AzureResourceDatabase } from '../models';
import { IAzureResourceTreeChangeHandler } from './treeProvider';
export class AzureResourceDatabaseTreeNode extends AzureResourceTreeNodeBase {
public constructor(
public readonly database: AzureResourceDatabase,
treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
super(treeChangeHandler, parent);
this._label = `${this.database.name} (${this.database.serverName})`;
}
public async getChildren(): Promise<TreeNode[]> {
return [];
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(this._label, TreeItemCollapsibleState.None);
item.contextValue = AzureResourceItemType.database;
item.iconPath = {
dark: this.servicePool.contextService.getAbsolutePath('resources/dark/sql_database_inverse.svg'),
light: this.servicePool.contextService.getAbsolutePath('resources/light/sql_database.svg')
};
return item;
}
public getNodeInfo(): NodeInfo {
return {
label: this._label,
isLeaf: true,
errorMessage: undefined,
metadata: undefined,
nodePath: this.generateNodePath(),
nodeStatus: undefined,
nodeType: AzureResourceItemType.database,
nodeSubType: undefined,
iconType: AzureResourceItemType.database
};
}
public get nodePathValue(): string {
return `database_${this.database.name}`;
}
private _label: string = undefined;
}

View File

@@ -7,38 +7,66 @@
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
import { Account, NodeInfo } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import { AppContext } from '../../appContext';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { AzureResourceTreeNodeBase, AzureResourceContainerTreeNodeBase } from './baseTreeNodes';
import { azureResource } from '../azure-resource';
import { TreeNode } from '../treeNode';
import { IAzureResourceNodeWithProviderId } from '../interfaces';
import { AzureResourceContainerTreeNodeBase } from './baseTreeNodes';
import { AzureResourceItemType } from '../constants';
import { AzureResourceDatabaseContainerTreeNode } from './databaseContainerTreeNode';
import { AzureResourceDatabaseServerContainerTreeNode } from './databaseServerContainerTreeNode';
import { AzureResourceSubscription } from '../models';
import { IAzureResourceTreeChangeHandler } from './treeChangeHandler';
import { AzureResourceMessageTreeNode } from '../messageTreeNode';
import { AzureResourceErrorMessageUtil } from '../utils';
import { AzureResourceService } from '../resourceService';
import { AzureResourceResourceTreeNode } from '../resourceTreeNode';
export class AzureResourceSubscriptionTreeNode extends AzureResourceTreeNodeBase {
export class AzureResourceSubscriptionTreeNode extends AzureResourceContainerTreeNodeBase {
public constructor(
public readonly subscription: AzureResourceSubscription,
account: Account,
public readonly account: Account,
public readonly subscription: azureResource.AzureResourceSubscription,
public readonly tenatId: string,
appContext: AppContext,
treeChangeHandler: IAzureResourceTreeChangeHandler,
parent: TreeNode
) {
super(treeChangeHandler, parent);
super(appContext, treeChangeHandler, parent);
this._children.push(new AzureResourceDatabaseContainerTreeNode(subscription, account, treeChangeHandler, this));
this._children.push(new AzureResourceDatabaseServerContainerTreeNode(subscription, account, treeChangeHandler, this));
this._id = `account_${this.account.key.accountId}.subscription_${this.subscription.id}.tenant_${this.tenatId}`;
this.setCacheKey(`${this._id}.resources`);
}
public async getChildren(): Promise<TreeNode[]> {
return this._children;
try {
const resourceService = AzureResourceService.getInstance();
const children: IAzureResourceNodeWithProviderId[] = [];
for (const resourceProviderId of await resourceService.listResourceProviderIds()) {
children.push(...await resourceService.getRootChildren(resourceProviderId, this.account, this.subscription, this.tenatId));
}
if (children.length === 0) {
return [AzureResourceMessageTreeNode.create(AzureResourceSubscriptionTreeNode.noResourcesLabel, this)];
} else {
return children.map((child) => {
// To make tree node's id unique, otherwise, treeModel.js would complain 'item already registered'
child.resourceNode.treeItem.id = `${this._id}.${child.resourceNode.treeItem.id}`;
return new AzureResourceResourceTreeNode(child, this);
});
}
} catch (error) {
return [AzureResourceMessageTreeNode.create(AzureResourceErrorMessageUtil.getErrorMessage(error), this)];
}
}
public getTreeItem(): TreeItem | Promise<TreeItem> {
let item = new TreeItem(this.subscription.name, TreeItemCollapsibleState.Collapsed);
const item = new TreeItem(this.subscription.name, TreeItemCollapsibleState.Collapsed);
item.contextValue = AzureResourceItemType.subscription;
item.iconPath = {
dark: this.servicePool.contextService.getAbsolutePath('resources/dark/subscription_inverse.svg'),
light: this.servicePool.contextService.getAbsolutePath('resources/light/subscription.svg')
dark: this.appContext.extensionContext.asAbsolutePath('resources/dark/subscription_inverse.svg'),
light: this.appContext.extensionContext.asAbsolutePath('resources/light/subscription.svg')
};
return item;
}
@@ -58,8 +86,10 @@ export class AzureResourceSubscriptionTreeNode extends AzureResourceTreeNodeBase
}
public get nodePathValue(): string {
return `subscription_${this.subscription.id}`;
return this._id;
}
private _children: AzureResourceContainerTreeNodeBase[] = [];
private _id: string = undefined;
private static readonly noResourcesLabel = localize('azure.resource.tree.subscriptionTreeNode.noResourcesLabel', 'No Resources found.');
}

View File

@@ -5,7 +5,7 @@
'use strict';
import { TreeNode } from '../../treeNodes';
import { TreeNode } from '../treeNode';
export interface IAzureResourceTreeChangeHandler {
notifyNodeChanged(node: TreeNode): void;

View File

@@ -6,26 +6,25 @@
'use strict';
import { TreeDataProvider, EventEmitter, Event, TreeItem } from 'vscode';
import { DidChangeAccountsParams } from 'sqlops';
import { TreeNode } from '../../treeNodes';
import { setInterval, clearInterval } from 'timers';
import { AppContext } from '../../appContext';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { AzureResourceServicePool } from '../servicePool';
import { TreeNode } from '../treeNode';
import { AzureResourceAccountTreeNode } from './accountTreeNode';
import { AzureResourceAccountNotSignedInTreeNode } from './accountNotSignedInTreeNode';
import { AzureResourceMessageTreeNode } from './messageTreeNode';
import { AzureResourceContainerTreeNodeBase, AzureResourceTreeNodeBase } from './baseTreeNodes';
import { AzureResourceMessageTreeNode } from '../messageTreeNode';
import { AzureResourceContainerTreeNodeBase } from './baseTreeNodes';
import { AzureResourceErrorMessageUtil } from '../utils';
export interface IAzureResourceTreeChangeHandler {
notifyNodeChanged(node: TreeNode): void;
}
import { IAzureResourceTreeChangeHandler } from './treeChangeHandler';
import { IAzureResourceAccountService } from '../../azureResource/interfaces';
import { AzureResourceServiceNames } from '../constants';
export class AzureResourceTreeProvider implements TreeDataProvider<TreeNode>, IAzureResourceTreeChangeHandler {
public constructor() {
AzureResourceServicePool.getInstance().accountService.onDidChangeAccounts((e: DidChangeAccountsParams) => { this._onDidChangeTreeData.fire(undefined); });
public constructor(
public readonly appContext: AppContext
) {
}
public async getChildren(element?: TreeNode): Promise<TreeNode[]> {
@@ -37,7 +36,7 @@ export class AzureResourceTreeProvider implements TreeDataProvider<TreeNode>, IA
this._loadingTimer = setInterval(async () => {
try {
// Call sqlops.accounts.getAllAccounts() to determine whether the system has been initialized.
await AzureResourceServicePool.getInstance().accountService.getAccounts();
await this.appContext.getService<IAzureResourceAccountService>(AzureResourceServiceNames.accountService).getAccounts();
// System has been initialized
this.isSystemInitialized = true;
@@ -51,16 +50,16 @@ export class AzureResourceTreeProvider implements TreeDataProvider<TreeNode>, IA
// System not initialized yet
this.isSystemInitialized = false;
}
}, AzureResourceTreeProvider.LoadingTimerInterval);
}, AzureResourceTreeProvider.loadingTimerInterval);
return [AzureResourceMessageTreeNode.create(AzureResourceTreeProvider.Loading, undefined)];
return [AzureResourceMessageTreeNode.create(AzureResourceTreeProvider.loadingLabel, undefined)];
}
try {
const accounts = await AzureResourceServicePool.getInstance().accountService.getAccounts();
const accounts = await this.appContext.getService<IAzureResourceAccountService>(AzureResourceServiceNames.accountService).getAccounts();
if (accounts && accounts.length > 0) {
return accounts.map((account) => new AzureResourceAccountTreeNode(account, this));
return accounts.map((account) => new AzureResourceAccountTreeNode(account, this.appContext, this));
} else {
return [new AzureResourceAccountNotSignedInTreeNode()];
}
@@ -96,6 +95,6 @@ export class AzureResourceTreeProvider implements TreeDataProvider<TreeNode>, IA
private _loadingTimer: NodeJS.Timer = undefined;
private _onDidChangeTreeData = new EventEmitter<TreeNode>();
private static readonly Loading = localize('azureResource.tree.treeProvider.loading', 'Loading ...');
private static readonly LoadingTimerInterval = 5000;
private static readonly loadingLabel = localize('azure.resource.tree.treeProvider.loadingLabel', 'Loading ...');
private static readonly loadingTimerInterval = 5000;
}

View File

@@ -11,16 +11,6 @@ import * as vscode from 'vscode';
type TreeNodePredicate = (node: TreeNode) => boolean;
export abstract class TreeNode {
private _parent: TreeNode = undefined;
public get parent(): TreeNode {
return this._parent;
}
public set parent(node: TreeNode) {
this._parent = node;
}
public generateNodePath(): string {
let path = undefined;
if (this.parent) {
@@ -65,13 +55,23 @@ export abstract class TreeNode {
return undefined;
}
public get parent(): TreeNode {
return this._parent;
}
public set parent(node: TreeNode) {
this._parent = node;
}
public abstract getChildren(refreshChildren: boolean): TreeNode[] | Promise<TreeNode[]>;
public abstract getTreeItem(): vscode.TreeItem | Promise<vscode.TreeItem>;
public abstract getNodeInfo(): sqlops.NodeInfo;
/**
* The value to use for this node in the node path
*/
public abstract get nodePathValue(): string;
abstract getChildren(refreshChildren: boolean): TreeNode[] | Promise<TreeNode[]>;
abstract getTreeItem(): vscode.TreeItem | Promise<vscode.TreeItem>;
abstract getNodeInfo(): sqlops.NodeInfo;
private _parent: TreeNode = undefined;
}

View File

@@ -12,10 +12,9 @@ export function getErrorMessage(error: Error | string): string {
return (error instanceof Error) ? error.message : error;
}
export class AzureResourceErrorMessageUtil {
public static getErrorMessage(error: Error | string): string {
return localize('azureResource.error', 'Error: {0}', getErrorMessage(error));
return localize('azure.resource.error', 'Error: {0}', getErrorMessage(error));
}
}

View File

@@ -0,0 +1,53 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import ControllerBase from './controllerBase';
import { DidChangeAccountsParams } from 'sqlops';
import {
IAzureResourceCacheService,
IAzureResourceAccountService,
IAzureResourceSubscriptionService,
IAzureResourceSubscriptionFilterService,
IAzureResourceTenantService } from '../azureResource/interfaces';
import { AzureResourceServiceNames } from '../azureResource/constants';
import { AzureResourceTreeProvider } from '../azureResource/tree/treeProvider';
import { registerAzureResourceCommands } from '../azureResource/commands';
import { AzureResourceAccountService } from '../azureResource/services/accountService';
import { AzureResourceSubscriptionService } from '../azureResource/services/subscriptionService';
import { AzureResourceSubscriptionFilterService } from '../azureResource/services/subscriptionFilterService';
import { AzureResourceCacheService } from '../azureResource/services/cacheService';
import { AzureResourceTenantService } from '../azureResource/services/tenantService';
import { registerAzureResourceDatabaseServerCommands } from '../azureResource/providers/databaseServer/commands';
import { registerAzureResourceDatabaseCommands } from '../azureResource/providers/database/commands';
export default class AzureResourceController extends ControllerBase {
public activate(): Promise<boolean> {
this.appContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, new AzureResourceCacheService(this.extensionContext));
this.appContext.registerService<IAzureResourceAccountService>(AzureResourceServiceNames.accountService, new AzureResourceAccountService(this.apiWrapper));
this.appContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, new AzureResourceSubscriptionService());
this.appContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, new AzureResourceSubscriptionFilterService(new AzureResourceCacheService(this.extensionContext)));
this.appContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, new AzureResourceTenantService());
const azureResourceTree = new AzureResourceTreeProvider(this.appContext);
this.extensionContext.subscriptions.push(this.apiWrapper.registerTreeDataProvider('azureResourceExplorer', azureResourceTree));
this.appContext.getService<IAzureResourceAccountService>(AzureResourceServiceNames.accountService).onDidChangeAccounts((e: DidChangeAccountsParams) => { azureResourceTree.notifyNodeChanged(undefined); });
registerAzureResourceCommands(this.appContext, azureResourceTree);
registerAzureResourceDatabaseServerCommands(this.appContext);
registerAzureResourceDatabaseCommands(this.appContext);
return Promise.resolve(true);
}
public deactivate(): void {
}
}

View File

@@ -1,54 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import ControllerBase from './controllerBase';
import { AzureResourceTreeProvider } from '../azureResource/tree/treeProvider';
import { registerAzureResourceCommands } from '../azureResource/commands';
import { AzureResourceServicePool } from '../azureResource/servicePool';
import { AzureResourceCredentialService } from '../azureResource/services/credentialService';
import { AzureResourceAccountService } from '../azureResource/services/accountService';
import { AzureResourceSubscriptionService } from '../azureResource/services/subscriptionService';
import { AzureResourceSubscriptionFilterService } from '../azureResource/services/subscriptionFilterService';
import { AzureResourceDatabaseServerService } from '../azureResource/services/databaseServerService';
import { AzureResourceDatabaseService } from '../azureResource/services/databaseService';
import { AzureResourceCacheService } from '../azureResource/services/cacheService';
import { AzureResourceContextService } from '../azureResource/services/contextService';
/**
* The main controller class that initializes the extension
*/
export default class MainController extends ControllerBase {
// PUBLIC METHODS //////////////////////////////////////////////////////
/**
* Deactivates the extension
*/
public deactivate(): void {
}
public activate(): Promise<boolean> {
this.configureAzureResource();
return Promise.resolve(true);
}
private configureAzureResource(): void {
let servicePool = AzureResourceServicePool.getInstance();
servicePool.cacheService = new AzureResourceCacheService(this.extensionContext);
servicePool.contextService = new AzureResourceContextService(this.extensionContext, this.apiWrapper);
servicePool.accountService = new AzureResourceAccountService(this.apiWrapper);
servicePool.credentialService = new AzureResourceCredentialService(this.apiWrapper);
servicePool.subscriptionService = new AzureResourceSubscriptionService();
servicePool.subscriptionFilterService = new AzureResourceSubscriptionFilterService(new AzureResourceCacheService(this.extensionContext));
servicePool.databaseService = new AzureResourceDatabaseService();
servicePool.databaseServerService = new AzureResourceDatabaseServerService();
let azureResourceTree = new AzureResourceTreeProvider();
this.extensionContext.subscriptions.push(this.apiWrapper.registerTreeDataProvider('azureResourceExplorer', azureResourceTree));
registerAzureResourceCommands(this.apiWrapper, azureResourceTree);
}
}

View File

@@ -6,12 +6,17 @@ import * as path from 'path';
import * as os from 'os';
import * as constants from './constants';
import MainController from './controllers/mainController';
import AzureResourceController from './controllers/azureResourceController';
import { AppContext } from './appContext';
import ControllerBase from './controllers/controllerBase';
import { ApiWrapper } from './apiWrapper';
import { AzureAccountProviderService } from './account-provider/azureAccountProviderService';
import { AzureResourceDatabaseServerProvider } from './azureResource/providers/databaseServer/databaseServerProvider';
import { AzureResourceDatabaseServerService } from './azureResource/providers/databaseServer/databaseServerService';
import { AzureResourceDatabaseProvider } from './azureResource/providers/database/databaseProvider';
import { AzureResourceDatabaseService } from './azureResource/providers/database/databaseService';
let controllers: ControllerBase[] = [];
@@ -35,7 +40,8 @@ export function getDefaultLogLocation() {
// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(extensionContext: vscode.ExtensionContext) {
let appContext = new AppContext(extensionContext, new ApiWrapper());
const apiWrapper = new ApiWrapper();
let appContext = new AppContext(extensionContext, apiWrapper);
let activations: Thenable<boolean>[] = [];
// Create the folder for storing the token caches
@@ -56,21 +62,19 @@ export function activate(extensionContext: vscode.ExtensionContext) {
extensionContext.subscriptions.push(accountProviderService);
accountProviderService.activate();
// Start the main controller
let mainController = new MainController(appContext);
controllers.push(mainController);
extensionContext.subscriptions.push(mainController);
activations.push(mainController.activate());
const azureResourceController = new AzureResourceController(appContext);
controllers.push(azureResourceController);
extensionContext.subscriptions.push(azureResourceController);
activations.push(azureResourceController.activate());
return Promise.all(activations)
.then((results: boolean[]) => {
for (let result of results) {
if (!result) {
return false;
}
}
return true;
});
return {
provideResources() {
return [
new AzureResourceDatabaseServerProvider(new AzureResourceDatabaseServerService(), apiWrapper, extensionContext),
new AzureResourceDatabaseProvider(new AzureResourceDatabaseService(), apiWrapper, extensionContext)
];
}
};
}
// this method is called when your extension is deactivated

View File

@@ -9,8 +9,8 @@ import * as should from 'should';
import * as vscode from 'vscode';
import 'mocha';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceMessageTreeNode } from '../../../azureResource/tree/messageTreeNode';
import { AzureResourceItemType } from '../../azureResource/constants';
import { AzureResourceMessageTreeNode } from '../../azureResource/messageTreeNode';
describe('AzureResourceMessageTreeNode.info', function(): void {
it('Should be correct when created.', async function(): Promise<void> {

View File

@@ -0,0 +1,150 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { azureResource } from '../../../../azureResource/azure-resource';
import { ApiWrapper } from '../../../../apiWrapper';
import { IAzureResourceDatabaseService } from '../../../../azureResource/providers/database/interfaces';
import { AzureResourceDatabaseTreeDataProvider } from '../../../../azureResource/providers/database/databaseTreeDataProvider';
import { AzureResourceDatabase } from '../../../../azureResource/providers/database/models';
import { AzureResourceItemType } from '../../../../azureResource/constants';
// Mock services
let mockDatabaseService: TypeMoq.IMock<IAzureResourceDatabaseService>;
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
let mockExtensionContext: TypeMoq.IMock<vscode.ExtensionContext>;
// Mock test data
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
providerId: 'mock_provider'
},
displayInfo: {
displayName: 'mock_account@test.com',
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
isStale: false
};
const mockSubscription: azureResource.AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockTenantId: string = 'mock_tenant';
const mockResourceRootNode: azureResource.IAzureResourceNode = {
account: mockAccount,
subscription: mockSubscription,
tenantId: mockTenantId,
treeItem: {
id: 'mock_resource_root_node',
label: 'mock resource root node',
iconPath: undefined,
collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
contextValue: 'mock_resource_root_node'
}
};
const mockTokens = {};
mockTokens[mockTenantId] = {
token: 'mock_token',
tokenType: 'Bearer'
};
const mockDatabases: AzureResourceDatabase[] = [
{
name: 'mock database 1',
serverName: 'mock database server 1',
serverFullName: 'mock database server full name 1',
loginName: 'mock login'
},
{
name: 'mock database 2',
serverName: 'mock database server 2',
serverFullName: 'mock database server full name 2',
loginName: 'mock login'
}
];
describe('AzureResourceDatabaseTreeDataProvider.info', function(): void {
beforeEach(() => {
mockDatabaseService = TypeMoq.Mock.ofType<IAzureResourceDatabaseService>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
});
it('Should be correct when created.', async function(): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockApiWrapper.object, mockExtensionContext.object);
const treeItem = await treeDataProvider.getTreeItem(mockResourceRootNode);
should(treeItem.id).equal(mockResourceRootNode.treeItem.id);
should(treeItem.label).equal(mockResourceRootNode.treeItem.label);
should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState);
should(treeItem.contextValue).equal(mockResourceRootNode.treeItem.contextValue);
});
});
describe('AzureResourceDatabaseTreeDataProvider.getChildren', function(): void {
beforeEach(() => {
mockDatabaseService = TypeMoq.Mock.ofType<IAzureResourceDatabaseService>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper.setup((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockTokens));
mockDatabaseService.setup((o) => o.getDatabases(mockSubscription, TypeMoq.It.isAny())).returns(() => Promise.resolve(mockDatabases));
mockExtensionContext.setup((o) => o.asAbsolutePath(TypeMoq.It.isAnyString())).returns(() => TypeMoq.It.isAnyString());
});
it('Should return container node when element is undefined.', async function(): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockApiWrapper.object, mockExtensionContext.object);
const children = await treeDataProvider.getChildren();
should(children).Array();
should(children.length).equal(1);
const child = children[0];
should(child.account).undefined();
should(child.subscription).undefined();
should(child.tenantId).undefined();
should(child.treeItem.id).equal('azure.resource.providers.database.treeDataProvider.databaseContainer');
should(child.treeItem.label).equal('SQL Databases');
should(child.treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed);
should(child.treeItem.contextValue).equal('azure.resource.itemType.databaseContainer');
});
it('Should return resource nodes when it is container node.', async function(): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseTreeDataProvider(mockDatabaseService.object, mockApiWrapper.object, mockExtensionContext.object);
const children = await treeDataProvider.getChildren(mockResourceRootNode);
should(children).Array();
should(children.length).equal(mockDatabases.length);
for (let ix = 0; ix < children.length; ix++) {
const child = children[ix];
const database = mockDatabases[ix];
should(child.account).equal(mockAccount);
should(child.subscription).equal(mockSubscription);
should(child.tenantId).equal(mockTenantId);
should(child.treeItem.id).equal(`databaseServer_${database.serverFullName}.database_${database.name}`);
should(child.treeItem.label).equal(`${database.name} (${database.serverName})`);
should(child.treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.None);
should(child.treeItem.contextValue).equal(AzureResourceItemType.database);
}
});
});

View File

@@ -0,0 +1,150 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { azureResource } from '../../../../azureResource/azure-resource';
import { ApiWrapper } from '../../../../apiWrapper';
import { IAzureResourceDatabaseServerService } from '../../../../azureResource/providers/databaseServer/interfaces';
import { AzureResourceDatabaseServerTreeDataProvider } from '../../../../azureResource/providers/databaseServer/databaseServerTreeDataProvider';
import { AzureResourceDatabaseServer } from '../../../../azureResource/providers/databaseServer/models';
import { AzureResourceItemType } from '../../../../azureResource/constants';
// Mock services
let mockDatabaseServerService: TypeMoq.IMock<IAzureResourceDatabaseServerService>;
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
let mockExtensionContext: TypeMoq.IMock<vscode.ExtensionContext>;
// Mock test data
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
providerId: 'mock_provider'
},
displayInfo: {
displayName: 'mock_account@test.com',
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
isStale: false
};
const mockSubscription: azureResource.AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockTenantId: string = 'mock_tenant';
const mockResourceRootNode: azureResource.IAzureResourceNode = {
account: mockAccount,
subscription: mockSubscription,
tenantId: mockTenantId,
treeItem: {
id: 'mock_resource_root_node',
label: 'mock resource root node',
iconPath: undefined,
collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
contextValue: 'mock_resource_root_node'
}
};
const mockTokens = {};
mockTokens[mockTenantId] = {
token: 'mock_token',
tokenType: 'Bearer'
};
const mockDatabaseServers: AzureResourceDatabaseServer[] = [
{
name: 'mock database server 1',
fullName: 'mock database server full name 1',
loginName: 'mock login',
defaultDatabaseName: 'master'
},
{
name: 'mock database server 2',
fullName: 'mock database server full name 2',
loginName: 'mock login',
defaultDatabaseName: 'master'
}
];
describe('AzureResourceDatabaseServerTreeDataProvider.info', function(): void {
beforeEach(() => {
mockDatabaseServerService = TypeMoq.Mock.ofType<IAzureResourceDatabaseServerService>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
});
it('Should be correct when created.', async function(): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockApiWrapper.object, mockExtensionContext.object);
const treeItem = await treeDataProvider.getTreeItem(mockResourceRootNode);
should(treeItem.id).equal(mockResourceRootNode.treeItem.id);
should(treeItem.label).equal(mockResourceRootNode.treeItem.label);
should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState);
should(treeItem.contextValue).equal(mockResourceRootNode.treeItem.contextValue);
});
});
describe('AzureResourceDatabaseServerTreeDataProvider.getChildren', function(): void {
beforeEach(() => {
mockDatabaseServerService = TypeMoq.Mock.ofType<IAzureResourceDatabaseServerService>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper.setup((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockTokens));
mockDatabaseServerService.setup((o) => o.getDatabaseServers(mockSubscription, TypeMoq.It.isAny())).returns(() => Promise.resolve(mockDatabaseServers));
mockExtensionContext.setup((o) => o.asAbsolutePath(TypeMoq.It.isAnyString())).returns(() => TypeMoq.It.isAnyString());
});
it('Should return container node when element is undefined.', async function(): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockApiWrapper.object, mockExtensionContext.object);
const children = await treeDataProvider.getChildren();
should(children).Array();
should(children.length).equal(1);
const child = children[0];
should(child.account).undefined();
should(child.subscription).undefined();
should(child.tenantId).undefined();
should(child.treeItem.id).equal('azure.resource.providers.databaseServer.treeDataProvider.databaseServerContainer');
should(child.treeItem.label).equal('SQL Servers');
should(child.treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed);
should(child.treeItem.contextValue).equal('azure.resource.itemType.databaseServerContainer');
});
it('Should return resource nodes when it is container node.', async function(): Promise<void> {
const treeDataProvider = new AzureResourceDatabaseServerTreeDataProvider(mockDatabaseServerService.object, mockApiWrapper.object, mockExtensionContext.object);
const children = await treeDataProvider.getChildren(mockResourceRootNode);
should(children).Array();
should(children.length).equal(mockDatabaseServers.length);
for (let ix = 0; ix < children.length; ix++) {
const child = children[ix];
const databaseServer = mockDatabaseServers[ix];
should(child.account).equal(mockAccount);
should(child.subscription).equal(mockSubscription);
should(child.tenantId).equal(mockTenantId);
should(child.treeItem.id).equal(`databaseServer_${databaseServer.name}`);
should(child.treeItem.label).equal(databaseServer.name);
should(child.treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.None);
should(child.treeItem.contextValue).equal(AzureResourceItemType.databaseServer);
}
});
});

View File

@@ -0,0 +1,180 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import 'mocha';
import { fail } from 'assert';
import { azureResource } from '../../azureResource/azure-resource';
import { AzureResourceService } from '../../azureResource/resourceService';
// Mock test data
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
providerId: 'mock_provider'
},
displayInfo: {
displayName: 'mock_account@test.com',
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
isStale: false
};
const mockSubscription: azureResource.AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockTenantId: string = 'mock_tenant';
let mockResourceTreeDataProvider1: TypeMoq.IMock<azureResource.IAzureResourceTreeDataProvider>;
let mockResourceProvider1: TypeMoq.IMock<azureResource.IAzureResourceProvider>;
let mockResourceTreeDataProvider2: TypeMoq.IMock<azureResource.IAzureResourceTreeDataProvider>;
let mockResourceProvider2: TypeMoq.IMock<azureResource.IAzureResourceProvider>;
const resourceService: AzureResourceService = AzureResourceService.getInstance();
describe('AzureResourceService.listResourceProviderIds', function(): void {
beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2');
mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object);
resourceService.clearResourceProviders();
resourceService.areResourceProvidersLoaded = true;
});
it('Should be correct when registering providers.', async function(): Promise<void> {
resourceService.registerResourceProvider(mockResourceProvider1.object);
let providerIds = await resourceService.listResourceProviderIds();
should(providerIds).Array();
should(providerIds.length).equal(1);
should(providerIds[0]).equal(mockResourceProvider1.object.providerId);
resourceService.registerResourceProvider(mockResourceProvider2.object);
providerIds = await resourceService.listResourceProviderIds();
should(providerIds).Array();
should(providerIds.length).equal(2);
should(providerIds[0]).equal(mockResourceProvider1.object.providerId);
should(providerIds[1]).equal(mockResourceProvider2.object.providerId);
});
});
describe('AzureResourceService.getRootChildren', function(): void {
beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider1.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should be correct when provider id is correct.', async function(): Promise<void> {
const children = await resourceService.getRootChildren(mockResourceProvider1.object.providerId, mockAccount, mockSubscription, mockTenantId);
should(children).Array();
});
it('Should throw exceptions when provider id is incorrect.', async function(): Promise<void> {
const providerId = 'non_existent_provider_id';
try {
await resourceService.getRootChildren(providerId, mockAccount, mockSubscription, mockTenantId);
} catch (error) {
should(error.message).equal(`Azure resource provider doesn't exist. Id: ${providerId}`);
return;
}
fail();
});
});
describe('AzureResourceService.getChildren', function(): void {
beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider1.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should be correct when provider id is correct.', async function(): Promise<void> {
const children = await resourceService.getChildren(mockResourceProvider1.object.providerId, TypeMoq.It.isAny());
should(children).Array();
});
it('Should throw exceptions when provider id is incorrect.', async function(): Promise<void> {
const providerId = 'non_existent_provider_id';
try {
await resourceService.getRootChildren(providerId, mockAccount, mockSubscription, mockTenantId);
} catch (error) {
should(error.message).equal(`Azure resource provider doesn't exist. Id: ${providerId}`);
return;
}
fail();
});
});
describe('AzureResourceService.getTreeItem', function(): void {
beforeEach(() => {
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getChildren(TypeMoq.It.isAny())).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider1.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should be correct when provider id is correct.', async function(): Promise<void> {
const treeItem = await resourceService.getTreeItem(mockResourceProvider1.object.providerId, TypeMoq.It.isAny());
should(treeItem).Object();
});
it('Should throw exceptions when provider id is incorrect.', async function(): Promise<void> {
const providerId = 'non_existent_provider_id';
try {
await resourceService.getRootChildren(providerId, mockAccount, mockSubscription, mockTenantId);
} catch (error) {
should(error.message).equal(`Azure resource provider doesn't exist. Id: ${providerId}`);
return;
}
fail();
});
});

View File

@@ -0,0 +1,184 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { azureResource } from '../../azureResource/azure-resource';
import { AzureResourceService } from '../../azureResource/resourceService';
import { AzureResourceResourceTreeNode } from '../../azureResource/resourceTreeNode';
const resourceService = AzureResourceService.getInstance();
// Mock test data
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
providerId: 'mock_provider'
},
displayInfo: {
displayName: 'mock_account@test.com',
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
isStale: false
};
const mockSubscription: azureResource.AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockTenantId: string = 'mock_tenant';
const mockResourceProviderId: string = 'mock_resource_provider';
const mockResourceRootNode: azureResource.IAzureResourceNode = {
account: mockAccount,
subscription: mockSubscription,
tenantId: mockTenantId,
treeItem: {
id: 'mock_resource_root_node',
label: 'mock resource root node',
iconPath: undefined,
collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
contextValue: 'mock_resource_root_node'
}
};
const mockResourceNode1: azureResource.IAzureResourceNode = {
account: mockAccount,
subscription: mockSubscription,
tenantId: mockTenantId,
treeItem: {
id: 'mock_resource_node_1',
label: 'mock resource node 1',
iconPath: undefined,
collapsibleState: vscode.TreeItemCollapsibleState.None,
contextValue: 'mock_resource_node'
}
};
const mockResourceNode2: azureResource.IAzureResourceNode = {
account: mockAccount,
subscription: mockSubscription,
tenantId: mockTenantId,
treeItem: {
id: 'mock_resource_node_2',
label: 'mock resource node 2',
iconPath: undefined,
collapsibleState: vscode.TreeItemCollapsibleState.None,
contextValue: 'mock_resource_node'
}
};
const mockResourceNodes: azureResource.IAzureResourceNode[] = [mockResourceNode1, mockResourceNode2];
let mockResourceTreeDataProvider: TypeMoq.IMock<azureResource.IAzureResourceTreeDataProvider>;
let mockResourceProvider: TypeMoq.IMock<azureResource.IAzureResourceProvider>;
describe('AzureResourceResourceTreeNode.info', function(): void {
beforeEach(() => {
mockResourceTreeDataProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider.setup((o) => o.getTreeItem(mockResourceRootNode)).returns(() => mockResourceRootNode.treeItem);
mockResourceTreeDataProvider.setup((o) => o.getChildren(mockResourceRootNode)).returns(() => Promise.resolve(mockResourceNodes));
mockResourceProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider.setup((o) => o.providerId).returns(() => mockResourceProviderId);
mockResourceProvider.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should be correct when created.', async function(): Promise<void> {
const resourceTreeNode = new AzureResourceResourceTreeNode({
resourceProviderId: mockResourceProviderId,
resourceNode: mockResourceRootNode
}, undefined);
should(resourceTreeNode.nodePathValue).equal(mockResourceRootNode.treeItem.id);
const treeItem = await resourceTreeNode.getTreeItem();
should(treeItem.id).equal(mockResourceRootNode.treeItem.id);
should(treeItem.label).equal(mockResourceRootNode.treeItem.label);
should(treeItem.collapsibleState).equal(mockResourceRootNode.treeItem.collapsibleState);
should(treeItem.contextValue).equal(mockResourceRootNode.treeItem.contextValue);
const nodeInfo = resourceTreeNode.getNodeInfo();
should(nodeInfo.label).equal(mockResourceRootNode.treeItem.label);
should(nodeInfo.isLeaf).equal(mockResourceRootNode.treeItem.collapsibleState === vscode.TreeItemCollapsibleState.None);
should(nodeInfo.nodeType).equal(mockResourceRootNode.treeItem.contextValue);
should(nodeInfo.iconType).equal(mockResourceRootNode.treeItem.contextValue);
});
});
describe('AzureResourceResourceTreeNode.getChildren', function(): void {
beforeEach(() => {
mockResourceTreeDataProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider.setup((o) => o.getChildren(mockResourceRootNode)).returns(() => Promise.resolve(mockResourceNodes));
mockResourceProvider = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider.setup((o) => o.providerId).returns(() => mockResourceProviderId);
mockResourceProvider.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should return resource nodes when it is container node.', async function(): Promise<void> {
const resourceTreeNode = new AzureResourceResourceTreeNode({
resourceProviderId: mockResourceProviderId,
resourceNode: mockResourceRootNode
}, undefined);
const children = await resourceTreeNode.getChildren();
mockResourceTreeDataProvider.verify((o) => o.getChildren(mockResourceRootNode), TypeMoq.Times.once());
should(children).Array();
should(children.length).equal(mockResourceNodes.length);
for (let ix = 0; ix < children.length; ix++) {
const child = children[ix];
should(child).instanceOf(AzureResourceResourceTreeNode);
const childNode = (child as AzureResourceResourceTreeNode).resourceNodeWithProviderId;
should(childNode.resourceProviderId).equal(mockResourceProviderId);
should(childNode.resourceNode.account).equal(mockAccount);
should(childNode.resourceNode.subscription).equal(mockSubscription);
should(childNode.resourceNode.tenantId).equal(mockTenantId);
should(childNode.resourceNode.treeItem.id).equal(mockResourceNodes[ix].treeItem.id);
should(childNode.resourceNode.treeItem.label).equal(mockResourceNodes[ix].treeItem.label);
should(childNode.resourceNode.treeItem.collapsibleState).equal(mockResourceNodes[ix].treeItem.collapsibleState);
should(childNode.resourceNode.treeItem.contextValue).equal(mockResourceNodes[ix].treeItem.contextValue);
}
});
it('Should return empty when it is leaf node.', async function(): Promise<void> {
const resourceTreeNode = new AzureResourceResourceTreeNode({
resourceProviderId: mockResourceProviderId,
resourceNode: mockResourceNode1
}, undefined);
const children = await resourceTreeNode.getChildren();
mockResourceTreeDataProvider.verify((o) => o.getChildren(), TypeMoq.Times.exactly(0));
should(children).Array();
should(children.length).equal(0);
});
});

View File

@@ -26,7 +26,7 @@ describe('AzureResourceAccountNotSignedInTreeNode.info', function(): void {
should(treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.None);
should(treeItem.command).not.undefined();
should(treeItem.command.title).equal(label);
should(treeItem.command.command).equal('azureresource.signin');
should(treeItem.command.command).equal('azure.resource.signin');
const nodeInfo = treeNode.getNodeInfo();
should(nodeInfo.isLeaf).true();

View File

@@ -10,35 +10,38 @@ import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { ServiceClientCredentials } from 'ms-rest';
import { TokenCredentials } from 'ms-rest';
import { AppContext } from '../../../appContext';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import { azureResource } from '../../../azureResource/azure-resource';
import {
IAzureResourceCacheService,
IAzureResourceContextService,
IAzureResourceCredentialService,
IAzureResourceSubscriptionService,
IAzureResourceSubscriptionFilterService
IAzureResourceSubscriptionFilterService,
IAzureResourceTenantService
} from '../../../azureResource/interfaces';
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
import { AzureResourceAccountTreeNode } from '../../../azureResource/tree/accountTreeNode';
import { AzureResourceSubscription } from '../../../azureResource/models';
import { AzureResourceSubscriptionTreeNode } from '../../../azureResource/tree/subscriptionTreeNode';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceMessageTreeNode } from '../../../azureResource/tree/messageTreeNode';
import { AzureResourceItemType, AzureResourceServiceNames } from '../../../azureResource/constants';
import { AzureResourceMessageTreeNode } from '../../../azureResource/messageTreeNode';
import { ApiWrapper } from '../../../apiWrapper';
import { generateGuid } from '../../../azureResource/utils';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockExtensionContext: TypeMoq.IMock<vscode.ExtensionContext>;
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
let mockCacheService: TypeMoq.IMock<IAzureResourceCacheService>;
let mockContextService: TypeMoq.IMock<IAzureResourceContextService>;
let mockCredentialService: TypeMoq.IMock<IAzureResourceCredentialService>;
let mockSubscriptionService: TypeMoq.IMock<IAzureResourceSubscriptionService>;
let mockSubscriptionFilterService: TypeMoq.IMock<IAzureResourceSubscriptionFilterService>;
let mockTenantService: TypeMoq.IMock<IAzureResourceTenantService>;
let mockAppContext: AppContext;
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
// Mock test data
const mockTenantId = 'mock_tenant_id';
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
@@ -49,51 +52,68 @@ const mockAccount: sqlops.Account = {
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
properties: {
tenants: [
{
id: mockTenantId
}
]
},
isStale: false
};
const mockCredential = TypeMoq.Mock.ofType<ServiceClientCredentials>().object;
const mockCredentials = [mockCredential];
const mockSubscription1: AzureResourceSubscription = {
const mockSubscription1: azureResource.AzureResourceSubscription = {
id: 'mock_subscription_1',
name: 'mock subscription 1'
};
const mockSubscription2: AzureResourceSubscription = {
const mockSubscription2: azureResource.AzureResourceSubscription = {
id: 'mock_subscription_2',
name: 'mock subscription 2'
};
const mockSubscriptions = [mockSubscription1, mockSubscription2];
const mockFilteredSubscriptions = [mockSubscription1];
let mockSubscriptionCache: { subscriptions: { [accountId: string]: AzureResourceSubscription[]} };
const mockTokens = {};
mockTokens[mockTenantId] = {
token: 'mock_token',
tokenType: 'Bearer'
};
const mockCredential = new TokenCredentials(mockTokens[mockTenantId].token, mockTokens[mockTenantId].tokenType);
let mockSubscriptionCache: azureResource.AzureResourceSubscription[] = [];
describe('AzureResourceAccountTreeNode.info', function(): void {
beforeEach(() => {
mockContextService = TypeMoq.Mock.ofType<IAzureResourceContextService>();
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockCredentialService = TypeMoq.Mock.ofType<IAzureResourceCredentialService>();
mockSubscriptionService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionService>();
mockSubscriptionFilterService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionFilterService>();
mockTenantService = TypeMoq.Mock.ofType<IAzureResourceTenantService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockSubscriptionCache = { subscriptions: {} };
mockSubscriptionCache = [];
mockServicePool.contextService = mockContextService.object;
mockServicePool.cacheService = mockCacheService.object;
mockServicePool.credentialService = mockCredentialService.object;
mockServicePool.subscriptionService = mockSubscriptionService.object;
mockServicePool.subscriptionFilterService = mockSubscriptionFilterService.object;
mockAppContext = new AppContext(mockExtensionContext.object, mockApiWrapper.object);
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
mockAppContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, mockSubscriptionService.object);
mockAppContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, mockSubscriptionFilterService.object);
mockAppContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, mockTenantService.object);
mockCredentialService.setup((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockCredentials));
mockApiWrapper.setup((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockTokens));
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockSubscriptionCache);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache.subscriptions[mockAccount.key.accountId] = mockSubscriptions);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache = mockSubscriptions);
mockTenantService.setup((o) => o.getTenantId(TypeMoq.It.isAny())).returns(() => Promise.resolve(mockTenantId));
});
it('Should be correct when created.', async function(): Promise<void> {
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
const accountTreeNodeId = `account_${mockAccount.key.accountId}`;
const accountTreeNodeLabel = `${mockAccount.displayInfo.displayName} (${mockAccount.key.accountId})`;
@@ -114,14 +134,17 @@ describe('AzureResourceAccountTreeNode.info', function(): void {
});
it('Should be correct when there are subscriptions listed.', async function(): Promise<void> {
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined));
const accountTreeNodeLabel = `${mockAccount.displayInfo.displayName} (${mockAccount.key.accountId}) (${mockSubscriptions.length} / ${mockSubscriptions.length} subscriptions)`;
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
await accountTreeNode.getChildren();
const subscriptionNodes = await accountTreeNode.getChildren();
should(subscriptionNodes).Array();
should(subscriptionNodes.length).equal(mockSubscriptions.length);
const treeItem = await accountTreeNode.getTreeItem();
should(treeItem.label).equal(accountTreeNodeLabel);
@@ -131,14 +154,17 @@ describe('AzureResourceAccountTreeNode.info', function(): void {
});
it('Should be correct when there are subscriptions filtered.', async function(): Promise<void> {
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(mockFilteredSubscriptions));
const accountTreeNodeLabel = `${mockAccount.displayInfo.displayName} (${mockAccount.key.accountId}) (${mockFilteredSubscriptions.length} / ${mockSubscriptions.length} subscriptions)`;
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
await accountTreeNode.getChildren();
const subscriptionNodes = await accountTreeNode.getChildren();
should(subscriptionNodes).Array();
should(subscriptionNodes.length).equal(mockFilteredSubscriptions.length);
const treeItem = await accountTreeNode.getTreeItem();
should(treeItem.label).equal(accountTreeNodeLabel);
@@ -150,36 +176,41 @@ describe('AzureResourceAccountTreeNode.info', function(): void {
describe('AzureResourceAccountTreeNode.getChildren', function(): void {
beforeEach(() => {
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockCredentialService = TypeMoq.Mock.ofType<IAzureResourceCredentialService>();
mockSubscriptionService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionService>();
mockSubscriptionFilterService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionFilterService>();
mockTenantService = TypeMoq.Mock.ofType<IAzureResourceTenantService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockSubscriptionCache = { subscriptions: {} };
mockSubscriptionCache = [];
mockServicePool.cacheService = mockCacheService.object;
mockServicePool.credentialService = mockCredentialService.object;
mockServicePool.subscriptionService = mockSubscriptionService.object;
mockServicePool.subscriptionFilterService = mockSubscriptionFilterService.object;
mockAppContext = new AppContext(mockExtensionContext.object, mockApiWrapper.object);
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
mockAppContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, mockSubscriptionService.object);
mockAppContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, mockSubscriptionFilterService.object);
mockAppContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, mockTenantService.object);
mockCredentialService.setup((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockCredentials));
mockApiWrapper.setup((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockTokens));
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockSubscriptionCache);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache.subscriptions[mockAccount.key.accountId] = mockSubscriptions);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache = mockSubscriptions);
mockTenantService.setup((o) => o.getTenantId(TypeMoq.It.isAny())).returns(() => Promise.resolve(mockTenantId));
});
it('Should load subscriptions from scratch and update cache when it is clearing cache.', async function(): Promise<void> {
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined));
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve([]));
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
const children = await accountTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredentials), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.once());
mockApiWrapper.verify((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.exactly(0));
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
mockSubscriptionFilterService.verify((o) => o.getSelectedSubscriptions(mockAccount), TypeMoq.Times.once());
@@ -192,43 +223,42 @@ describe('AzureResourceAccountTreeNode.getChildren', function(): void {
should(children).Array();
should(children.length).equal(mockSubscriptions.length);
should(Object.keys(mockSubscriptionCache.subscriptions)).deepEqual([mockAccount.key.accountId]);
should(mockSubscriptionCache.subscriptions[mockAccount.key.accountId]).deepEqual(mockSubscriptions);
should(mockSubscriptionCache).deepEqual(mockSubscriptions);
for (let ix = 0; ix < mockSubscriptions.length; ix++) {
const child = children[ix];
const subscription = mockSubscriptions[ix];
should(child).instanceof(AzureResourceSubscriptionTreeNode);
should(child.nodePathValue).equal(`subscription_${subscription.id}`);
should(child.nodePathValue).equal(`account_${mockAccount.key.accountId}.subscription_${subscription.id}.tenant_${mockTenantId}`);
}
});
it('Should load subscriptions from cache when it is not clearing cache.', async function(): Promise<void> {
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(undefined));
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
await accountTreeNode.getChildren();
const children = await accountTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.exactly(1));
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredentials), TypeMoq.Times.exactly(1));
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.exactly(2));
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.exactly(1));
mockApiWrapper.verify((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.once());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
should(children.length).equal(mockSubscriptionCache.subscriptions[mockAccount.key.accountId].length);
should(children.length).equal(mockSubscriptionCache.length);
for (let ix = 0; ix < mockSubscriptionCache.subscriptions[mockAccount.key.accountId].length; ix++) {
should(children[ix].nodePathValue).equal(`subscription_${mockSubscriptionCache.subscriptions[mockAccount.key.accountId][ix].id}`);
for (let ix = 0; ix < mockSubscriptionCache.length; ix++) {
should(children[ix].nodePathValue).equal(`account_${mockAccount.key.accountId}.subscription_${mockSubscriptionCache[ix].id}.tenant_${mockTenantId}`);
}
});
it('Should handle when there is no subscriptions.', async function(): Promise<void> {
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => Promise.resolve(undefined));
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(undefined));
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
const children = await accountTreeNode.getChildren();
@@ -242,10 +272,10 @@ describe('AzureResourceAccountTreeNode.getChildren', function(): void {
});
it('Should honor subscription filtering.', async function(): Promise<void> {
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => Promise.resolve(mockFilteredSubscriptions));
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
const children = await accountTreeNode.getChildren();
@@ -255,23 +285,25 @@ describe('AzureResourceAccountTreeNode.getChildren', function(): void {
should(children.length).equal(mockFilteredSubscriptions.length);
for (let ix = 0; ix < mockFilteredSubscriptions.length; ix++) {
should(children[ix].nodePathValue).equal(`subscription_${mockFilteredSubscriptions[ix].id}`);
should(children[ix].nodePathValue).equal(`account_${mockAccount.key.accountId}.subscription_${mockFilteredSubscriptions[ix].id}.tenant_${mockTenantId}`);
}
});
it('Should handle errors.', async function(): Promise<void> {
const mockError = 'Test error';
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredentials)).returns(() => { throw new Error(mockError); });
mockSubscriptionService.setup((o) => o.getSubscriptions(mockAccount, mockCredential)).returns(() => Promise.resolve(mockSubscriptions));
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const mockError = 'Test error';
mockSubscriptionFilterService.setup((o) => o.getSelectedSubscriptions(mockAccount)).returns(() => { throw new Error(mockError); });
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
const children = await accountTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredentials), TypeMoq.Times.once());
mockApiWrapper.verify((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockSubscriptionService.verify((o) => o.getSubscriptions(mockAccount, mockCredential), TypeMoq.Times.once());
mockSubscriptionFilterService.verify((o) => o.getSelectedSubscriptions(mockAccount), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.never());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.never());
mockSubscriptionFilterService.verify((o) => o.getSelectedSubscriptions(mockAccount), TypeMoq.Times.never());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
should(children).Array();
should(children.length).equal(1);
@@ -283,12 +315,33 @@ describe('AzureResourceAccountTreeNode.getChildren', function(): void {
describe('AzureResourceAccountTreeNode.clearCache', function() : void {
beforeEach(() => {
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockSubscriptionService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionService>();
mockSubscriptionFilterService = TypeMoq.Mock.ofType<IAzureResourceSubscriptionFilterService>();
mockTenantService = TypeMoq.Mock.ofType<IAzureResourceTenantService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockSubscriptionCache = [];
mockAppContext = new AppContext(mockExtensionContext.object, mockApiWrapper.object);
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
mockAppContext.registerService<IAzureResourceSubscriptionService>(AzureResourceServiceNames.subscriptionService, mockSubscriptionService.object);
mockAppContext.registerService<IAzureResourceSubscriptionFilterService>(AzureResourceServiceNames.subscriptionFilterService, mockSubscriptionFilterService.object);
mockAppContext.registerService<IAzureResourceTenantService>(AzureResourceServiceNames.tenantService, mockTenantService.object);
mockApiWrapper.setup((o) => o.getSecurityToken(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockTokens));
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockSubscriptionCache);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockSubscriptionCache = mockSubscriptions);
mockTenantService.setup((o) => o.getTenantId(TypeMoq.It.isAny())).returns(() => Promise.resolve(mockTenantId));
});
it('Should clear cache.', async function(): Promise<void> {
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockTreeChangeHandler.object);
const accountTreeNode = new AzureResourceAccountTreeNode(mockAccount, mockAppContext, mockTreeChangeHandler.object);
accountTreeNode.clearCache();
should(accountTreeNode.isClearingCache).true();
});
});
});

View File

@@ -1,219 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { ServiceClientCredentials } from 'ms-rest';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import {
IAzureResourceCacheService,
IAzureResourceContextService,
IAzureResourceCredentialService,
IAzureResourceDatabaseService
} from '../../../azureResource/interfaces';
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
import { AzureResourceSubscription, AzureResourceDatabase } from '../../../azureResource/models';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceMessageTreeNode } from '../../../azureResource/tree/messageTreeNode';
import { AzureResourceDatabaseContainerTreeNode } from '../../../azureResource/tree/databaseContainerTreeNode';
import { AzureResourceDatabaseTreeNode } from '../../../azureResource/tree/databaseTreeNode';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockCacheService: TypeMoq.IMock<IAzureResourceCacheService>;
let mockContextService: TypeMoq.IMock<IAzureResourceContextService>;
let mockCredentialService: TypeMoq.IMock<IAzureResourceCredentialService>;
let mockDatabaseService: TypeMoq.IMock<IAzureResourceDatabaseService>;
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
// Mock test data
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
providerId: 'mock_provider'
},
displayInfo: {
displayName: 'mock_account@test.com',
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
isStale: false
};
const mockCredential = TypeMoq.Mock.ofType<ServiceClientCredentials>().object;
const mockCredentials = [mockCredential];
const mockSubscription: AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockDatabase1: AzureResourceDatabase = {
name: 'mock database 1',
serverName: 'mock server 1',
serverFullName: 'mock server 1',
loginName: 'mock user 1'
};
const mockDatabase2: AzureResourceDatabase = {
name: 'mock database 2',
serverName: 'mock server 2',
serverFullName: 'mock server 2',
loginName: 'mock user 2'
};
const mockDatabases = [mockDatabase1, mockDatabase2];
let mockDatabaseContainerCache: { databases: { [subscriptionId: string]: AzureResourceDatabase[] } };
describe('AzureResourceDatabaseContainerTreeNode.info', function(): void {
beforeEach(() => {
mockContextService = TypeMoq.Mock.ofType<IAzureResourceContextService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockServicePool.contextService = mockContextService.object;
});
it('Should be correct when created.', async function(): Promise<void> {
const databaseContainerTreeNode = new AzureResourceDatabaseContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const databaseContainerTreeNodeLabel = 'SQL Databases';
should(databaseContainerTreeNode.nodePathValue).equal('databaseContainer');
const treeItem = await databaseContainerTreeNode.getTreeItem();
should(treeItem.label).equal(databaseContainerTreeNodeLabel);
should(treeItem.contextValue).equal(AzureResourceItemType.databaseContainer);
should(treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed);
const nodeInfo = databaseContainerTreeNode.getNodeInfo();
should(nodeInfo.isLeaf).false();
should(nodeInfo.label).equal(databaseContainerTreeNodeLabel);
should(nodeInfo.nodeType).equal(AzureResourceItemType.databaseContainer);
should(nodeInfo.iconType).equal(AzureResourceItemType.databaseContainer);
});
});
describe('AzureResourceDatabaseContainerTreeNode.getChildren', function(): void {
beforeEach(() => {
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockCredentialService = TypeMoq.Mock.ofType<IAzureResourceCredentialService>();
mockDatabaseService = TypeMoq.Mock.ofType<IAzureResourceDatabaseService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockDatabaseContainerCache = { databases: {} };
mockServicePool.cacheService = mockCacheService.object;
mockServicePool.credentialService = mockCredentialService.object;
mockServicePool.databaseService = mockDatabaseService.object;
mockCredentialService.setup((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockCredentials));
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockDatabaseContainerCache);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockDatabaseContainerCache.databases[mockSubscription.id] = mockDatabases);
});
it('Should load databases from scratch and update cache when it is clearing cache.', async function(): Promise<void> {
mockDatabaseService.setup((o) => o.getDatabases(mockSubscription, mockCredentials)).returns(() => Promise.resolve(mockDatabases));
const databaseContainerTreeNode = new AzureResourceDatabaseContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const children = await databaseContainerTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockDatabaseService.verify((o) => o.getDatabases(mockSubscription, mockCredentials), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.once());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
should(databaseContainerTreeNode.isClearingCache).false();
should(children).Array();
should(children.length).equal(mockDatabases.length);
should(Object.keys(mockDatabaseContainerCache.databases)).deepEqual([mockSubscription.id]);
should(mockDatabaseContainerCache.databases[mockSubscription.id]).deepEqual(mockDatabases);
for (let ix = 0; ix < mockDatabases.length; ix++) {
const child = children[ix];
const database = mockDatabases[ix];
should(child).instanceof(AzureResourceDatabaseTreeNode);
should(child.nodePathValue).equal(`database_${database.name}`);
}
});
it('Should load databases from cache when it is not clearing cache.', async function(): Promise<void> {
mockDatabaseService.setup((o) => o.getDatabases(mockSubscription, mockCredentials)).returns(() => Promise.resolve(mockDatabases));
const databaseContainerTreeNode = new AzureResourceDatabaseContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
await databaseContainerTreeNode.getChildren();
const children = await databaseContainerTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.exactly(1));
mockDatabaseService.verify((o) => o.getDatabases(mockSubscription, mockCredentials), TypeMoq.Times.exactly(1));
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.exactly(2));
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.exactly(1));
should(children.length).equal(mockDatabaseContainerCache.databases[mockSubscription.id].length);
for (let ix = 0; ix < mockDatabaseContainerCache.databases[mockSubscription.id].length; ix++) {
should(children[ix].nodePathValue).equal(`database_${mockDatabaseContainerCache.databases[mockSubscription.id][ix].name}`);
}
});
it('Should handle when there is no databases.', async function(): Promise<void> {
mockDatabaseService.setup((o) => o.getDatabases(mockSubscription, mockCredentials)).returns(() => Promise.resolve(undefined));
const databaseContainerTreeNode = new AzureResourceDatabaseContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const children = await databaseContainerTreeNode.getChildren();
should(children).Array();
should(children.length).equal(1);
should(children[0]).instanceof(AzureResourceMessageTreeNode);
should(children[0].nodePathValue).startWith('message_');
should(children[0].getNodeInfo().label).equal('No SQL Databases found.');
});
it('Should handle errors.', async function(): Promise<void> {
const mockError = 'Test error';
mockDatabaseService.setup((o) => o.getDatabases(mockSubscription, mockCredentials)).returns(() => { throw new Error(mockError); });
const databaseContainerTreeNode = new AzureResourceDatabaseContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const children = await databaseContainerTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockDatabaseService.verify((o) => o.getDatabases(mockSubscription, mockCredentials), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.never());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.never());
should(children).Array();
should(children.length).equal(1);
should(children[0]).instanceof(AzureResourceMessageTreeNode);
should(children[0].nodePathValue).startWith('message_');
should(children[0].getNodeInfo().label).equal(`Error: ${mockError}`);
});
});
describe('AzureResourceDatabaseContainerTreeNode.clearCache', function() : void {
beforeEach(() => {
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
});
it('Should clear cache.', async function(): Promise<void> {
const databaseContainerTreeNode = new AzureResourceDatabaseContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
databaseContainerTreeNode.clearCache();
should(databaseContainerTreeNode.isClearingCache).true();
});
});

View File

@@ -1,219 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { ServiceClientCredentials } from 'ms-rest';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import {
IAzureResourceCacheService,
IAzureResourceContextService,
IAzureResourceCredentialService,
IAzureResourceDatabaseServerService
} from '../../../azureResource/interfaces';
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
import { AzureResourceSubscription, AzureResourceDatabaseServer } from '../../../azureResource/models';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceMessageTreeNode } from '../../../azureResource/tree/messageTreeNode';
import { AzureResourceDatabaseServerContainerTreeNode } from '../../../azureResource/tree/databaseServerContainerTreeNode';
import { AzureResourceDatabaseServerTreeNode } from '../../../azureResource/tree/databaseServerTreeNode';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockCacheService: TypeMoq.IMock<IAzureResourceCacheService>;
let mockContextService: TypeMoq.IMock<IAzureResourceContextService>;
let mockCredentialService: TypeMoq.IMock<IAzureResourceCredentialService>;
let mockDatabaseServerService: TypeMoq.IMock<IAzureResourceDatabaseServerService>;
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
// Mock test data
const mockAccount: sqlops.Account = {
key: {
accountId: 'mock_account',
providerId: 'mock_provider'
},
displayInfo: {
displayName: 'mock_account@test.com',
accountType: 'Microsoft',
contextualDisplayName: 'test'
},
properties: undefined,
isStale: false
};
const mockCredential = TypeMoq.Mock.ofType<ServiceClientCredentials>().object;
const mockCredentials = [mockCredential];
const mockSubscription: AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockDatabaseServer1: AzureResourceDatabaseServer = {
name: 'mock server 1',
fullName: 'mock server 1',
loginName: 'mock user 1',
defaultDatabaseName: 'master'
};
const mockDatabaseServer2: AzureResourceDatabaseServer = {
name: 'mock server 2',
fullName: 'mock server 2',
loginName: 'mock user 2',
defaultDatabaseName: 'master'
};
const mockDatabaseServers = [mockDatabaseServer1, mockDatabaseServer2];
let mockDatabaseServerContainerCache: { databaseServers: { [subscriptionId: string]: AzureResourceDatabaseServer[] } };
describe('AzureResourceDatabaseServerContainerTreeNode.info', function(): void {
beforeEach(() => {
mockContextService = TypeMoq.Mock.ofType<IAzureResourceContextService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockServicePool.contextService = mockContextService.object;
});
it('Should be correct when created.', async function(): Promise<void> {
const databaseServerContainerTreeNode = new AzureResourceDatabaseServerContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const databaseServerContainerTreeNodeLabel = 'SQL Servers';
should(databaseServerContainerTreeNode.nodePathValue).equal('databaseServerContainer');
const treeItem = await databaseServerContainerTreeNode.getTreeItem();
should(treeItem.label).equal(databaseServerContainerTreeNodeLabel);
should(treeItem.contextValue).equal(AzureResourceItemType.databaseServerContainer);
should(treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.Collapsed);
const nodeInfo = databaseServerContainerTreeNode.getNodeInfo();
should(nodeInfo.isLeaf).false();
should(nodeInfo.label).equal(databaseServerContainerTreeNodeLabel);
should(nodeInfo.nodeType).equal(AzureResourceItemType.databaseServerContainer);
should(nodeInfo.iconType).equal(AzureResourceItemType.databaseServerContainer);
});
});
describe('AzureResourceDatabaseServerContainerTreeNode.getChildren', function(): void {
beforeEach(() => {
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockCredentialService = TypeMoq.Mock.ofType<IAzureResourceCredentialService>();
mockDatabaseServerService = TypeMoq.Mock.ofType<IAzureResourceDatabaseServerService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockDatabaseServerContainerCache = { databaseServers: {} };
mockServicePool.cacheService = mockCacheService.object;
mockServicePool.credentialService = mockCredentialService.object;
mockServicePool.databaseServerService = mockDatabaseServerService.object;
mockCredentialService.setup((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement)).returns(() => Promise.resolve(mockCredentials));
mockCacheService.setup((o) => o.get(TypeMoq.It.isAnyString())).returns(() => mockDatabaseServerContainerCache);
mockCacheService.setup((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny())).returns(() => mockDatabaseServerContainerCache.databaseServers[mockSubscription.id] = mockDatabaseServers);
});
it('Should load database servers from scratch and update cache when it is clearing cache.', async function(): Promise<void> {
mockDatabaseServerService.setup((o) => o.getDatabaseServers(mockSubscription, mockCredentials)).returns(() => Promise.resolve(mockDatabaseServers));
const databaseServerContainerTreeNode = new AzureResourceDatabaseServerContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const children = await databaseServerContainerTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockDatabaseServerService.verify((o) => o.getDatabaseServers(mockSubscription, mockCredentials), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.once());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.once());
should(databaseServerContainerTreeNode.isClearingCache).false();
should(children).Array();
should(children.length).equal(mockDatabaseServers.length);
should(Object.keys(mockDatabaseServerContainerCache.databaseServers)).deepEqual([mockSubscription.id]);
should(mockDatabaseServerContainerCache.databaseServers[mockSubscription.id]).deepEqual(mockDatabaseServers);
for (let ix = 0; ix < mockDatabaseServers.length; ix++) {
const child = children[ix];
const databaseServer = mockDatabaseServers[ix];
should(child).instanceof(AzureResourceDatabaseServerTreeNode);
should(child.nodePathValue).equal(`databaseServer_${databaseServer.name}`);
}
});
it('Should load database servers from cache when it is not clearing cache.', async function(): Promise<void> {
mockDatabaseServerService.setup((o) => o.getDatabaseServers(mockSubscription, mockCredentials)).returns(() => Promise.resolve(mockDatabaseServers));
const databaseServerContainerTreeNode = new AzureResourceDatabaseServerContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
await databaseServerContainerTreeNode.getChildren();
const children = await databaseServerContainerTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.exactly(1));
mockDatabaseServerService.verify((o) => o.getDatabaseServers(mockSubscription, mockCredentials), TypeMoq.Times.exactly(1));
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.exactly(2));
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.exactly(1));
should(children.length).equal(mockDatabaseServerContainerCache.databaseServers[mockSubscription.id].length);
for (let ix = 0; ix < mockDatabaseServerContainerCache.databaseServers[mockSubscription.id].length; ix++) {
should(children[ix].nodePathValue).equal(`databaseServer_${mockDatabaseServerContainerCache.databaseServers[mockSubscription.id][ix].name}`);
}
});
it('Should handle when there is no database servers.', async function(): Promise<void> {
mockDatabaseServerService.setup((o) => o.getDatabaseServers(mockSubscription, mockCredentials)).returns(() => Promise.resolve(undefined));
const databaseContainerTreeNode = new AzureResourceDatabaseServerContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const children = await databaseContainerTreeNode.getChildren();
should(children).Array();
should(children.length).equal(1);
should(children[0]).instanceof(AzureResourceMessageTreeNode);
should(children[0].nodePathValue).startWith('message_');
should(children[0].getNodeInfo().label).equal('No SQL Servers found.');
});
it('Should handle errors.', async function(): Promise<void> {
const mockError = 'Test error';
mockDatabaseServerService.setup((o) => o.getDatabaseServers(mockSubscription, mockCredentials)).returns(() => { throw new Error(mockError); });
const databaseServerContainerTreeNode = new AzureResourceDatabaseServerContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const children = await databaseServerContainerTreeNode.getChildren();
mockCredentialService.verify((o) => o.getCredentials(mockAccount, sqlops.AzureResource.ResourceManagement), TypeMoq.Times.once());
mockDatabaseServerService.verify((o) => o.getDatabaseServers(mockSubscription, mockCredentials), TypeMoq.Times.once());
mockCacheService.verify((o) => o.get(TypeMoq.It.isAnyString()), TypeMoq.Times.never());
mockCacheService.verify((o) => o.update(TypeMoq.It.isAnyString(), TypeMoq.It.isAny()), TypeMoq.Times.never());
should(children).Array();
should(children.length).equal(1);
should(children[0]).instanceof(AzureResourceMessageTreeNode);
should(children[0].nodePathValue).startWith('message_');
should(children[0].getNodeInfo().label).equal(`Error: ${mockError}`);
});
});
describe('AzureResourceDatabaseServerContainerTreeNode.clearCache', function() : void {
beforeEach(() => {
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
});
it('Should clear cache.', async function(): Promise<void> {
const databaseServerContainerTreeNode = new AzureResourceDatabaseServerContainerTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
databaseServerContainerTreeNode.clearCache();
should(databaseServerContainerTreeNode.isClearingCache).true();
});
});

View File

@@ -1,62 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as vscode from 'vscode';
import 'mocha';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import { IAzureResourceContextService } from '../../../azureResource/interfaces';
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
import { AzureResourceDatabaseServer } from '../../../azureResource/models';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceDatabaseServerTreeNode } from '../../../azureResource/tree/databaseServerTreeNode';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockContextService: TypeMoq.IMock<IAzureResourceContextService>;
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
// Mock test data
const mockDatabaseServer: AzureResourceDatabaseServer = {
name: 'mock database 1',
fullName: 'mock server 1',
loginName: 'mock user 1',
defaultDatabaseName: 'master'
};
describe('AzureResourceDatabaseServerTreeNode.info', function(): void {
beforeEach(() => {
mockContextService = TypeMoq.Mock.ofType<IAzureResourceContextService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockServicePool.contextService = mockContextService.object;
});
it('Should be correct when created.', async function(): Promise<void> {
const databaseServerTreeNode = new AzureResourceDatabaseServerTreeNode(mockDatabaseServer, mockTreeChangeHandler.object, undefined);
const databaseServerTreeNodeLabel = mockDatabaseServer.name;
should(databaseServerTreeNode.nodePathValue).equal(`databaseServer_${mockDatabaseServer.name}`);
const treeItem = await databaseServerTreeNode.getTreeItem();
should(treeItem.label).equal(databaseServerTreeNodeLabel);
should(treeItem.contextValue).equal(AzureResourceItemType.databaseServer);
should(treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.None);
const nodeInfo = databaseServerTreeNode.getNodeInfo();
should(nodeInfo.isLeaf).true();
should(nodeInfo.label).equal(databaseServerTreeNodeLabel);
should(nodeInfo.nodeType).equal(AzureResourceItemType.databaseServer);
should(nodeInfo.iconType).equal(AzureResourceItemType.databaseServer);
});
});

View File

@@ -1,62 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as vscode from 'vscode';
import 'mocha';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import { IAzureResourceContextService } from '../../../azureResource/interfaces';
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
import { AzureResourceDatabase } from '../../../azureResource/models';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceDatabaseTreeNode } from '../../../azureResource/tree/databaseTreeNode';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockContextService: TypeMoq.IMock<IAzureResourceContextService>;
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
// Mock test data
const mockDatabase: AzureResourceDatabase = {
name: 'mock database 1',
serverName: 'mock server 1',
serverFullName: 'mock server 1',
loginName: 'mock user 1'
};
describe('AzureResourceDatabaseTreeNode.info', function(): void {
beforeEach(() => {
mockContextService = TypeMoq.Mock.ofType<IAzureResourceContextService>();
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockServicePool.contextService = mockContextService.object;
});
it('Should be correct.', async function(): Promise<void> {
const databaseTreeNode = new AzureResourceDatabaseTreeNode(mockDatabase, mockTreeChangeHandler.object, undefined);
const databaseTreeNodeLabel = `${mockDatabase.name} (${mockDatabase.serverName})`;
should(databaseTreeNode.nodePathValue).equal(`database_${mockDatabase.name}`);
const treeItem = await databaseTreeNode.getTreeItem();
should(treeItem.label).equal(databaseTreeNodeLabel);
should(treeItem.contextValue).equal(AzureResourceItemType.database);
should(treeItem.collapsibleState).equal(vscode.TreeItemCollapsibleState.None);
const nodeInfo = databaseTreeNode.getNodeInfo();
should(nodeInfo.isLeaf).true();
should(nodeInfo.label).equal(databaseTreeNodeLabel);
should(nodeInfo.nodeType).equal(AzureResourceItemType.database);
should(nodeInfo.iconType).equal(AzureResourceItemType.database);
});
});

View File

@@ -10,20 +10,24 @@ import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import * as vscode from 'vscode';
import 'mocha';
import { AppContext } from '../../../appContext';
import { ApiWrapper } from '../../../apiWrapper';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import { IAzureResourceContextService } from '../../../azureResource/interfaces';
import { azureResource } from '../../../azureResource/azure-resource';
import { IAzureResourceTreeChangeHandler } from '../../../azureResource/tree/treeChangeHandler';
import { AzureResourceSubscription } from '../../../azureResource/models';
import { AzureResourceSubscriptionTreeNode } from '../../../azureResource/tree/subscriptionTreeNode';
import { AzureResourceDatabaseContainerTreeNode } from '../../../azureResource/tree/databaseContainerTreeNode';
import { AzureResourceDatabaseServerContainerTreeNode } from '../../../azureResource/tree/databaseServerContainerTreeNode';
import { AzureResourceItemType } from '../../../azureResource/constants';
import { AzureResourceItemType, AzureResourceServiceNames } from '../../../azureResource/constants';
import { AzureResourceService } from '../../../azureResource/resourceService';
import { AzureResourceResourceTreeNode } from '../../../azureResource/resourceTreeNode';
import { IAzureResourceCacheService } from '../../../azureResource/interfaces';
import { generateGuid } from '../../../azureResource/utils';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockAppContext: AppContext;
let mockContextService: TypeMoq.IMock<IAzureResourceContextService>;
let mockExtensionContext: TypeMoq.IMock<vscode.ExtensionContext>;
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
let mockCacheService: TypeMoq.IMock<IAzureResourceCacheService>;
let mockTreeChangeHandler: TypeMoq.IMock<IAzureResourceTreeChangeHandler>;
@@ -42,24 +46,60 @@ const mockAccount: sqlops.Account = {
isStale: false
};
const mockSubscription: AzureResourceSubscription = {
const mockSubscription: azureResource.AzureResourceSubscription = {
id: 'mock_subscription',
name: 'mock subscription'
};
const mockTenantId: string = 'mock_tenant';
let mockResourceTreeDataProvider1: TypeMoq.IMock<azureResource.IAzureResourceTreeDataProvider>;
let mockResourceProvider1: TypeMoq.IMock<azureResource.IAzureResourceProvider>;
let mockResourceTreeDataProvider2: TypeMoq.IMock<azureResource.IAzureResourceTreeDataProvider>;
let mockResourceProvider2: TypeMoq.IMock<azureResource.IAzureResourceProvider>;
const resourceService: AzureResourceService = AzureResourceService.getInstance();
describe('AzureResourceSubscriptionTreeNode.info', function(): void {
beforeEach(() => {
mockContextService = TypeMoq.Mock.ofType<IAzureResourceContextService>();
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockAppContext = new AppContext(mockExtensionContext.object, mockApiWrapper.object);
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockServicePool.contextService = mockContextService.object;
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2');
mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider1.object);
resourceService.registerResourceProvider(mockResourceProvider2.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should be correct when created.', async function(): Promise<void> {
const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, mockAppContext, mockTreeChangeHandler.object, undefined);
should(subscriptionTreeNode.nodePathValue).equal(`subscription_${mockSubscription.id}`);
should(subscriptionTreeNode.nodePathValue).equal(`account_${mockAccount.key.accountId}.subscription_${mockSubscription.id}.tenant_${mockTenantId}`);
const treeItem = await subscriptionTreeNode.getTreeItem();
should(treeItem.label).equal(mockSubscription.name);
@@ -76,16 +116,52 @@ describe('AzureResourceSubscriptionTreeNode.info', function(): void {
describe('AzureResourceSubscriptionTreeNode.getChildren', function(): void {
beforeEach(() => {
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockAppContext = new AppContext(mockExtensionContext.object, mockApiWrapper.object);
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
mockTreeChangeHandler = TypeMoq.Mock.ofType<IAzureResourceTreeChangeHandler>();
mockResourceTreeDataProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider1.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider1.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider1 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider1.setup((o) => o.providerId).returns(() => 'mockResourceProvider1');
mockResourceProvider1.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider1.object);
mockResourceTreeDataProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceTreeDataProvider>();
mockResourceTreeDataProvider2.setup((o) => o.getChildren()).returns(() => Promise.resolve([TypeMoq.Mock.ofType<azureResource.IAzureResourceNode>().object]));
mockResourceTreeDataProvider2.setup((o) => o.getTreeItem(TypeMoq.It.isAny())).returns(() => Promise.resolve(TypeMoq.It.isAny()));
mockResourceProvider2 = TypeMoq.Mock.ofType<azureResource.IAzureResourceProvider>();
mockResourceProvider2.setup((o) => o.providerId).returns(() => 'mockResourceProvider2');
mockResourceProvider2.setup((o) => o.getTreeDataProvider()).returns(() => mockResourceTreeDataProvider2.object);
resourceService.clearResourceProviders();
resourceService.registerResourceProvider(mockResourceProvider1.object);
resourceService.registerResourceProvider(mockResourceProvider2.object);
resourceService.areResourceProvidersLoaded = true;
});
it('Should load database containers.', async function(): Promise<void> {
const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockSubscription, mockAccount, mockTreeChangeHandler.object, undefined);
it('Should return resource containers.', async function(): Promise<void> {
const subscriptionTreeNode = new AzureResourceSubscriptionTreeNode(mockAccount, mockSubscription, mockTenantId, mockAppContext, mockTreeChangeHandler.object, undefined);
const children = await subscriptionTreeNode.getChildren();
mockResourceTreeDataProvider1.verify((o) => o.getChildren(), TypeMoq.Times.once());
mockResourceTreeDataProvider2.verify((o) => o.getChildren(), TypeMoq.Times.once());
const expectedChildren = await resourceService.listResourceProviderIds();
should(children).Array();
should(children.length).equal(2);
should(children[0]).instanceof(AzureResourceDatabaseContainerTreeNode);
should(children[1]).instanceof(AzureResourceDatabaseServerContainerTreeNode);
should(children.length).equal(expectedChildren.length);
for (const child of children) {
should(child).instanceOf(AzureResourceResourceTreeNode);
}
});
});

View File

@@ -5,21 +5,28 @@
'use strict';
import * as vscode from 'vscode';
import * as should from 'should';
import * as TypeMoq from 'typemoq';
import * as sqlops from 'sqlops';
import 'mocha';
import { AppContext } from '../../../appContext';
import { ApiWrapper } from '../../../apiWrapper';
import { AzureResourceServicePool } from '../../../azureResource/servicePool';
import { IAzureResourceAccountService } from '../../../azureResource/interfaces';
import { IAzureResourceCacheService, IAzureResourceAccountService } from '../../../azureResource/interfaces';
import { AzureResourceTreeProvider } from '../../../azureResource/tree/treeProvider';
import { AzureResourceAccountTreeNode } from '../../../azureResource/tree/accountTreeNode';
import { AzureResourceAccountNotSignedInTreeNode } from '../../../azureResource/tree/accountNotSignedInTreeNode';
import { AzureResourceMessageTreeNode } from '../../../azureResource/tree/messageTreeNode';
import { AzureResourceMessageTreeNode } from '../../../azureResource/messageTreeNode';
import { AzureResourceServiceNames } from '../../../azureResource/constants';
import { generateGuid } from '../../../azureResource/utils';
// Mock services
const mockServicePool = AzureResourceServicePool.getInstance();
let mockAppContext: AppContext;
let mockExtensionContext: TypeMoq.IMock<vscode.ExtensionContext>;
let mockApiWrapper: TypeMoq.IMock<ApiWrapper>;
let mockCacheService: TypeMoq.IMock<IAzureResourceCacheService>;
let mockAccountService: TypeMoq.IMock<IAzureResourceAccountService>;
// Mock test data
@@ -53,15 +60,23 @@ const mockAccounts = [mockAccount1, mockAccount2];
describe('AzureResourceTreeProvider.getChildren', function(): void {
beforeEach(() => {
mockExtensionContext = TypeMoq.Mock.ofType<vscode.ExtensionContext>();
mockApiWrapper = TypeMoq.Mock.ofType<ApiWrapper>();
mockCacheService = TypeMoq.Mock.ofType<IAzureResourceCacheService>();
mockAccountService = TypeMoq.Mock.ofType<IAzureResourceAccountService>();
mockServicePool.accountService = mockAccountService.object;
mockAppContext = new AppContext(mockExtensionContext.object, mockApiWrapper.object);
mockAppContext.registerService<IAzureResourceCacheService>(AzureResourceServiceNames.cacheService, mockCacheService.object);
mockAppContext.registerService<IAzureResourceAccountService>(AzureResourceServiceNames.accountService, mockAccountService.object);
mockCacheService.setup((o) => o.generateKey(TypeMoq.It.isAnyString())).returns(() => generateGuid());
});
it('Should load accounts.', async function(): Promise<void> {
mockAccountService.setup((o) => o.getAccounts()).returns(() => Promise.resolve(mockAccounts));
const treeProvider = new AzureResourceTreeProvider();
const treeProvider = new AzureResourceTreeProvider(mockAppContext);
treeProvider.isSystemInitialized = true;
const children = await treeProvider.getChildren(undefined);
@@ -83,7 +98,7 @@ describe('AzureResourceTreeProvider.getChildren', function(): void {
it('Should handle when there is no accounts.', async function(): Promise<void> {
mockAccountService.setup((o) => o.getAccounts()).returns(() => Promise.resolve(undefined));
const treeProvider = new AzureResourceTreeProvider();
const treeProvider = new AzureResourceTreeProvider(mockAppContext);
treeProvider.isSystemInitialized = true;
const children = await treeProvider.getChildren(undefined);
@@ -97,7 +112,7 @@ describe('AzureResourceTreeProvider.getChildren', function(): void {
const mockAccountError = 'Test account error';
mockAccountService.setup((o) => o.getAccounts()).returns(() => { throw new Error(mockAccountError); });
const treeProvider = new AzureResourceTreeProvider();
const treeProvider = new AzureResourceTreeProvider(mockAppContext);
treeProvider.isSystemInitialized = true;
const children = await treeProvider.getChildren(undefined);

File diff suppressed because it is too large Load Diff

View File

@@ -67,7 +67,7 @@
}
},
"dependencies": {
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.10",
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.11",
"opener": "^1.4.3",
"service-downloader": "github:anthonydresser/service-downloader#0.1.5",
"vscode-extension-telemetry": "0.0.18",

View File

@@ -32,7 +32,7 @@ export class DeployConfigPage extends DacFxConfigPage {
}
async start(): Promise<boolean> {
let serverComponent = await this.createServerDropdown(true);
let serverComponent = await this.createServerDropdown(true);
let fileBrowserComponent = await this.createFileBrowser();
this.databaseComponent = await this.createDatabaseTextBox();
this.databaseComponent.title = localize('dacFx.databaseNameTextBox', 'Database Name');
@@ -131,7 +131,7 @@ export class DeployConfigPage extends DacFxConfigPage {
this.model.database = this.databaseTextBox.value;
});
// Initialize with upgrade existing true
//Initialize with upgrade existing true
upgradeRadioButton.checked = true;
this.model.upgradeExisting = true;
@@ -149,10 +149,10 @@ export class DeployConfigPage extends DacFxConfigPage {
}
protected async createDeployDatabaseDropdown(): Promise<sqlops.FormComponent> {
this.databaseDropdown = this.view.modelBuilder.dropDown().withProperties({
this.databaseDropdown = this.view.modelBuilder.dropDown().withProperties({
required: true
}).component();
// Handle database changes
//Handle database changes
this.databaseDropdown.onValueChanged(async () => {
this.model.database = (<sqlops.CategoryValue>this.databaseDropdown.value).name;
});
@@ -172,7 +172,8 @@ export class DeployConfigPage extends DacFxConfigPage {
}
let values = await this.getDatabaseValues();
if (this.model.database === undefined) {
//set the database to the first dropdown value if upgrading, otherwise it should get set to the textbox value
if (this.model.upgradeExisting) {
this.model.database = values[0].name;
}

View File

@@ -5,14 +5,12 @@
agent-base@4, agent-base@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
dependencies:
es6-promisify "^5.0.0"
applicationinsights@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927"
integrity sha1-U0Rrgw/o1dYZ7uKieLMdPSUDCSc=
dependencies:
diagnostic-channel "0.2.0"
diagnostic-channel-publishers "0.2.1"
@@ -21,12 +19,10 @@ applicationinsights@1.0.1:
base64-js@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=
bl@^1.0.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
@@ -34,12 +30,10 @@ bl@^1.0.0:
buffer-alloc-unsafe@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
buffer-alloc@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
dependencies:
buffer-alloc-unsafe "^1.1.0"
buffer-fill "^1.0.0"
@@ -47,17 +41,14 @@ buffer-alloc@^1.2.0:
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
buffer-fill@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
buffer@^3.0.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=
dependencies:
base64-js "0.0.8"
ieee754 "^1.1.4"
@@ -66,39 +57,34 @@ buffer@^3.0.1:
commander@~2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
dependencies:
graceful-readlink ">= 1.0.0"
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.10":
version "0.2.10"
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/4de3f7caf0eba54159911b977ddb4f5d7c0a9ca8"
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.11":
version "0.2.11"
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/bc80d2226699d23f45a2ec26129cbcdee4781ca9"
dependencies:
vscode-languageclient "3.5.1"
debug@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
dependencies:
file-type "^5.2.0"
is-stream "^1.1.0"
@@ -107,7 +93,6 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
decompress-tarbz2@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
dependencies:
decompress-tar "^4.1.0"
file-type "^6.1.0"
@@ -118,7 +103,6 @@ decompress-tarbz2@^4.0.0:
decompress-targz@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
dependencies:
decompress-tar "^4.1.1"
file-type "^5.2.0"
@@ -127,7 +111,6 @@ decompress-targz@^4.0.0:
decompress-unzip@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
dependencies:
file-type "^3.8.0"
get-stream "^2.2.0"
@@ -137,7 +120,6 @@ decompress-unzip@^4.0.1:
decompress@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
dependencies:
decompress-tar "^4.0.0"
decompress-tarbz2 "^4.0.0"
@@ -151,70 +133,58 @@ decompress@^4.2.0:
diagnostic-channel-publishers@0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3"
integrity sha1-ji1geottef6IC1SLxYzGvrKIxPM=
diagnostic-channel@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
integrity sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=
dependencies:
semver "^5.3.0"
end-of-stream@^1.0.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
dependencies:
once "^1.4.0"
es6-promise@^4.0.3:
version "4.2.5"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
dependencies:
es6-promise "^4.0.3"
eventemitter2@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
integrity sha1-YZegldX7a1folC9v1+qtY6CclFI=
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
dependencies:
pend "~1.2.0"
file-type@^3.8.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
file-type@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
file-type@^6.1.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
get-stream@^2.2.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
dependencies:
object-assign "^4.0.1"
pinkie-promise "^2.0.0"
@@ -222,17 +192,14 @@ get-stream@^2.2.0:
graceful-fs@^4.1.10:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
"graceful-readlink@>= 1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
http-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
dependencies:
agent-base "4"
debug "3.1.0"
@@ -240,7 +207,6 @@ http-proxy-agent@^2.1.0:
https-proxy-agent@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
dependencies:
agent-base "^4.1.0"
debug "^3.1.0"
@@ -248,115 +214,94 @@ https-proxy-agent@^2.2.1:
ieee754@^1.1.4:
version "1.1.12"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
is-natural-number@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
make-dir@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
dependencies:
pify "^3.0.0"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
dependencies:
minimist "0.0.8"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
object-assign@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
opener@^1.4.3:
version "1.5.1"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pinkie-promise@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
dependencies:
pinkie "^2.0.0"
pinkie@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
process-nextick-args@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
readable-stream@^2.3.0, readable-stream@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
@@ -369,19 +314,16 @@ readable-stream@^2.3.0, readable-stream@^2.3.5:
safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
seek-bzip@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
dependencies:
commander "~2.8.1"
semver@^5.3.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
"service-downloader@github:anthonydresser/service-downloader#0.1.5":
version "0.1.5"
@@ -397,21 +339,18 @@ semver@^5.3.0:
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
strip-dirs@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
dependencies:
is-natural-number "^4.0.1"
tar-stream@^1.5.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
dependencies:
bl "^1.0.0"
buffer-alloc "^1.2.0"
@@ -424,24 +363,20 @@ tar-stream@^1.5.2:
through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
to-buffer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
unbzip2-stream@^1.0.9:
version "1.3.1"
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1"
integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==
dependencies:
buffer "^3.0.1"
through "^2.3.6"
@@ -449,31 +384,26 @@ unbzip2-stream@^1.0.9:
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
vscode-extension-telemetry@0.0.18:
version "0.0.18"
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.18.tgz#602ba20d8c71453aa34533a291e7638f6e5c0327"
integrity sha512-Vw3Sr+dZwl+c6PlsUwrTtCOJkgrmvS3OUVDQGcmpXWAgq9xGq6as0K4pUx+aGqTjzLAESmWSrs6HlJm6J6Khcg==
dependencies:
applicationinsights "1.0.1"
vscode-jsonrpc@3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa"
integrity sha1-hyOdnhZrLXNSJFuKgTWXgEwdY6o=
vscode-languageclient@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.1.tgz#c78e582459c24e58f88020dfa34065e976186a98"
integrity sha512-GTQ+hSq/o4c/y6GYmyP9XNrVoIu0NFZ67KltSkqN+tO0eUNDIlrVNX+3DJzzyLhSsrctuGzuYWm3t87mNAcBmQ==
dependencies:
vscode-languageserver-protocol "3.5.1"
vscode-languageserver-protocol@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.1.tgz#5144a3a9eeccbd83fe2745bd4ed75fad6cc45f0d"
integrity sha512-1fPDIwsAv1difCV+8daOrJEGunClNJWqnUHq/ncWrjhitKWXgGmRCjlwZ3gDUTt54yRcvXz1PXJDaRNvNH6pYA==
dependencies:
vscode-jsonrpc "3.5.0"
vscode-languageserver-types "3.5.0"
@@ -481,27 +411,22 @@ vscode-languageserver-protocol@3.5.1:
vscode-languageserver-types@3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374"
integrity sha1-5I15li8LjgLelV4/UkkI4rGcA3Q=
vscode-nls@^3.2.1:
version "3.2.5"
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.5.tgz#25520c1955108036dec607c85e00a522f247f1a4"
integrity sha512-ITtoh3V4AkWXMmp3TB97vsMaHRgHhsSFPsUdzlueSL+dRZbSNTZeOmdQv60kjCV306ghPxhDeoNUEm3+EZMuyw==
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
yauzl@^2.4.2:
version "2.10.0"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
@@ -509,4 +434,3 @@ yauzl@^2.4.2:
zone.js@0.7.6:
version "0.7.6"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
integrity sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=

View File

@@ -18,7 +18,7 @@
"update-grammar": "node ../../build/npm/update-grammar.js Microsoft/vscode-mssql syntaxes/SQL.plist ./syntaxes/sql.tmLanguage.json"
},
"dependencies": {
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.10",
"dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.2.11",
"opener": "^1.4.3",
"service-downloader": "github:anthonydresser/service-downloader#0.1.5",
"vscode-extension-telemetry": "^0.0.15"

View File

@@ -1,6 +1,6 @@
{
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
"version": "1.5.0-alpha.63",
"version": "1.5.0-alpha.65",
"downloadFileNames": {
"Windows_86": "win-x86-netcoreapp2.2.zip",
"Windows_64": "win-x64-netcoreapp2.2.zip",

View File

@@ -5,14 +5,12 @@
agent-base@4, agent-base@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
dependencies:
es6-promisify "^5.0.0"
applicationinsights@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.1.tgz#53446b830fe8d5d619eee2a278b31d3d25030927"
integrity sha1-U0Rrgw/o1dYZ7uKieLMdPSUDCSc=
dependencies:
diagnostic-channel "0.2.0"
diagnostic-channel-publishers "0.2.1"
@@ -21,12 +19,10 @@ applicationinsights@1.0.1:
base64-js@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=
bl@^1.0.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
@@ -34,12 +30,10 @@ bl@^1.0.0:
buffer-alloc-unsafe@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
buffer-alloc@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
dependencies:
buffer-alloc-unsafe "^1.1.0"
buffer-fill "^1.0.0"
@@ -47,17 +41,14 @@ buffer-alloc@^1.2.0:
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
buffer-fill@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
buffer@^3.0.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=
dependencies:
base64-js "0.0.8"
ieee754 "^1.1.4"
@@ -66,39 +57,34 @@ buffer@^3.0.1:
commander@~2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
dependencies:
graceful-readlink ">= 1.0.0"
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.10":
version "0.2.10"
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/4de3f7caf0eba54159911b977ddb4f5d7c0a9ca8"
"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.2.11":
version "0.2.11"
resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/bc80d2226699d23f45a2ec26129cbcdee4781ca9"
dependencies:
vscode-languageclient "3.5.1"
debug@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"
decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
dependencies:
file-type "^5.2.0"
is-stream "^1.1.0"
@@ -107,7 +93,6 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
decompress-tarbz2@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
dependencies:
decompress-tar "^4.1.0"
file-type "^6.1.0"
@@ -118,7 +103,6 @@ decompress-tarbz2@^4.0.0:
decompress-targz@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
dependencies:
decompress-tar "^4.1.1"
file-type "^5.2.0"
@@ -127,7 +111,6 @@ decompress-targz@^4.0.0:
decompress-unzip@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k=
dependencies:
file-type "^3.8.0"
get-stream "^2.2.0"
@@ -137,7 +120,6 @@ decompress-unzip@^4.0.1:
decompress@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d"
integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=
dependencies:
decompress-tar "^4.0.0"
decompress-tarbz2 "^4.0.0"
@@ -151,70 +133,58 @@ decompress@^4.2.0:
diagnostic-channel-publishers@0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.2.1.tgz#8e2d607a8b6d79fe880b548bc58cc6beb288c4f3"
integrity sha1-ji1geottef6IC1SLxYzGvrKIxPM=
diagnostic-channel@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
integrity sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=
dependencies:
semver "^5.3.0"
end-of-stream@^1.0.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
dependencies:
once "^1.4.0"
es6-promise@^4.0.3:
version "4.2.5"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
dependencies:
es6-promise "^4.0.3"
eventemitter2@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
integrity sha1-YZegldX7a1folC9v1+qtY6CclFI=
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
dependencies:
pend "~1.2.0"
file-type@^3.8.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
file-type@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
integrity sha1-LdvqfHP/42No365J3DOMBYwritY=
file-type@^6.1.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
get-stream@^2.2.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=
dependencies:
object-assign "^4.0.1"
pinkie-promise "^2.0.0"
@@ -222,17 +192,14 @@ get-stream@^2.2.0:
graceful-fs@^4.1.10:
version "4.1.15"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
"graceful-readlink@>= 1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
http-proxy-agent@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405"
integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==
dependencies:
agent-base "4"
debug "3.1.0"
@@ -240,7 +207,6 @@ http-proxy-agent@^2.1.0:
https-proxy-agent@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
dependencies:
agent-base "^4.1.0"
debug "^3.1.0"
@@ -248,115 +214,94 @@ https-proxy-agent@^2.2.1:
ieee754@^1.1.4:
version "1.1.12"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
is-natural-number@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
make-dir@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
dependencies:
pify "^3.0.0"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
dependencies:
minimist "0.0.8"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
object-assign@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
opener@^1.4.3:
version "1.5.1"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pinkie-promise@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
dependencies:
pinkie "^2.0.0"
pinkie@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
process-nextick-args@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
readable-stream@^2.3.0, readable-stream@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
@@ -369,19 +314,16 @@ readable-stream@^2.3.0, readable-stream@^2.3.5:
safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
seek-bzip@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc"
integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=
dependencies:
commander "~2.8.1"
semver@^5.3.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
"service-downloader@github:anthonydresser/service-downloader#0.1.5":
version "0.1.5"
@@ -397,21 +339,18 @@ semver@^5.3.0:
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
strip-dirs@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
dependencies:
is-natural-number "^4.0.1"
tar-stream@^1.5.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
dependencies:
bl "^1.0.0"
buffer-alloc "^1.2.0"
@@ -424,24 +363,20 @@ tar-stream@^1.5.2:
through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
to-buffer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
unbzip2-stream@^1.0.9:
version "1.3.1"
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1"
integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==
dependencies:
buffer "^3.0.1"
through "^2.3.6"
@@ -449,31 +384,26 @@ unbzip2-stream@^1.0.9:
util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
vscode-extension-telemetry@^0.0.15:
version "0.0.15"
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856"
integrity sha512-Yf6dL9r2x2GISI1xh22XsAaydSTQG/4aBitu8sGBwGr42n2TyOsIXGtXSDgqQBNZgYD6+P1EHqrrzetn9ekWTQ==
dependencies:
applicationinsights "1.0.1"
vscode-jsonrpc@3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa"
integrity sha1-hyOdnhZrLXNSJFuKgTWXgEwdY6o=
vscode-languageclient@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.1.tgz#c78e582459c24e58f88020dfa34065e976186a98"
integrity sha512-GTQ+hSq/o4c/y6GYmyP9XNrVoIu0NFZ67KltSkqN+tO0eUNDIlrVNX+3DJzzyLhSsrctuGzuYWm3t87mNAcBmQ==
dependencies:
vscode-languageserver-protocol "3.5.1"
vscode-languageserver-protocol@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.1.tgz#5144a3a9eeccbd83fe2745bd4ed75fad6cc45f0d"
integrity sha512-1fPDIwsAv1difCV+8daOrJEGunClNJWqnUHq/ncWrjhitKWXgGmRCjlwZ3gDUTt54yRcvXz1PXJDaRNvNH6pYA==
dependencies:
vscode-jsonrpc "3.5.0"
vscode-languageserver-types "3.5.0"
@@ -481,22 +411,18 @@ vscode-languageserver-protocol@3.5.1:
vscode-languageserver-types@3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374"
integrity sha1-5I15li8LjgLelV4/UkkI4rGcA3Q=
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
yauzl@^2.4.2:
version "2.10.0"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
@@ -504,4 +430,3 @@ yauzl@^2.4.2:
zone.js@0.7.6:
version "0.7.6"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
integrity sha1-+7w50+AmHQmG8boGMG6zrrDSIAk=

View File

@@ -21,6 +21,11 @@
"type": "boolean",
"default": true,
"description": "%notebook.enabled.description%"
},
"notebook.pythonPath": {
"type": "string",
"default": "",
"description": "%notebook.pythonPath.description%"
}
}
},

View File

@@ -3,6 +3,7 @@
"description": "Defines the Data-procotol based Notebook contribution and many Notebook commands and contributions.",
"notebook.configuration.title": "Notebook configuration",
"notebook.enabled.description": "Enable viewing notebook files using built-in notebook editor.",
"notebook.pythonPath.description": "Local path to python installation used by Notebooks.",
"notebook.command.new": "New Notebook",
"notebook.command.open": "Open Notebook"
}

View File

@@ -1,6 +1,6 @@
{
"name": "azuredatastudio",
"version": "1.3.8",
"version": "1.4.2",
"distro": "8c3e97e3425cc9814496472ab73e076de2ba99ee",
"author": {
"name": "Microsoft Corporation"
@@ -23,7 +23,8 @@
"smoketest": "cd test/smoke && node test/index.js",
"monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit",
"download-builtin-extensions": "node build/lib/builtInExtensions.js",
"check-monaco-editor-compilation": "tsc -p src/tsconfig.monaco.json --noEmit"
"check-monaco-editor-compilation": "tsc -p src/tsconfig.monaco.json --noEmit",
"tslint": "node node_modules/tslint/bin/tslint -c tslint-gci.json -p src/tsconfig.json"
},
"dependencies": {
"@angular/animations": "~4.1.3",
@@ -154,6 +155,7 @@
"source-map": "^0.4.4",
"temp-write": "^3.4.0",
"tslint": "^5.9.1",
"tslint-microsoft-contrib": "^6.0.0",
"typemoq": "^0.3.2",
"typescript": "2.9.2",
"typescript-formatter": "7.1.0",

View File

@@ -42,7 +42,8 @@
"Microsoft.server-report",
"Microsoft.sql-vnext",
"Microsoft.whoisactive",
"Redgate.sql-search"
"Redgate.sql-search",
"IDERA.sqldm-performance-insights"
],
"extensionsGallery": {
"serviceUrl": "https://sqlopsextensions.blob.core.windows.net/marketplace/v1/extensionsGallery.json"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -62,6 +62,12 @@
<trans-unit id="sql.saveAsCsv.encoding">
<source xml:lang="en">[Optional] File encoding used when saving results as CSV</source>
</trans-unit>
<trans-unit id="sql.saveAsXml.formatted">
<source xml:lang="en">[Optional] When true, XML output will be formatted when saving results as XML</source>
</trans-unit>
<trans-unit id="sql.saveAsXml.encoding">
<source xml:lang="en">[Optional] File encoding used when saving results as XML</source>
</trans-unit>
<trans-unit id="sql.copyIncludeHeaders">
<source xml:lang="en">[Optional] Configuration options for copying results from the Results View</source>
</trans-unit>
@@ -596,6 +602,9 @@
<trans-unit id="saveAsExcel">
<source xml:lang="en">Save As Excel</source>
</trans-unit>
<trans-unit id="saveAsXml">
<source xml:lang="en">Save As XML</source>
</trans-unit>
<trans-unit id="copySelection">
<source xml:lang="en">Copy</source>
</trans-unit>
@@ -1142,6 +1151,9 @@
<trans-unit id="saveExcelLabel">
<source xml:lang="en">Save as Excel</source>
</trans-unit>
<trans-unit id="saveXMLLabel">
<source xml:lang="en">Save as XML</source>
</trans-unit>
<trans-unit id="viewChartLabel">
<source xml:lang="en">View as Chart</source>
</trans-unit>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,734 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">Neuer Zeitplan</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Abbrechen</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Zeitplanname</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Zeitpläne</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">Allgemein</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">Name der Anmeldeinformationen</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">Beschreibung</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
<target state="translated">Subsystem</target>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">Betriebssystem (CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">Replikationsmomentaufnahme</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
<target state="translated">Replikationstransaktionsprotokoll-Leser</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
<target state="translated">Replikationsverteiler</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
<target state="translated">Replikationsmerge</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
<target state="translated">Replikation-Warteschlangenleser</target>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
<target state="translated">SQL Server Analysis Services-Abfrage</target>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
<target state="translated">SQL Server Analysis Services-Befehl</target>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
<target state="translated">SQL Server Integration Services-Paket</target>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
<target state="translated">PowerShell</target>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">Auftragszeitpläne</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Abbrechen</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Zeitplanname</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Zeitpläne</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">Allgemein</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Benachrichtigungen</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">Name</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Aktiviert</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">Montag</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">Dienstag</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">Mittwoch</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">Donnerstag</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">Samstag</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">Sonntag</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
<target state="translated">Arbeitstag - Beginn</target>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">Arbeitstag - Ende</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">Warnungsname</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">E-Mail</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">Pager</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">Neuer Auftragsschritt</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
<target state="translated">Datenbankdateien finden -</target>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Abbrechen</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Allgemein</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">Erweitert</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
<target state="translated">Öffnen...</target>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">Analysieren</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">Weiter</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">Zurück</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
<target state="translated">Der Befehl wurde erfolgreich analysiert.</target>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
<target state="translated">Schrittname</target>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Typ</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">Datenbank</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">Befehl</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
<target state="translated">Ausführen als Benutzer</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
<target state="translated">In Tabelle protokollieren</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
<target state="translated">Schrittausgabe in Verlauf einschließen</target>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">Ausgabedatei</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
<target state="translated">Ausgabe an vorhandene Datei anfügen</target>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">Ausgewählter Pfad</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">Dateien des Typs</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">Dateiname</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
<target state="translated">Alle Dateien (*)</target>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
<target state="translated">Transact-SQL-Skript (T-SQL)</target>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">Konto des SQL Server-Agent-Diensts</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
<target state="translated">Zum nächsten Schritt wechseln</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">Beenden des Auftrags mit Erfolgsmeldung</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
<target state="translated">Beenden des Auftrags mit Fehlermeldung</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Allgemein</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
<target state="translated">Steps</target>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Zeitpläne</target>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">Warnungen</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Benachrichtigungen</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
<target state="translated">Der Auftragsname darf nicht leer sein.</target>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">Name</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">Besitzer</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">Kategorie</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">Beschreibung</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Aktiviert</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">Schritt</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Typ</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">Bei Erfolg</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">Bei Fehler</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">Neu...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">Bearbeiten</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">löschen</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Seite</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
<target state="translated">Zeitplan auswählen</target>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Zeitplanname</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">Neue Warnung</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">Warnungsname</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">Neuer Auftrag</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
<target state="translated">Auftrag bearbeiten</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">Allgemein</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
<target state="translated">Antwort</target>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">Optionen</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">Ereigniswarnungsdefinition</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">Name</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Typ</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Aktiviert</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Datenbankname</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
<target state="translated">Fehlernummer</target>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">Schweregrad</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - Verschiedene Systemangaben</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - Reserviert</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - Reserviert</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - Reserviert</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - Reserviert</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006 - Reserviert</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - Benachrichtigung: Statusangaben</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008 - Benachrichtigung: Benutzereingriff erforderlich</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009 - Benutzerdefiniert</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - Angaben</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011 - Angegebenes Datenbankobjekt nicht gefunden</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012 - Nicht verwendet</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - Syntaxfehler in Benutzertransaktion</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - Unzureichende Berechtigung</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - Syntaxfehler in SQL-Anweisungen</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - Sonstiger Benutzerfehler</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - Unzureichende Ressourcen</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - Mittelschwerer interner Fehler</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - Schwerwiegender Fehler bei Ressource</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020 - Schwerwiegender Fehler im aktuellen Prozess</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021 - Schwerwiegender Fehler in Datenbankprozessen</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022 - Schwerwiegender Fehler: Tabellenintegrität zweifelhaft</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - Schwerwiegender Fehler: Datenbankintegrität zweifelhaft</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - Schwerwiegender Fehler: Hardwarefehler</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025 - Schwerwiegender Fehler</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">Auftragsname</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">Neuer Auftrag</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">Operator</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">E-Mail</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">Pager</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">Neuer Operator</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
<target state="translated">Benachrichtigungsfehlertext in Email aufnehmen</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
<target state="translated">Verzögerung zwischen Antworten</target>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Abbrechen</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
<target state="translated">Beim Abschluss des Auftrags</target>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
<target state="translated">Bei Auftragsfehler</target>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">Bei erfolgreicher Auftragsausführung</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
<target state="translated">Job-Update fehlgeschlagen '{0}'</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
<target state="translated">SQL Server-Ereigniswarnung</target>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
<target state="translated">SQL Server-Leistungsstatuswarnung</target>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">WMI-Ereigniswarnung</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,668 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">Aceptar</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">General</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">Descripción</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">Instantánea de replicación</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">Programas de trabajos</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">Aceptar</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">General</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nombre</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Habilitado</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">Sábado</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">Domingo</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">Nombre de alerta</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">Correo electrónico</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">Pager</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">Aceptar</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">General</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">Opciones avanzadas</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">Analizar</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">Siguiente</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">Anterior</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
<target state="translated">Ejecutar como</target>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">Base de datos</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">Comando</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
<target state="translated">Ejecutar como usuario</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
<target state="translated">Intentos de reintento</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">Archivo de salida</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">Ruta seleccionada</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">Archivos de tipo</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">Nombre de archivo</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">Cuenta de servicio de Agente SQL Server</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">General</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">Nombre</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">Propietario</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">Categoría</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">Descripción</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Habilitado</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">Paso</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">En caso de éxito</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">Nuevo...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">Editar</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">Eliminar</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Página</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
<target state="translated">Lista de alertas</target>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">Nombre de alerta</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">General</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">Opciones</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nombre</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Habilitado</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nombre de la base de datos</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">Gravedad</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - Información diversa del sistema</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - Reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - Reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - notificación: Información del estado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - información</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - Error de sintaxis en una transacción de usuario</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - Permiso insuficiente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - Error de sintaxis en las sentencias SQL</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - Recursos insuficientes</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - error fatal en el recurso</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020-error fatal en el proceso actual</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - Error fatal: Es posible que se presente un problema de integridad de base de datos</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - Error fatal: Error de Hardware</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">Nombre de tarea</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">Operador</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">Correo electrónico</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">Pager</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">Nuevo operador</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">Aceptar</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">Cuando el trabajo tiene éxito</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
<target state="translated">Esta característica está en desarrollo. ¡Obtenga la última versión para Insiders si desea probar los cambios más recientes!</target>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,747 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">Nouvelle planification</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annuler</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nom de la planification</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Planifications</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
<target state="translated">Créer un Proxy</target>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">Général</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">Nom d'identification</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">Description</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
<target state="translated">Sous-système</target>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">Système d'exploitation (CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">Instantané de réplication</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
<target state="translated">Lecteur du journal des transactions de réplication</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
<target state="translated">Serveur de distribution de réplication</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
<target state="translated">Fusion de réplication</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
<target state="translated">Agent de lecture de file d'attente de réplication</target>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
<target state="translated">Requête SQL Server Analysis Services</target>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
<target state="translated">Commande SQL Server Analysis Services</target>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
<target state="translated">Package SQL Server Integration Services</target>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
<target state="translated">PowerShell</target>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">Planifications de travail</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annuler</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nom de la planification</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Planifications</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
<target state="translated">Créer un opérateur</target>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">Général</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Notifications</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nom </target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Activé</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
<target state="translated">Nom d'e-mail du récepteur de radiomessagerie</target>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">Lundi</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">Mardi</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">Mercredi</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">Jeudi</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">Samedi</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">Dimanche</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
<target state="translated">Début de journée</target>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">Fin de journée</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">Nom de l'alerte</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">Messagerie électronique</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">Radiomessagerie</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">Nouvelle étape du travail</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
<target state="translated">Localiser les fichiers de base de données -</target>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annuler</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Général</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">Avancé</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
<target state="translated">Ouvrir...</target>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">Analyser</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">Suivant</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">Précédent</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
<target state="translated">La commande a été analysée correctement.</target>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
<target state="translated">La commande a échoué.</target>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
<target state="translated">Le nom de létape ne peut être vide</target>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
<target state="translated">Nom de l'étape</target>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Type</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
<target state="translated">Exécuter en tant que</target>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">Base de données </target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">Commande</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
<target state="translated">Action en cas déchec</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
<target state="translated">Exécuter en tant quutilisateur</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
<target state="translated">Nouvelles tentatives</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
<target state="translated">Intervalle avant nouvelle tentative (minutes)</target>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
<target state="translated">Ajouter la sortie à lentrée existante dans la table</target>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">Fichier de sortie</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">Chemin sélectionné</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">Fichiers de type</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">Nom de fichier</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
<target state="translated">Tous les fichiers (*)</target>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
<target state="translated">Script Transact-SQL (T-SQL)</target>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">Compte de service SQL Server Agent</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
<target state="translated">Passer à l'étape suivante</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">Quitter le travail signalant la réussite</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
<target state="translated">Quitter le travail signalant l'échec</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Général</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
<target state="translated">Étapes</target>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Planifications</target>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">Alertes</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Notifications</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
<target state="translated">Le nom du travail ne peut pas être vide.</target>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">Nom </target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">Propriétaire</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">Catégorie</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">Description</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Activé</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
<target state="translated">Liste des étapes du travail</target>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">Étape</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Type</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">En cas de succès</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">En cas d'échec</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">Nouveau...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">Modifier</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">supprimer</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
<target state="translated">E-mail</target>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Page </target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
<target state="translated">Choisir une planification</target>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nom de la planification</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
<target state="translated">Liste des alertes</target>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">Nouvelle alerte</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">Nom de l'alerte</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">Nouveau travail</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
<target state="translated">Créer une alerte</target>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">Général</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
<target state="translated">Réponse</target>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">Options</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">Définition d'une alerte d'événement</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nom </target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Type</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Activé</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nom de la base de données</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
<target state="translated">Numéro d'erreur</target>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">Gravité</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - Informations système diverses</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - Réservée</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - Réservée</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - Réservée</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - Réservée</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006 - Réservée</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - Notification : information d'état</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008 - Notification : intervention util. requise</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009 - Définie par l'utilisateur</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - Informations</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011 - Objet de BdD spécifié introuvable</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012 - Inutilisée</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - Err. de syntaxe de la transaction util.</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - Autorisation insuffisante</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - Erreur de syntaxe dans des instructions SQL</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - Erreur de l'utilisateur</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - Ressources insuffisantes</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - Erreur interne récupérable</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - Erreur irrécupérable de ressource</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020 - Erreur irrécupérable du traitement en cours</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021 - Erreur irrécupérable dans les traitements de base de données</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022 - Err. fatale : intégrité douteuse de la table</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - Err. fatale : intégrité douteuse de la BdD</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - Erreur fatale : erreur matérielle</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025 - Erreur fatale</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
<target state="translated">Exécuter le travail</target>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">Nom du travail</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">Nouveau travail</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
<target state="translated">Liste des opérateurs</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">Opérateur</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">Messagerie électronique</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">Radiomessagerie</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">Nouvel opérateur</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
<target state="translated">Minutes de retard</target>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
<target state="translated">Secondes de retard</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annuler</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
<target state="translated">Lorsque le travail est terminé</target>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
<target state="translated">Lors de l'échec du travail</target>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">Lors de la réussite du travail</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
<target state="translated">Le nom du travail doit être fourni</target>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
<target state="translated">Alerte d'événement SQL Server</target>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
<target state="translated">Alerte de condition de performances SQL Server</target>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">Alerte d'événement WMI</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
<target state="translated">Cette fonctionnalité est en cours de développement. Testez les dernières builds Insiders si vous souhaitez essayer les changements les plus récents !</target>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,705 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">Nuova pianificazione</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annulla</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nome della pianificazione</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
<target state="translated">Modifica Proxy</target>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">Generale</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">Nome della credenziale</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">Descrizione</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">Sistema operativo (CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">Pianificazioni processi</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annulla</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nome della pianificazione</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
<target state="translated">Modifica operatore</target>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">Generale</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Notifiche</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nome</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Abilitato</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">Lunedì</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">Martedì</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">Mercoledì</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">Giovedì</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">Sabato</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">Domenica</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">Fine giornata lavorativa</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
<target state="translated">Elenco avvisi</target>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">Nome avviso</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">E-mail</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">Nuovo passaggio di processo</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annulla</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Generale</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">Avanzate</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
<target state="translated">Apri...</target>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">Analizza</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">Avanti</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">Indietro</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
<target state="translated">Il nome di passaggio non può essere lasciato vuoto</target>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">Database</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">Comando</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
<target state="translated">Numero di tentativi</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
<target state="translated">Scrivere il log su tabella</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
<target state="translated">Includere l'output dello step nella cronologia</target>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">File di output</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">Percorso selezionato</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">File di tipo</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">Nome file</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">Account del servizio SQL Server Agent</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">Termina il processo segnalando esito positivo</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Generale</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">Avvisi</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Notifiche</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">Nome</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">Proprietario</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">Categoria</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">Descrizione</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Abilitato</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">Passaggio</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">In caso di successo</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">In caso di errore</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">Nuovo...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">Modifica</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">Elimina</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
<target state="translated">Azioni da eseguire quando il processo viene completato</target>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
<target state="translated">Email</target>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Pagina</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
<target state="translated">Cancella automaticamente il processo</target>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nome della pianificazione</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">Nuovo avviso</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">Nome avviso</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">Nuovo processo</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">Generale</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">Opzioni</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">Definizione di avviso di evento</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nome</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Abilitato</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nome del database</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">Gravità</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - Informazioni di sistema varie</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - Riservato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - Riservato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - Riservato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - Riservato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006 - Riservato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - Notifica: Informazioni di Stato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008 - Notifica: Richiesto intervento dell'utente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009 - Definito dall'utente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - Informazioni</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011 - Oggetto di database specificato non trovato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012 - Inutilizzato</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - Errore di sintassi nella transazione utente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - Autorizzazioni Insufficienti</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - Errore di sintassi nelle istruzioni SQL</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - Vari Errori Utente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - Risorse insufficienti</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - Errore interno non fatale</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - Errore fatale nella risorsa</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020 - Errore Fatale nel processo corrente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021 - Errore fatale nei Processi di Database</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022 - Errore Fatale: sospetto su integrità della tabella</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - Error Fatale: integrità database sospetta</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - Errore Fatale: Errore Hardware</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025 - Errore Fatale</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">Nome Job</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">Nuovo processo</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">operatore</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">E-mail</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">Nuovo Operatore</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
<target state="translated">Ritardo tra le risposte</target>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
<target state="translated">Minuti di ritardo</target>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Annulla</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">Avviso per evento WMI</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,637 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">キャンセル</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">全般</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">説明</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">ジョブ スケジュール</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">キャンセル</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">全般</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">名前</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">有効</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">キャンセル</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">全般</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">詳細</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">解析</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">次へ</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">前へ</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">種類</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">データベース</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">コマンド</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">出力ファイル</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">選択されたパス</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">ファイルの種類</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">ファイル名</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">全般</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">名前</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">所有者</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">カテゴリ</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">説明</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">有効</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">ステップ</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">種類</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">新規作成...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">編集</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">削除</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">ページ</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">新規ジョブ</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">全般</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">オプション</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">名前</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">種類</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">有効</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">データベース名</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">重大度</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">新規ジョブ</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">演算子</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">キャンセル</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="ja" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,742 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">새 일정</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">확인</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">취소</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">일정 이름</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">일정</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
<target state="translated">프록시 편집</target>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">일반</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">자격 증명 이름</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">설명</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
<target state="translated">하위 시스템</target>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">운영 체제(CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">복제 스냅숏</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
<target state="translated">복제 트랜잭션 로그 판독기</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
<target state="translated">복제 배포자</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
<target state="translated">복제 병합</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
<target state="translated">복제 큐 판독기</target>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
<target state="translated">SQL Server Analysis Services 쿼리</target>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
<target state="translated">SQL Server Analysis Services 명령</target>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
<target state="translated">SQL Server Integration Services 패키지</target>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
<target state="translated">PowerShell</target>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">작업 일정</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">확인</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">취소</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">일정 이름</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">일정</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">일반</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">알림</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">이름</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">사용</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
<target state="translated">전자 메일 이름</target>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">월요일</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">화요일</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">수요일</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">목요일</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
<target state="translated">금요일 </target>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">토요일</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">일요일</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
<target state="translated">업무 시작일</target>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">업무 종료일</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
<target state="translated">경고 목록</target>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">경고 이름</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">전자 메일</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">호출기</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">새 작업 단계</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">확인</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">취소</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">일반</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">고급</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">구문 분석</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">다음</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">이전</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
<target state="translated">명령을 구문 분석했습니다.</target>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
<target state="translated">단계 이름</target>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Type</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">데이터베이스</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">명령</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
<target state="translated">실패한 경우 동작</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
<target state="translated">사용자로 실행</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">출력 파일</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">선택한 경로</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">파일 이름</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
<target state="translated">Transact-SQL 스크립트(T-SQL)</target>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">SQL Server 에이전트 서비스 계정</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
<target state="translated">다음 단계로 이동</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">성공 보고와 함께 작업 종료</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
<target state="translated">실패 보고와 함께 작업 종료</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">일반</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
<target state="translated">단계</target>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">일정</target>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">경고</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">알림</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
<target state="translated">작업 이름을 비워 둘 수 없습니다.</target>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">이름</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">소유자</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">범주</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">설명</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">사용</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
<target state="translated">작업 단계 목록</target>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">단계</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Type</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">성공한 경우</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">실패한 경우</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">새로 만들기...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">편집</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">삭제</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
<target state="translated">단계 이동</target>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
<target state="translated">단계 이동</target>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Page</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
<target state="translated">Windows 응용 프로그램 이벤트 로그에 쓰기</target>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
<target state="translated">일정 목록</target>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
<target state="translated">일정 선택</target>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">일정 이름</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">새 경고</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">경고 이름</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">새 작업</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
<target state="translated">작업 편집</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
<target state="translated">경고 만들기</target>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
<target state="translated">경고 편집</target>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">일반</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
<target state="translated">응답</target>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">옵션</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">이벤트 경고 정의</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">이름</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Type</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">사용</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">데이터베이스 이름</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
<target state="translated">오류 번호</target>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">심각도</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - 기타 시스템 정보</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - 예약됨</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - 예약됨</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - 예약됨</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - 예약됨</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006 - 예약됨</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - 알림: 상태 정보</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008 - 알림: 사용자 개입 필요</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009 - 사용자 정의됨</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - 정보</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011 - 지정된 데이터베이스 개체를 찾을 수 없음</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012 - 사용 안 함</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - 사용자 트랜잭션 구문 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - 불충분한 권한</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - SQL 문의 구문 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - 기타 사용자 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - 불충분한 리소스</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - 치명적이지 않은 내부 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - 치명적인 리소스 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020 - 현재 프로세스 내의 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021 - 데이터베이스 프로세스 내의 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022 - 오류: 테이블 무결성 의심</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - 오류: 데이터베이스 무결성 의심</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - 오류: 하드웨어 오류</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025 - 오류</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
<target state="translated">작업 실행</target>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">작업 이름</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">새 작업</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">운영자</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">전자 메일</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">호출기</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">새 운영자</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
<target state="translated">전송할 추가 알림 메시지</target>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
<target state="translated">응답 사이의 지연</target>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">확인</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">취소</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
<target state="translated">작업 완료 시</target>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
<target state="translated">작업 실패 시</target>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">작업 성공 시</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
<target state="translated">반드시 작업 이름을 지정해야 합니다.</target>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
<target state="translated">작업 업데이트 실패 ' {0} '</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
<target state="translated">SQL Server 이벤트 경고</target>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
<target state="translated">SQL Server 성능 조건 경고</target>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">WMI 이벤트 경고</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="ko" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
<target state="translated">이 기능은 아직 개발 중입니다. 가장 최근의 변경 사항을 이용하고 싶으시다면 최신 인사이더 빌드를 확인하세요!</target>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,776 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">Novo horário</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nome de agenda</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Horários</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
<target state="translated">Criar proxy</target>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
<target state="translated">Editar proxy</target>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">Geral</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
<target state="translated">Nome de proxy</target>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">Nome da credencial</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">Descrição</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
<target state="translated">Subsistema</target>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">Sistema operacional (CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">Snapshot de replicação</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
<target state="translated">Leitor de Log de transações de replicação</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
<target state="translated">Distribuidor de replicação</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
<target state="translated">Replicação de mesclagem</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
<target state="translated">Leitor de fila de replicação</target>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
<target state="translated">Consulta do SQL Server Analysis Services</target>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
<target state="translated">Comando do SQL Server Analysis Services</target>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
<target state="translated">Pacote do SQL Server Integration Services</target>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
<target state="translated">PowerShell</target>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
<target state="translated">Ativo para os seguintes subsistemas</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">Planos de trabalho</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nome de agenda</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Horários</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
<target state="translated">Criar operador</target>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
<target state="translated">Editar o operador</target>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">Geral</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Notificações</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nome</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Habilitado</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
<target state="translated">Nome do e-mail</target>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
<target state="translated">Nome de email do pager</target>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">Segunda-feira</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">Terça-feira</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">Quarta-feira</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">Quinta-feira</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
<target state="translated">Sexta-feira </target>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">Sábado</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">Domingo</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
<target state="translated">Começar a jornada de trabalho</target>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">Final do dia útil</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
<target state="translated">Pager no horário de trabalho</target>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
<target state="translated">Lista de alerta</target>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">Nome do alerta</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">E-mail</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">Pager</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">Nova etapa de trabalho</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
<target state="translated">Localizar arquivos de banco de dados -</target>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Geral</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">Avançado</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
<target state="translated">Abrir...</target>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">Analisar</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">Próximo</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">Anterior</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
<target state="translated">Comando analisado com sucesso.</target>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
<target state="translated">Comando falhou.</target>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
<target state="translated">O nome do passo não pode ser deixado em branco</target>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
<target state="translated">Nome da etapa</target>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
<target state="translated">Executar como</target>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">Banco de dados</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">Comando</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
<target state="translated">Ação em caso de sucesso</target>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
<target state="translated">Falha na ação</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
<target state="translated">Executar como usuário</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
<target state="translated">Tentativas de repetição</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
<target state="translated">Intervalo (em minutos) de repetição</target>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
<target state="translated">A tabela de log</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
<target state="translated">Acrescentar a saída para entrada existente na tabela</target>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
<target state="translated">Incluir a saída da etapa no histórico</target>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">Arquivo de Saída</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
<target state="translated">Acrescentar a saída em um arquivo existente</target>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">Caminho selecionado</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">Tipo de Arquivos</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">Nome do Arquivo</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
<target state="translated">Todos os arquivos (*)</target>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
<target state="translated">Script Transact-SQL (T-SQL)</target>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">Conta de Serviço SQL Server Agent</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
<target state="translated">Avançar para o próximo passo</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">Encerrar o trabalho reportando sucesso</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
<target state="translated">Deixar o trabalho relatando a falha</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Geral</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
<target state="translated">Passos</target>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Horários</target>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">Alertas</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Notificações</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
<target state="translated">O nome do trabalho não pode ser em branco.</target>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">Nome</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">Proprietário</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">Categoria</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">Descrição</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Habilitado</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
<target state="translated">Lista de passos do job</target>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">Etapa</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">No sucesso</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">Em caso de falha</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">Novo...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">Editar</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">Excluir</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
<target state="translated">Mover o passo acima</target>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
<target state="translated">Mover o passo acima</target>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
<target state="translated">Ações a executar quando o trabalho for concluído</target>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
<target state="translated">Email</target>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Página</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
<target state="translated">Escrever no log de eventos de aplicações do Windows</target>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
<target state="translated">Excluir automaticamente o job.</target>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
<target state="translated">Lista de Schedules</target>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
<target state="translated">Escolha o horário</target>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Nome de agenda</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
<target state="translated">Lista de alertas</target>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">Novo alerta</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">Nome do alerta</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">Novo job</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
<target state="translated">Editar job</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
<target state="translated">Criar alerta</target>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
<target state="translated">Editar alerta</target>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">Geral</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
<target state="translated">Resposta</target>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">Opções</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">Definição de alerta de eventos</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">Nome</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Tipo</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Habilitado</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nome do banco de dados</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
<target state="translated">Número do erro</target>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">Gravidade</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
<target state="translated">Gerar alerta quando a mensagem contém</target>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
<target state="translated">Mensagem de texto</target>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - Informações Diversas do Sistema</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - Reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - Reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - Reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - Reservados</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006 Reservado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - Notificação: Informações de Status</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008 - notificação: Necessidade de intervenção de usuário</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009 - Definidos pelo Usuário</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - informações</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011 - objeto de banco de dados especificado não encontrado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012 Não usado</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - Erro de sintaxe de transação do usuário</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - Permissão insuficiente</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - Erro de sintaxe em instruções SQL</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - Diversos erros de usuário</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - Recursos insuficientes</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - Erro Interno Não fatal</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - Erro Fatal no Recurso</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020 - Erro fatal no processo atual</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021 - Erro Fatal no banco de dados de processos</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022 - Erro Fatal: Integridade da Tabela Suspeita</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - Erro Fatal: Integridade do Banco de Dados Suspeita</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - Erro Fatal: Erro de Hardware</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025 - Erro Fatal</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
<target state="translated">Executar o Job</target>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">Nome da Tarefa</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
<target state="translated">Notificar operadores</target>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">Novo job</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
<target state="translated">Lista de operador</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">Operador</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">E-mail</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">Pager</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">Novo operador</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
<target state="translated">Incluir texto de erro do alerta no e-mail</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
<target state="translated">Incluir o texto de alerta de erro no pager</target>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
<target state="translated">Mensagem de notificação adicional para enviar</target>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
<target state="translated">Atraso entre respostas</target>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
<target state="translated">Minutos de atraso</target>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
<target state="translated">Segundos de atraso</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">OK</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Cancelar</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
<target state="translated">Quando o job estiver concluído</target>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
<target state="translated">Quando o job falhar.</target>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">Quando o job for bem sucedido</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
<target state="translated">O nome do job deve ser fornecido</target>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
<target state="translated">Falha de atualização do job '{0}'</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
<target state="translated">Falha na atualização alerta '{0}'</target>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
<target state="translated">Alerta de evento do SQL Server</target>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
<target state="translated">Alerta de condição de desempenho do SQL Server</target>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">Alerta de evento WMI</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="pt-BR" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
<target state="translated">Este recurso está em desenvolvimento. Verifique se você gostaria de experimentar as últimas alterações liberadas!</target>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,722 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">Создание расписания</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">ОК</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Отмена</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Имя расписания</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Расписания</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">Общее</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">Имя учетных данных</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">Описание</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
<target state="translated">Подсистема</target>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">Операционная система (CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">Репликация: моментальный снимок</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
<target state="translated">Репликация: средство чтения журнала транзакций</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
<target state="translated">Репликация: распространитель</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
<target state="translated">Репликация: слияние</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
<target state="translated">Репликация: средство просмотра очередей</target>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
<target state="translated">Запрос служб SQL Server Analysis Services</target>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
<target state="translated">Команда служб SQL Server Analysis Services</target>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
<target state="translated">Пакет служб SQL Server Integration Services</target>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
<target state="translated">PowerShell</target>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">Расписания заданий</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">ОК</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Отмена</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Имя расписания</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Расписания</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">Общее</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Уведомления</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">Имя</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Включено</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">понедельник</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">вторник</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">среда</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">четверг</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">суббота</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">воскресенье</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
<target state="translated">Начало рабочего дня</target>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">Конец рабочего дня</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">Имя предупреждения</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">Электронная почта</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">Пейджер</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">Создание шага задания</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">ОК</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Отмена</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Общее</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">Дополнительный</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">Синтаксический анализ</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">Далее</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">Назад</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
<target state="translated">Синтаксический анализ команды успешно завершен.</target>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
<target state="translated">Имя шага</target>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">Тип</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">База данных</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">Команда</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">Выходной файл</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">Файлы данного типа</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">Имя файла</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
<target state="translated">Скрипт Transact-SQL (T-SQL)</target>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">Учетная запись службы агент SQL Server""""</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
<target state="translated">Перейти к следующему шагу</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">Завершить задание с успехом</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
<target state="translated">Завершить задание с ошибкой</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">Общее</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
<target state="translated">Шаги</target>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">Расписания</target>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">Предупреждения</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">Уведомления</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
<target state="translated">Имя задания не может быть пустым.</target>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">Имя</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">Владелец</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">Категория</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">Описание</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Включено</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">Шаг</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">Тип</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">При успешном завершении</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">При сбое</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">Новые функции...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">Изменить</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">Удалить</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">Page</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
<target state="translated">Выбор расписания</target>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">Имя расписания</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">Создание предупреждения</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">Имя предупреждения</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">Создание задания</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">Общее</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
<target state="translated">Ответ</target>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">Параметры</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">Определение предупреждения о событии</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">Имя</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">Тип</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">Включено</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Имя базы данных</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
<target state="translated">Номер ошибки</target>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">Серьезность</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - Различные системные сведения</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - Зарезервировано</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003 - Зарезервировано</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004 - Зарезервировано</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005 - Зарезервировано</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006 - Зарезервировано</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007 - Уведомление: сведения о состоянии</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008 - Уведомление: требуется вмешательство пользователя</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009 - Определяемый пользователем</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - Сведения</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011 - Указанный объект базы данных не найден</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012 - Не используется</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013 - Синтаксическая ошибка пользовательской транзакции</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014 - Недостаточно разрешений</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015 - Синтаксическая ошибка в инструкциях SQL</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - Другая пользовательская ошибка</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017 - Недостаточно ресурсов</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - Некритичная внутренняя ошибка</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 - Неустранимая ошибка в ресурсе</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020 - Неустранимая ошибка в текущем процессе</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021 - Неустранимая ошибка в процессах базы данных</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022 - Неустранимая ошибка: возможно повреждение целостности таблицы</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - Неустранимая ошибка: возможно повреждение целостности базы данных</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024 - Неустранимая ошибка: аппаратная ошибка</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025 - Неустранимая ошибка</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">Имя задания</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">Создание задания</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">Оператор</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">Электронная почта</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">Пейджер</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">Создание оператора</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">ОК</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">Отмена</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
<target state="translated">При завершении задания</target>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
<target state="translated">При ошибке задания</target>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">При успешном завершении задания</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
<target state="translated">Предупреждение о событии SQL Server</target>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
<target state="translated">Предупреждение о производительности SQL Server</target>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">Предупреждение о событии WMI</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="ru" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,777 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
<target state="translated">新计划</target>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">确定</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">计划名称</target>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">计划</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
<target state="translated">创建代理服务器</target>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
<target state="translated">编辑代理服务器</target>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">常规</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
<target state="translated">代理服务器名称</target>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">凭据名称</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">说明</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
<target state="translated">子系统</target>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
<target state="translated">操作系统 (CmdExec)</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
<target state="translated">复制快照</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
<target state="translated">复制事务日志读取器</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
<target state="translated">复制分发服务器</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
<target state="translated">复制合并</target>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
<target state="translated">复制队列读取器</target>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
<target state="translated">SQL server 分析服务查询</target>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
<target state="translated">SQL server 分析服务命令</target>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
<target state="translated">SQL Server 集成服务包</target>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
<target state="translated">PowerShell</target>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
<target state="translated">对以下子系统有效</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">作业计划</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">确定</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
<target state="translated">计划名称</target>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">计划</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
<target state="translated">创建操作符</target>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
<target state="translated">编辑操作员</target>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">常规</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">通知</target>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">名称</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">已启用</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
<target state="translated">电子邮件名称</target>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
<target state="translated">寻呼机电子邮件名称</target>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
<target state="translated">星期一</target>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
<target state="translated">星期二</target>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
<target state="translated">星期三</target>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
<target state="translated">星期四</target>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
<target state="translated">星期五</target>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
<target state="translated">星期六</target>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
<target state="translated">星期天</target>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
<target state="translated">工作日开始</target>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
<target state="translated">工作日结束</target>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
<target state="translated">值班 schdule 的寻呼机</target>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
<target state="translated">警报列表</target>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
<target state="translated">警报名称</target>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">电子邮件</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">分页</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
<target state="translated">新建作业步骤</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
<target state="translated">定位数据库文件-</target>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">确定</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">常规</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">高级</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
<target state="translated">打开...</target>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">分析</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">下一个</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">上一个</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
<target state="translated">该命令已成功解析。</target>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
<target state="translated">命令失败。</target>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
<target state="translated">步骤名称不能留空</target>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
<target state="translated">步骤名称</target>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">类型</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
<target state="translated">运行为</target>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">数据库</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">命令</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
<target state="translated">关于成功行动</target>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
<target state="translated">失败操作时</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
<target state="translated">使用用户身份执行</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
<target state="translated">重试尝试</target>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
<target state="translated">重试间隔 (分钟)</target>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
<target state="translated">记录到表</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
<target state="translated">将输出附加到表中的现有条目</target>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
<target state="translated">在历史记录中包括步骤输出</target>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">输出文件</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
<target state="translated">将输出追加到现有文件中</target>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">选定的路径</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">文件类型</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">文件名</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
<target state="translated">所有文件 (*)</target>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
<target state="translated">Transact-SQL 脚本 (T-SQL)</target>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
<target state="translated">SQL server 代理服务帐户</target>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
<target state="translated">转到下一步骤</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
<target state="translated">退出工作报告成功</target>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
<target state="translated">离开作业调度报告时发生错误。</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">常规</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
<target state="translated">步骤</target>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
<target state="translated">计划</target>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
<target state="translated">警报</target>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
<target state="translated">通知</target>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
<target state="translated">作业名称不能为空。</target>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">名称</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">所有者</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">类别</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">说明</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">已启用</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
<target state="translated">作业步骤列表</target>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">步骤</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">类型</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
<target state="translated">在成功时</target>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
<target state="translated">失败时</target>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">新建...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">编辑</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">删除</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
<target state="translated">向上移动</target>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
<target state="translated">向上移动</target>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
<target state="translated">作业完成时要执行的操作</target>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
<target state="translated">电子邮件</target>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">页</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
<target state="translated">写入 Windows 应用程序事件日志</target>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
<target state="translated">自动删除作业</target>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
<target state="translated">计划列表</target>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
<target state="translated">挑选时间表</target>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
<target state="translated">计划名称</target>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
<target state="translated">通知列表</target>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
<target state="translated">新警报</target>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
<target state="translated">警报名称</target>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">新作业</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
<target state="translated">编辑作业</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
<target state="translated">创建警报</target>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
<target state="translated">编辑警报</target>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">常规</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
<target state="translated">响应</target>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">选项</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
<target state="translated">事件警报定义</target>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">名称</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">类型</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">已启用</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">数据库名称</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
<target state="translated">错误号</target>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">严重性</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
<target state="translated">消息包含时引发警报</target>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
<target state="translated">消息文本</target>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
<target state="translated">001 - 其他系统信息</target>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002-预留</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
<target state="translated">003-预留</target>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
<target state="translated">004-预留</target>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
<target state="translated">005-预留</target>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
<target state="translated">006-预留</target>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
<target state="translated">007-通知: 状态信息</target>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
<target state="translated">008-通知: 需要用户干预</target>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
<target state="translated">009-用户定义的</target>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010-信息</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
<target state="translated">011-未找到指定的数据库对象</target>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
<target state="translated">012-未使用</target>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
<target state="translated">013-用户事务语法错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
<target state="translated">014-权限不足</target>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
<target state="translated">015-SQL 语句中的语法错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016-杂项用户错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
<target state="translated">017-资源不足</target>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
<target state="translated">018 - 非致命内部错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
<target state="translated">019 -资源致命错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
<target state="translated">020-当前过程中的致命错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
<target state="translated">021-数据库进程中的致命错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
<target state="translated">022-致命错误: 表完整性可疑</target>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023-致命错误: 数据库完整性不可靠</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
<target state="translated">024-致命错误: 硬件错误</target>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
<target state="translated">025-致命错误</target>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
<target state="translated">lt;所有数据库gt;</target>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
<target state="translated">执行作业</target>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">作业名称</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
<target state="translated">通知操作员</target>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">新作业</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
<target state="translated">操作员列表</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">运算符</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">电子邮件</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">分页</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
<target state="translated">新建操作符</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
<target state="translated">在电子邮件中包含警告错误文本</target>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
<target state="translated">在寻呼机中包含警报错误文本</target>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
<target state="translated">要发送的其他通知消息</target>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
<target state="translated">响应之间的延迟</target>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
<target state="translated">延迟分钟数</target>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
<target state="translated">延迟秒数</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">确定</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
<target state="translated">当作业完成时</target>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
<target state="translated">当作业失败时</target>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
<target state="translated">当作业成功时</target>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
<target state="translated">必须提供作业名称</target>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
<target state="translated">作业更新失败 "{0}"</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
<target state="translated">警报更新失败 "{0}"</target>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
<target state="translated">SQL server 事件警报</target>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
<target state="translated">SQL Server 性能状况警报</target>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
<target state="translated">WMI 事件警报</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="zh-Hans" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
<target state="translated">此功能正在开发中。 如果你想尝试最新的改进请签出最新的内部构建体验。</target>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,650 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/agent/out/dialogs/scheduleDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="scheduleDialog.newSchedule">
<source xml:lang="en">New Schedule</source>
</trans-unit>
<trans-unit id="scheduleDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">確定</target>
</trans-unit>
<trans-unit id="scheduleDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
<trans-unit id="scheduleDialog.scheduleName">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="scheduleDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/proxyDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="createProxy.createProxy">
<source xml:lang="en">Create Proxy</source>
</trans-unit>
<trans-unit id="createProxy.editProxy">
<source xml:lang="en">Edit Proxy</source>
</trans-unit>
<trans-unit id="createProxy.General">
<source xml:lang="en">General</source>
<target state="translated">一般</target>
</trans-unit>
<trans-unit id="createProxy.ProxyName">
<source xml:lang="en">Proxy name</source>
</trans-unit>
<trans-unit id="createProxy.CredentialName">
<source xml:lang="en">Credential name</source>
<target state="translated">認證名稱</target>
</trans-unit>
<trans-unit id="createProxy.Description">
<source xml:lang="en">Description</source>
<target state="translated">描述</target>
</trans-unit>
<trans-unit id="createProxy.SubsystemName">
<source xml:lang="en">Subsystem</source>
</trans-unit>
<trans-unit id="createProxy.OperatingSystem">
<source xml:lang="en">Operating system (CmdExec)</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationSnapshot">
<source xml:lang="en">Replication Snapshot</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationTransactionLog">
<source xml:lang="en">Replication Transaction-Log Reader</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationDistributor">
<source xml:lang="en">Replication Distributor</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationMerge">
<source xml:lang="en">Replication Merge</source>
</trans-unit>
<trans-unit id="createProxy.ReplicationQueueReader">
<source xml:lang="en">Replication Queue Reader</source>
</trans-unit>
<trans-unit id="createProxy.SSASQueryLabel">
<source xml:lang="en">SQL Server Analysis Services Query</source>
</trans-unit>
<trans-unit id="createProxy.SSASCommandLabel">
<source xml:lang="en">SQL Server Analysis Services Command</source>
</trans-unit>
<trans-unit id="createProxy.SSISPackage">
<source xml:lang="en">SQL Server Integration Services Package</source>
</trans-unit>
<trans-unit id="createProxy.PowerShell">
<source xml:lang="en">PowerShell</source>
</trans-unit>
<trans-unit id="createProxy.subSystemHeading">
<source xml:lang="en">Active to the following subsytems</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/pickScheduleDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="pickSchedule.jobSchedules">
<source xml:lang="en">Job Schedules</source>
<target state="translated">作業排程</target>
</trans-unit>
<trans-unit id="pickSchedule.ok">
<source xml:lang="en">OK</source>
<target state="translated">確定</target>
</trans-unit>
<trans-unit id="pickSchedule.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
<trans-unit id="pickSchedule.scheduleName">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="pickSchedule.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/operatorDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="createOperator.createOperator">
<source xml:lang="en">Create Operator</source>
</trans-unit>
<trans-unit id="createOperator.editOperator">
<source xml:lang="en">Edit Operator</source>
</trans-unit>
<trans-unit id="createOperator.General">
<source xml:lang="en">General</source>
<target state="translated">一般</target>
</trans-unit>
<trans-unit id="createOperator.Notifications">
<source xml:lang="en">Notifications</source>
</trans-unit>
<trans-unit id="createOperator.Name">
<source xml:lang="en">Name</source>
<target state="translated">名稱</target>
</trans-unit>
<trans-unit id="createOperator.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">啟用</target>
</trans-unit>
<trans-unit id="createOperator.EmailName">
<source xml:lang="en">E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerEmailName">
<source xml:lang="en">Pager E-mail Name</source>
</trans-unit>
<trans-unit id="createOperator.PagerMondayCheckBox">
<source xml:lang="en">Monday</source>
</trans-unit>
<trans-unit id="createOperator.PagerTuesdayCheckBox">
<source xml:lang="en">Tuesday</source>
</trans-unit>
<trans-unit id="createOperator.PagerWednesdayCheckBox">
<source xml:lang="en">Wednesday</source>
</trans-unit>
<trans-unit id="createOperator.PagerThursdayCheckBox">
<source xml:lang="en">Thursday</source>
</trans-unit>
<trans-unit id="createOperator.PagerFridayCheckBox">
<source xml:lang="en">Friday </source>
</trans-unit>
<trans-unit id="createOperator.PagerSaturdayCheckBox">
<source xml:lang="en">Saturday</source>
</trans-unit>
<trans-unit id="createOperator.PagerSundayCheckBox">
<source xml:lang="en">Sunday</source>
</trans-unit>
<trans-unit id="createOperator.workdayBegin">
<source xml:lang="en">Workday begin</source>
</trans-unit>
<trans-unit id="createOperator.workdayEnd">
<source xml:lang="en">Workday end</source>
</trans-unit>
<trans-unit id="createOperator.PagerDutySchedule">
<source xml:lang="en">Pager on duty schdule</source>
</trans-unit>
<trans-unit id="createOperator.AlertListHeading">
<source xml:lang="en">Alert list</source>
</trans-unit>
<trans-unit id="createOperator.AlertNameColumnLabel">
<source xml:lang="en">Alert name</source>
</trans-unit>
<trans-unit id="createOperator.AlertEmailColumnLabel">
<source xml:lang="en">E-mail</source>
<target state="translated">電子郵件</target>
</trans-unit>
<trans-unit id="createOperator.AlertPagerColumnLabel">
<source xml:lang="en">Pager</source>
<target state="translated">頁面巡覽區</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobStepDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="jobStepDialog.newJobStep">
<source xml:lang="en">New Job Step</source>
</trans-unit>
<trans-unit id="jobStepDialog.fileBrowserTitle">
<source xml:lang="en">Locate Database Files - </source>
</trans-unit>
<trans-unit id="jobStepDialog.ok">
<source xml:lang="en">OK</source>
<target state="translated">確定</target>
</trans-unit>
<trans-unit id="jobStepDialog.cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
<trans-unit id="jobStepDialog.general">
<source xml:lang="en">General</source>
<target state="translated">一般</target>
</trans-unit>
<trans-unit id="jobStepDialog.advanced">
<source xml:lang="en">Advanced</source>
<target state="translated">進階</target>
</trans-unit>
<trans-unit id="jobStepDialog.open">
<source xml:lang="en">Open...</source>
</trans-unit>
<trans-unit id="jobStepDialog.parse">
<source xml:lang="en">Parse</source>
<target state="translated">剖析</target>
</trans-unit>
<trans-unit id="jobStepDialog.next">
<source xml:lang="en">Next</source>
<target state="translated">下一個</target>
</trans-unit>
<trans-unit id="jobStepDialog.previous">
<source xml:lang="en">Previous</source>
<target state="translated">上一個</target>
</trans-unit>
<trans-unit id="jobStepDialog.successParse">
<source xml:lang="en">The command was successfully parsed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.failParse">
<source xml:lang="en">The command failed.</source>
</trans-unit>
<trans-unit id="jobStepDialog.blankStepName">
<source xml:lang="en">The step name cannot be left blank</source>
</trans-unit>
<trans-unit id="jobStepDialog.stepNameLabel">
<source xml:lang="en">Step Name</source>
</trans-unit>
<trans-unit id="jobStepDialog.typeLabel">
<source xml:lang="en">Type</source>
<target state="translated">型別</target>
</trans-unit>
<trans-unit id="jobStepDialog.runAsLabel">
<source xml:lang="en">Run as</source>
</trans-unit>
<trans-unit id="jobStepDialog.databaseLabel">
<source xml:lang="en">Database</source>
<target state="translated">資料庫</target>
</trans-unit>
<trans-unit id="jobStepDialog.commandLabel">
<source xml:lang="en">Command</source>
<target state="translated">命令</target>
</trans-unit>
<trans-unit id="jobStepDialog.successAction">
<source xml:lang="en">On success action</source>
</trans-unit>
<trans-unit id="jobStepDialog.failureAction">
<source xml:lang="en">On failure action</source>
</trans-unit>
<trans-unit id="jobStepDialog.runAsUser">
<source xml:lang="en">Run as user</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryAttempts">
<source xml:lang="en">Retry Attempts</source>
</trans-unit>
<trans-unit id="jobStepDialog.retryInterval">
<source xml:lang="en">Retry Interval (minutes)</source>
</trans-unit>
<trans-unit id="jobStepDialog.logToTable">
<source xml:lang="en">Log to table</source>
</trans-unit>
<trans-unit id="jobStepDialog.appendExistingTableEntry">
<source xml:lang="en">Append output to exisiting entry in table</source>
</trans-unit>
<trans-unit id="jobStepDialog.includeStepOutputHistory">
<source xml:lang="en">Include step output in history</source>
</trans-unit>
<trans-unit id="jobStepDialog.outputFile">
<source xml:lang="en">Output File</source>
<target state="translated">輸出檔案</target>
</trans-unit>
<trans-unit id="jobStepDialog.appendOutputToFile">
<source xml:lang="en">Append output to existing file</source>
</trans-unit>
<trans-unit id="jobStepDialog.selectedPath">
<source xml:lang="en">Selected path</source>
<target state="translated">選擇的路徑</target>
</trans-unit>
<trans-unit id="jobStepDialog.filesOfType">
<source xml:lang="en">Files of type</source>
<target state="translated">檔案類型</target>
</trans-unit>
<trans-unit id="jobStepDialog.fileName">
<source xml:lang="en">File name</source>
<target state="translated">檔案名稱</target>
</trans-unit>
<trans-unit id="jobStepDialog.allFiles">
<source xml:lang="en">All Files (*)</source>
</trans-unit>
<trans-unit id="jobStepDialog.TSQL">
<source xml:lang="en">Transact-SQL script (T-SQL)</source>
</trans-unit>
<trans-unit id="jobStepDialog.agentServiceAccount">
<source xml:lang="en">SQL Server Agent Service Account</source>
</trans-unit>
<trans-unit id="jobStepDialog.nextStep">
<source xml:lang="en">Go to the next step</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobSuccess">
<source xml:lang="en">Quit the job reporting success</source>
</trans-unit>
<trans-unit id="jobStepDialog.quitJobFailure">
<source xml:lang="en">Quit the job reporting failure</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/jobDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="jobDialog.general">
<source xml:lang="en">General</source>
<target state="translated">一般</target>
</trans-unit>
<trans-unit id="jobDialog.steps">
<source xml:lang="en">Steps</source>
</trans-unit>
<trans-unit id="jobDialog.schedules">
<source xml:lang="en">Schedules</source>
</trans-unit>
<trans-unit id="jobDialog.alerts">
<source xml:lang="en">Alerts</source>
</trans-unit>
<trans-unit id="jobDialog.notifications">
<source xml:lang="en">Notifications</source>
</trans-unit>
<trans-unit id="jobDialog.blankJobNameError">
<source xml:lang="en">The name of the job cannot be blank.</source>
</trans-unit>
<trans-unit id="jobDialog.name">
<source xml:lang="en">Name</source>
<target state="translated">名稱</target>
</trans-unit>
<trans-unit id="jobDialog.owner">
<source xml:lang="en">Owner</source>
<target state="translated">擁有者</target>
</trans-unit>
<trans-unit id="jobDialog.category">
<source xml:lang="en">Category</source>
<target state="translated">分類</target>
</trans-unit>
<trans-unit id="jobDialog.description">
<source xml:lang="en">Description</source>
<target state="translated">描述</target>
</trans-unit>
<trans-unit id="jobDialog.enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">啟用</target>
</trans-unit>
<trans-unit id="jobDialog.jobStepList">
<source xml:lang="en">Job step list</source>
</trans-unit>
<trans-unit id="jobDialog.step">
<source xml:lang="en">Step</source>
<target state="translated">步驟</target>
</trans-unit>
<trans-unit id="jobDialog.type">
<source xml:lang="en">Type</source>
<target state="translated">型別</target>
</trans-unit>
<trans-unit id="jobDialog.onSuccess">
<source xml:lang="en">On Success</source>
</trans-unit>
<trans-unit id="jobDialog.onFailure">
<source xml:lang="en">On Failure</source>
</trans-unit>
<trans-unit id="jobDialog.new">
<source xml:lang="en">New...</source>
<target state="translated">新增...</target>
</trans-unit>
<trans-unit id="jobDialog.edit">
<source xml:lang="en">Edit</source>
<target state="translated">編輯</target>
</trans-unit>
<trans-unit id="jobDialog.delete">
<source xml:lang="en">Delete</source>
<target state="translated">刪除</target>
</trans-unit>
<trans-unit id="jobDialog.moveUp">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.moveDown">
<source xml:lang="en">Move Step Up</source>
</trans-unit>
<trans-unit id="jobDialog.notificationsTabTop">
<source xml:lang="en">Actions to perform when the job completes</source>
<target state="translated">作業完成時要執行的操作</target>
</trans-unit>
<trans-unit id="jobDialog.email">
<source xml:lang="en">Email</source>
</trans-unit>
<trans-unit id="jobDialog.page">
<source xml:lang="en">Page</source>
<target state="translated">頁面</target>
</trans-unit>
<trans-unit id="jobDialog.eventLogCheckBoxLabel">
<source xml:lang="en">Write to the Windows Application event log</source>
</trans-unit>
<trans-unit id="jobDialog.deleteJobLabel">
<source xml:lang="en">Automatically delete job</source>
</trans-unit>
<trans-unit id="jobDialog.schedulesaLabel">
<source xml:lang="en">Schedules list</source>
</trans-unit>
<trans-unit id="jobDialog.pickSchedule">
<source xml:lang="en">Pick Schedule</source>
</trans-unit>
<trans-unit id="jobDialog.scheduleNameLabel">
<source xml:lang="en">Schedule Name</source>
</trans-unit>
<trans-unit id="jobDialog.alertsList">
<source xml:lang="en">Alerts list</source>
</trans-unit>
<trans-unit id="jobDialog.newAlert">
<source xml:lang="en">New Alert</source>
</trans-unit>
<trans-unit id="jobDialog.alertNameLabel">
<source xml:lang="en">Alert Name</source>
</trans-unit>
<trans-unit id="jobDialog.newJob">
<source xml:lang="en">New Job</source>
<target state="translated">新工作</target>
</trans-unit>
<trans-unit id="jobDialog.editJob">
<source xml:lang="en">Edit Job</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/alertDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="alertDialog.createAlert">
<source xml:lang="en">Create Alert</source>
</trans-unit>
<trans-unit id="alertDialog.editAlert">
<source xml:lang="en">Edit Alert</source>
</trans-unit>
<trans-unit id="alertDialog.General">
<source xml:lang="en">General</source>
<target state="translated">一般</target>
</trans-unit>
<trans-unit id="alertDialog.Response">
<source xml:lang="en">Response</source>
</trans-unit>
<trans-unit id="alertDialog.Options">
<source xml:lang="en">Options</source>
<target state="translated">選項</target>
</trans-unit>
<trans-unit id="alertDialog.eventAlert">
<source xml:lang="en">Event alert definition</source>
</trans-unit>
<trans-unit id="alertDialog.Name">
<source xml:lang="en">Name</source>
<target state="translated">名稱</target>
</trans-unit>
<trans-unit id="alertDialog.Type">
<source xml:lang="en">Type</source>
<target state="translated">型別</target>
</trans-unit>
<trans-unit id="alertDialog.Enabled">
<source xml:lang="en">Enabled</source>
<target state="translated">啟用</target>
</trans-unit>
<trans-unit id="alertDialog.DatabaseName">
<source xml:lang="en">Database name</source>
<target state="translated">資料庫名稱</target>
</trans-unit>
<trans-unit id="alertDialog.ErrorNumber">
<source xml:lang="en">Error number</source>
</trans-unit>
<trans-unit id="alertDialog.Severity">
<source xml:lang="en">Severity</source>
<target state="translated">嚴重性</target>
</trans-unit>
<trans-unit id="alertDialog.RaiseAlertContains">
<source xml:lang="en">Raise alert when message contains</source>
</trans-unit>
<trans-unit id="alertDialog.MessageText">
<source xml:lang="en">Message text</source>
</trans-unit>
<trans-unit id="alertDialog.Severity001">
<source xml:lang="en">001 - Miscellaneous System Information</source>
</trans-unit>
<trans-unit id="alertDialog.Severity002">
<source xml:lang="en">002 - Reserved</source>
<target state="translated">002 - 預留</target>
</trans-unit>
<trans-unit id="alertDialog.Severity003">
<source xml:lang="en">003 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity004">
<source xml:lang="en">004 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity005">
<source xml:lang="en">005 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity006">
<source xml:lang="en">006 - Reserved</source>
</trans-unit>
<trans-unit id="alertDialog.Severity007">
<source xml:lang="en">007 - Notification: Status Information</source>
</trans-unit>
<trans-unit id="alertDialog.Severity008">
<source xml:lang="en">008 - Notification: User Intervention Required</source>
</trans-unit>
<trans-unit id="alertDialog.Severity009">
<source xml:lang="en">009 - User Defined</source>
</trans-unit>
<trans-unit id="alertDialog.Severity010">
<source xml:lang="en">010 - Information</source>
<target state="translated">010 - 資訊</target>
</trans-unit>
<trans-unit id="alertDialog.Severity011">
<source xml:lang="en">011 - Specified Database Object Not Found</source>
</trans-unit>
<trans-unit id="alertDialog.Severity012">
<source xml:lang="en">012 - Unused</source>
</trans-unit>
<trans-unit id="alertDialog.Severity013">
<source xml:lang="en">013 - User Transaction Syntax Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity014">
<source xml:lang="en">014 - Insufficient Permission</source>
</trans-unit>
<trans-unit id="alertDialog.Severity015">
<source xml:lang="en">015 - Syntax Error in SQL Statements</source>
</trans-unit>
<trans-unit id="alertDialog.Severity016">
<source xml:lang="en">016 - Miscellaneous User Error</source>
<target state="translated">016 - 其他使用者錯誤</target>
</trans-unit>
<trans-unit id="alertDialog.Severity017">
<source xml:lang="en">017 - Insufficient Resources</source>
</trans-unit>
<trans-unit id="alertDialog.Severity018">
<source xml:lang="en">018 - Nonfatal Internal Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity019">
<source xml:lang="en">019 - Fatal Error in Resource</source>
</trans-unit>
<trans-unit id="alertDialog.Severity020">
<source xml:lang="en">020 - Fatal Error in Current Process</source>
</trans-unit>
<trans-unit id="alertDialog.Severity021">
<source xml:lang="en">021 - Fatal Error in Database Processes</source>
</trans-unit>
<trans-unit id="alertDialog.Severity022">
<source xml:lang="en">022 - Fatal Error: Table Integrity Suspect</source>
</trans-unit>
<trans-unit id="alertDialog.Severity023">
<source xml:lang="en">023 - Fatal Error: Database Integrity Suspect</source>
<target state="translated">023 - 嚴重錯誤: 資料庫完整性有疑慮</target>
</trans-unit>
<trans-unit id="alertDialog.Severity024">
<source xml:lang="en">024 - Fatal Error: Hardware Error</source>
</trans-unit>
<trans-unit id="alertDialog.Severity025">
<source xml:lang="en">025 - Fatal Error</source>
</trans-unit>
<trans-unit id="alertDialog.AllDatabases">
<source xml:lang="en">&lt;all databases&gt;</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJob">
<source xml:lang="en">Execute Job</source>
</trans-unit>
<trans-unit id="alertDialog.ExecuteJobName">
<source xml:lang="en">Job Name</source>
<target state="translated">作業名稱</target>
</trans-unit>
<trans-unit id="alertDialog.NotifyOperators">
<source xml:lang="en">Notify Operators</source>
</trans-unit>
<trans-unit id="alertDialog.NewJob">
<source xml:lang="en">New Job</source>
<target state="translated">新工作</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorList">
<source xml:lang="en">Operator List</source>
</trans-unit>
<trans-unit id="alertDialog.OperatorName">
<source xml:lang="en">Operator</source>
<target state="translated">運算子</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorEmail">
<source xml:lang="en">E-mail</source>
<target state="translated">電子郵件</target>
</trans-unit>
<trans-unit id="alertDialog.OperatorPager">
<source xml:lang="en">Pager</source>
<target state="translated">頁面巡覽區</target>
</trans-unit>
<trans-unit id="alertDialog.NewOperator">
<source xml:lang="en">New Operator</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInEmail">
<source xml:lang="en">Include alert error text in e-mail</source>
</trans-unit>
<trans-unit id="alertDialog.IncludeErrorInPager">
<source xml:lang="en">Include alert error text in pager</source>
</trans-unit>
<trans-unit id="alertDialog.AdditionalNotification">
<source xml:lang="en">Additional notification message to send</source>
</trans-unit>
<trans-unit id="alertDialog.DelayBetweenResponse">
<source xml:lang="en">Delay between responses</source>
</trans-unit>
<trans-unit id="alertDialog.DelayMinutes">
<source xml:lang="en">Delay Minutes</source>
</trans-unit>
<trans-unit id="alertDialog.DelaySeconds">
<source xml:lang="en">Delay Seconds</source>
<target state="translated">延遲秒數</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/dialogs/agentDialog" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="agentDialog.OK">
<source xml:lang="en">OK</source>
<target state="translated">確定</target>
</trans-unit>
<trans-unit id="agentDialog.Cancel">
<source xml:lang="en">Cancel</source>
<target state="translated">取消</target>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/jobData" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="jobData.whenJobCompletes">
<source xml:lang="en">When the job completes</source>
</trans-unit>
<trans-unit id="jobData.whenJobFails">
<source xml:lang="en">When the job fails</source>
</trans-unit>
<trans-unit id="jobData.whenJobSucceeds">
<source xml:lang="en">When the job succeeds</source>
</trans-unit>
<trans-unit id="jobData.jobNameRequired">
<source xml:lang="en">Job name must be provided</source>
<target state="translated">必須提供作業名稱</target>
</trans-unit>
<trans-unit id="jobData.saveErrorMessage">
<source xml:lang="en">Job update failed '{0}'</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/data/alertData" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="alertData.saveErrorMessage">
<source xml:lang="en">Alert update failed '{0}'</source>
</trans-unit>
<trans-unit id="alertData.DefaultAlertTypString">
<source xml:lang="en">SQL Server event alert</source>
</trans-unit>
<trans-unit id="alertDialog.PerformanceCondition">
<source xml:lang="en">SQL Server performance condition alert</source>
</trans-unit>
<trans-unit id="alertDialog.WmiEvent">
<source xml:lang="en">WMI event alert</source>
</trans-unit>
</body></file>
<file original="extensions/agent/out/mainController" source-language="en" target-language="zh-Hant" datatype="plaintext"><body>
<trans-unit id="mainController.notImplemented">
<source xml:lang="en">This feature is under development. Check-out the latest insiders build if you'd like to try out the most recent changes!</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/import/out/wizard/pages/summaryPage" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importInformation">
<source xml:lang="en">Import information</source>
</trans-unit>
<trans-unit id="flatFileImport.importStatus">
<source xml:lang="en">Import status</source>
<target state="translated">Importstatus</target>
</trans-unit>
<trans-unit id="flatFileImport.serverName">
<source xml:lang="en">Server name</source>
<target state="translated">Servername</target>
</trans-unit>
<trans-unit id="flatFileImport.databaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Datenbankname</target>
</trans-unit>
<trans-unit id="flatFileImport.tableName">
<source xml:lang="en">Table name</source>
<target state="translated">Tabellenname</target>
</trans-unit>
<trans-unit id="flatFileImport.tableSchema">
<source xml:lang="en">Table schema</source>
</trans-unit>
<trans-unit id="flatFileImport.fileImport">
<source xml:lang="en">File to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.success.norows">
<source xml:lang="en">✔ You have successfully inserted the data into a table.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/prosePreviewPage" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="flatFileImport.refresh">
<source xml:lang="en">Refresh</source>
<target state="translated">Aktualisieren</target>
</trans-unit>
<trans-unit id="flatFileImport.prosePreviewMessage">
<source xml:lang="en">This operation analyzed the input file structure to generate the preview below for up to the first 50 rows.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/modifyColumnsPage" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importData">
<source xml:lang="en">Import Data</source>
</trans-unit>
<trans-unit id="flatFileImport.next">
<source xml:lang="en">Next</source>
<target state="translated">Weiter</target>
</trans-unit>
<trans-unit id="flatFileImport.columnName">
<source xml:lang="en">Column Name</source>
<target state="translated">Spaltenname</target>
</trans-unit>
<trans-unit id="flatFileImport.dataType">
<source xml:lang="en">Data Type</source>
<target state="translated">Datentyp</target>
</trans-unit>
<trans-unit id="flatFileImport.primaryKey">
<source xml:lang="en">Primary Key</source>
<target state="translated">Primärschlüssel</target>
</trans-unit>
<trans-unit id="flatFileImport.allowNulls">
<source xml:lang="en">Allow Nulls</source>
<target state="translated">NULL-Werte zulassen</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/fileConfigPage" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="flatFileImport.serverDropdownTitle">
<source xml:lang="en">Server the database is in</source>
</trans-unit>
<trans-unit id="flatFileImport.databaseDropdownTitle">
<source xml:lang="en">Database the table is created in</source>
</trans-unit>
<trans-unit id="flatFileImport.browseFiles">
<source xml:lang="en">Browse</source>
<target state="translated">Durchsuchen</target>
</trans-unit>
<trans-unit id="flatFileImport.openFile">
<source xml:lang="en">Open</source>
<target state="translated">Eröffnungskurs</target>
</trans-unit>
<trans-unit id="flatFileImport.fileTextboxTitle">
<source xml:lang="en">Location of the file to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.tableTextboxTitle">
<source xml:lang="en">New table name</source>
</trans-unit>
<trans-unit id="flatFileImport.schemaTextboxTitle">
<source xml:lang="en">Table schema</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/telemetry" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="import.serviceCrashButton">
<source xml:lang="en">Give Feedback</source>
</trans-unit>
<trans-unit id="serviceCrashMessage">
<source xml:lang="en">service component could not start</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/serviceClient" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="serviceStarted">
<source xml:lang="en">Service Started</source>
</trans-unit>
<trans-unit id="serviceStarting">
<source xml:lang="en">Starting service</source>
</trans-unit>
<trans-unit id="flatFileImport.serviceStartFailed">
<source xml:lang="en">Failed to start Import service{0}</source>
</trans-unit>
<trans-unit id="installingServiceDetailed">
<source xml:lang="en">Installing {0} service to {1}</source>
</trans-unit>
<trans-unit id="installingService">
<source xml:lang="en">Installing Service</source>
</trans-unit>
<trans-unit id="serviceInstalled">
<source xml:lang="en">Installed</source>
<target state="translated">INSTALLIERT</target>
</trans-unit>
<trans-unit id="downloadingService">
<source xml:lang="en">Downloading {0}</source>
<target state="translated">{0} wird heruntergeladen.</target>
</trans-unit>
<trans-unit id="downloadingServiceStatus">
<source xml:lang="en">Downloading Service</source>
<target state="translated">Download-Dienst</target>
</trans-unit>
<trans-unit id="downloadingServiceComplete">
<source xml:lang="en">Done!</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/flatFileWizard" source-language="en" target-language="de" datatype="plaintext"><body>
<trans-unit id="import.needConnection">
<source xml:lang="en">Please connect to a server before using this wizard.</source>
<target state="translated">Bitte verbinden Sie sich mit einem Server, bevor Sie diesen Assistenten verwenden.</target>
</trans-unit>
<trans-unit id="flatFileImport.wizardName">
<source xml:lang="en">Import flat file wizard</source>
</trans-unit>
<trans-unit id="flatFileImport.page1Name">
<source xml:lang="en">Specify Input File</source>
</trans-unit>
<trans-unit id="flatFileImport.page2Name">
<source xml:lang="en">Preview Data</source>
</trans-unit>
<trans-unit id="flatFileImport.page3Name">
<source xml:lang="en">Modify Columns</source>
</trans-unit>
<trans-unit id="flatFileImport.page4Name">
<source xml:lang="en">Summary</source>
<target state="translated">Zusammenfassung</target>
</trans-unit>
<trans-unit id="flatFileImport.importNewFile">
<source xml:lang="en">Import new file</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/import/out/wizard/pages/summaryPage" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importInformation">
<source xml:lang="en">Import information</source>
</trans-unit>
<trans-unit id="flatFileImport.importStatus">
<source xml:lang="en">Import status</source>
<target state="translated">Estado de importación</target>
</trans-unit>
<trans-unit id="flatFileImport.serverName">
<source xml:lang="en">Server name</source>
<target state="translated">Nombre del servidor</target>
</trans-unit>
<trans-unit id="flatFileImport.databaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nombre de la base de datos</target>
</trans-unit>
<trans-unit id="flatFileImport.tableName">
<source xml:lang="en">Table name</source>
</trans-unit>
<trans-unit id="flatFileImport.tableSchema">
<source xml:lang="en">Table schema</source>
</trans-unit>
<trans-unit id="flatFileImport.fileImport">
<source xml:lang="en">File to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.success.norows">
<source xml:lang="en">✔ You have successfully inserted the data into a table.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/prosePreviewPage" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="flatFileImport.refresh">
<source xml:lang="en">Refresh</source>
<target state="translated">Actualizar</target>
</trans-unit>
<trans-unit id="flatFileImport.prosePreviewMessage">
<source xml:lang="en">This operation analyzed the input file structure to generate the preview below for up to the first 50 rows.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/modifyColumnsPage" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importData">
<source xml:lang="en">Import Data</source>
<target state="translated">Importar datos</target>
</trans-unit>
<trans-unit id="flatFileImport.next">
<source xml:lang="en">Next</source>
<target state="translated">Siguiente</target>
</trans-unit>
<trans-unit id="flatFileImport.columnName">
<source xml:lang="en">Column Name</source>
<target state="translated">Nombre de columna</target>
</trans-unit>
<trans-unit id="flatFileImport.dataType">
<source xml:lang="en">Data Type</source>
<target state="translated">Tipo de datos</target>
</trans-unit>
<trans-unit id="flatFileImport.primaryKey">
<source xml:lang="en">Primary Key</source>
<target state="translated">Clave principal</target>
</trans-unit>
<trans-unit id="flatFileImport.allowNulls">
<source xml:lang="en">Allow Nulls</source>
<target state="translated">Permitir valores NULL</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/fileConfigPage" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="flatFileImport.serverDropdownTitle">
<source xml:lang="en">Server the database is in</source>
</trans-unit>
<trans-unit id="flatFileImport.databaseDropdownTitle">
<source xml:lang="en">Database the table is created in</source>
</trans-unit>
<trans-unit id="flatFileImport.browseFiles">
<source xml:lang="en">Browse</source>
<target state="translated">Examinar</target>
</trans-unit>
<trans-unit id="flatFileImport.openFile">
<source xml:lang="en">Open</source>
<target state="translated">Abrir</target>
</trans-unit>
<trans-unit id="flatFileImport.fileTextboxTitle">
<source xml:lang="en">Location of the file to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.tableTextboxTitle">
<source xml:lang="en">New table name</source>
</trans-unit>
<trans-unit id="flatFileImport.schemaTextboxTitle">
<source xml:lang="en">Table schema</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/telemetry" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="import.serviceCrashButton">
<source xml:lang="en">Give Feedback</source>
</trans-unit>
<trans-unit id="serviceCrashMessage">
<source xml:lang="en">service component could not start</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/serviceClient" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="serviceStarted">
<source xml:lang="en">Service Started</source>
<target state="translated">Servicio iniciado</target>
</trans-unit>
<trans-unit id="serviceStarting">
<source xml:lang="en">Starting service</source>
</trans-unit>
<trans-unit id="flatFileImport.serviceStartFailed">
<source xml:lang="en">Failed to start Import service{0}</source>
</trans-unit>
<trans-unit id="installingServiceDetailed">
<source xml:lang="en">Installing {0} service to {1}</source>
</trans-unit>
<trans-unit id="installingService">
<source xml:lang="en">Installing Service</source>
</trans-unit>
<trans-unit id="serviceInstalled">
<source xml:lang="en">Installed</source>
<target state="translated">INSTALADO</target>
</trans-unit>
<trans-unit id="downloadingService">
<source xml:lang="en">Downloading {0}</source>
<target state="translated">Descargando {0}</target>
</trans-unit>
<trans-unit id="downloadingServiceStatus">
<source xml:lang="en">Downloading Service</source>
</trans-unit>
<trans-unit id="downloadingServiceComplete">
<source xml:lang="en">Done!</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/flatFileWizard" source-language="en" target-language="es" datatype="plaintext"><body>
<trans-unit id="import.needConnection">
<source xml:lang="en">Please connect to a server before using this wizard.</source>
</trans-unit>
<trans-unit id="flatFileImport.wizardName">
<source xml:lang="en">Import flat file wizard</source>
</trans-unit>
<trans-unit id="flatFileImport.page1Name">
<source xml:lang="en">Specify Input File</source>
</trans-unit>
<trans-unit id="flatFileImport.page2Name">
<source xml:lang="en">Preview Data</source>
</trans-unit>
<trans-unit id="flatFileImport.page3Name">
<source xml:lang="en">Modify Columns</source>
</trans-unit>
<trans-unit id="flatFileImport.page4Name">
<source xml:lang="en">Summary</source>
<target state="translated">Resumen</target>
</trans-unit>
<trans-unit id="flatFileImport.importNewFile">
<source xml:lang="en">Import new file</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,169 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/import/out/wizard/pages/summaryPage" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importInformation">
<source xml:lang="en">Import information</source>
<target state="translated">Importer les informations</target>
</trans-unit>
<trans-unit id="flatFileImport.importStatus">
<source xml:lang="en">Import status</source>
<target state="translated">État de limportation</target>
</trans-unit>
<trans-unit id="flatFileImport.serverName">
<source xml:lang="en">Server name</source>
<target state="translated">Nom du serveur</target>
</trans-unit>
<trans-unit id="flatFileImport.databaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nom de la base de données</target>
</trans-unit>
<trans-unit id="flatFileImport.tableName">
<source xml:lang="en">Table name</source>
<target state="translated">Nom de la table</target>
</trans-unit>
<trans-unit id="flatFileImport.tableSchema">
<source xml:lang="en">Table schema</source>
<target state="translated">Schéma de table</target>
</trans-unit>
<trans-unit id="flatFileImport.fileImport">
<source xml:lang="en">File to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.success.norows">
<source xml:lang="en">✔ You have successfully inserted the data into a table.</source>
<target state="translated">✔ Vous avez inséré les données dans une table.</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/prosePreviewPage" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="flatFileImport.refresh">
<source xml:lang="en">Refresh</source>
<target state="translated">Actualiser</target>
</trans-unit>
<trans-unit id="flatFileImport.prosePreviewMessage">
<source xml:lang="en">This operation analyzed the input file structure to generate the preview below for up to the first 50 rows.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/modifyColumnsPage" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importData">
<source xml:lang="en">Import Data</source>
<target state="translated">Importer des données</target>
</trans-unit>
<trans-unit id="flatFileImport.next">
<source xml:lang="en">Next</source>
<target state="translated">Suivant</target>
</trans-unit>
<trans-unit id="flatFileImport.columnName">
<source xml:lang="en">Column Name</source>
<target state="translated">Nom de la colonne</target>
</trans-unit>
<trans-unit id="flatFileImport.dataType">
<source xml:lang="en">Data Type</source>
<target state="translated">Type de données</target>
</trans-unit>
<trans-unit id="flatFileImport.primaryKey">
<source xml:lang="en">Primary Key</source>
<target state="translated">Clé primaire</target>
</trans-unit>
<trans-unit id="flatFileImport.allowNulls">
<source xml:lang="en">Allow Nulls</source>
<target state="translated">Autoriser les valeurs Null</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/fileConfigPage" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="flatFileImport.serverDropdownTitle">
<source xml:lang="en">Server the database is in</source>
<target state="translated">Serveur dans lequel se trouve la base de données</target>
</trans-unit>
<trans-unit id="flatFileImport.databaseDropdownTitle">
<source xml:lang="en">Database the table is created in</source>
</trans-unit>
<trans-unit id="flatFileImport.browseFiles">
<source xml:lang="en">Browse</source>
<target state="translated">Parcourir</target>
</trans-unit>
<trans-unit id="flatFileImport.openFile">
<source xml:lang="en">Open</source>
<target state="translated">Ouvrir </target>
</trans-unit>
<trans-unit id="flatFileImport.fileTextboxTitle">
<source xml:lang="en">Location of the file to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.tableTextboxTitle">
<source xml:lang="en">New table name</source>
<target state="translated">Nouveau nom de table</target>
</trans-unit>
<trans-unit id="flatFileImport.schemaTextboxTitle">
<source xml:lang="en">Table schema</source>
<target state="translated">Schéma de table</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/telemetry" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="import.serviceCrashButton">
<source xml:lang="en">Give Feedback</source>
<target state="translated">Donner son avis</target>
</trans-unit>
<trans-unit id="serviceCrashMessage">
<source xml:lang="en">service component could not start</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/serviceClient" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="serviceStarted">
<source xml:lang="en">Service Started</source>
<target state="translated">Service démarré</target>
</trans-unit>
<trans-unit id="serviceStarting">
<source xml:lang="en">Starting service</source>
</trans-unit>
<trans-unit id="flatFileImport.serviceStartFailed">
<source xml:lang="en">Failed to start Import service{0}</source>
</trans-unit>
<trans-unit id="installingServiceDetailed">
<source xml:lang="en">Installing {0} service to {1}</source>
</trans-unit>
<trans-unit id="installingService">
<source xml:lang="en">Installing Service</source>
<target state="translated">Installation du Service</target>
</trans-unit>
<trans-unit id="serviceInstalled">
<source xml:lang="en">Installed</source>
<target state="translated">INSTALLÉ</target>
</trans-unit>
<trans-unit id="downloadingService">
<source xml:lang="en">Downloading {0}</source>
<target state="translated">Téléchargement de {0} en cours</target>
</trans-unit>
<trans-unit id="downloadingServiceStatus">
<source xml:lang="en">Downloading Service</source>
</trans-unit>
<trans-unit id="downloadingServiceComplete">
<source xml:lang="en">Done!</source>
<target state="translated">Terminé !</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/flatFileWizard" source-language="en" target-language="fr" datatype="plaintext"><body>
<trans-unit id="import.needConnection">
<source xml:lang="en">Please connect to a server before using this wizard.</source>
<target state="translated">Connectez-vous à un serveur avant dutiliser cet Assistant.</target>
</trans-unit>
<trans-unit id="flatFileImport.wizardName">
<source xml:lang="en">Import flat file wizard</source>
</trans-unit>
<trans-unit id="flatFileImport.page1Name">
<source xml:lang="en">Specify Input File</source>
<target state="translated">Spécifier le fichier d'entrée</target>
</trans-unit>
<trans-unit id="flatFileImport.page2Name">
<source xml:lang="en">Preview Data</source>
</trans-unit>
<trans-unit id="flatFileImport.page3Name">
<source xml:lang="en">Modify Columns</source>
<target state="translated">Modifier les colonnes</target>
</trans-unit>
<trans-unit id="flatFileImport.page4Name">
<source xml:lang="en">Summary</source>
<target state="translated">Récapitulatif</target>
</trans-unit>
<trans-unit id="flatFileImport.importNewFile">
<source xml:lang="en">Import new file</source>
</trans-unit>
</body></file>
</xliff>

View File

@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="extensions/import/out/wizard/pages/summaryPage" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importInformation">
<source xml:lang="en">Import information</source>
</trans-unit>
<trans-unit id="flatFileImport.importStatus">
<source xml:lang="en">Import status</source>
</trans-unit>
<trans-unit id="flatFileImport.serverName">
<source xml:lang="en">Server name</source>
<target state="translated">Nome del server</target>
</trans-unit>
<trans-unit id="flatFileImport.databaseName">
<source xml:lang="en">Database name</source>
<target state="translated">Nome del database</target>
</trans-unit>
<trans-unit id="flatFileImport.tableName">
<source xml:lang="en">Table name</source>
</trans-unit>
<trans-unit id="flatFileImport.tableSchema">
<source xml:lang="en">Table schema</source>
<target state="translated">Schema della tabella</target>
</trans-unit>
<trans-unit id="flatFileImport.fileImport">
<source xml:lang="en">File to be imported</source>
</trans-unit>
<trans-unit id="flatFileImport.success.norows">
<source xml:lang="en">✔ You have successfully inserted the data into a table.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/prosePreviewPage" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="flatFileImport.refresh">
<source xml:lang="en">Refresh</source>
<target state="translated">Aggiorna</target>
</trans-unit>
<trans-unit id="flatFileImport.prosePreviewMessage">
<source xml:lang="en">This operation analyzed the input file structure to generate the preview below for up to the first 50 rows.</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/modifyColumnsPage" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="flatFileImport.importData">
<source xml:lang="en">Import Data</source>
</trans-unit>
<trans-unit id="flatFileImport.next">
<source xml:lang="en">Next</source>
<target state="translated">Avanti</target>
</trans-unit>
<trans-unit id="flatFileImport.columnName">
<source xml:lang="en">Column Name</source>
<target state="translated">Nome colonna</target>
</trans-unit>
<trans-unit id="flatFileImport.dataType">
<source xml:lang="en">Data Type</source>
<target state="translated">Tipo di dato</target>
</trans-unit>
<trans-unit id="flatFileImport.primaryKey">
<source xml:lang="en">Primary Key</source>
<target state="translated">Chiave primaria</target>
</trans-unit>
<trans-unit id="flatFileImport.allowNulls">
<source xml:lang="en">Allow Nulls</source>
<target state="translated">Consenti valori Null</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/pages/fileConfigPage" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="flatFileImport.serverDropdownTitle">
<source xml:lang="en">Server the database is in</source>
</trans-unit>
<trans-unit id="flatFileImport.databaseDropdownTitle">
<source xml:lang="en">Database the table is created in</source>
</trans-unit>
<trans-unit id="flatFileImport.browseFiles">
<source xml:lang="en">Browse</source>
<target state="translated">Sfoglia</target>
</trans-unit>
<trans-unit id="flatFileImport.openFile">
<source xml:lang="en">Open</source>
<target state="translated">Apri</target>
</trans-unit>
<trans-unit id="flatFileImport.fileTextboxTitle">
<source xml:lang="en">Location of the file to be imported</source>
<target state="translated">Percorso del file da importare</target>
</trans-unit>
<trans-unit id="flatFileImport.tableTextboxTitle">
<source xml:lang="en">New table name</source>
<target state="translated">Nuovo nome di tabella</target>
</trans-unit>
<trans-unit id="flatFileImport.schemaTextboxTitle">
<source xml:lang="en">Table schema</source>
<target state="translated">Schema della tabella</target>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/telemetry" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="import.serviceCrashButton">
<source xml:lang="en">Give Feedback</source>
<target state="translated">Lascia un Feedback</target>
</trans-unit>
<trans-unit id="serviceCrashMessage">
<source xml:lang="en">service component could not start</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/services/serviceClient" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="serviceStarted">
<source xml:lang="en">Service Started</source>
<target state="translated">Servizio avviato</target>
</trans-unit>
<trans-unit id="serviceStarting">
<source xml:lang="en">Starting service</source>
<target state="translated">Avvio del servizio</target>
</trans-unit>
<trans-unit id="flatFileImport.serviceStartFailed">
<source xml:lang="en">Failed to start Import service{0}</source>
</trans-unit>
<trans-unit id="installingServiceDetailed">
<source xml:lang="en">Installing {0} service to {1}</source>
</trans-unit>
<trans-unit id="installingService">
<source xml:lang="en">Installing Service</source>
</trans-unit>
<trans-unit id="serviceInstalled">
<source xml:lang="en">Installed</source>
<target state="translated">Installato</target>
</trans-unit>
<trans-unit id="downloadingService">
<source xml:lang="en">Downloading {0}</source>
</trans-unit>
<trans-unit id="downloadingServiceStatus">
<source xml:lang="en">Downloading Service</source>
</trans-unit>
<trans-unit id="downloadingServiceComplete">
<source xml:lang="en">Done!</source>
</trans-unit>
</body></file>
<file original="extensions/import/out/wizard/flatFileWizard" source-language="en" target-language="it" datatype="plaintext"><body>
<trans-unit id="import.needConnection">
<source xml:lang="en">Please connect to a server before using this wizard.</source>
</trans-unit>
<trans-unit id="flatFileImport.wizardName">
<source xml:lang="en">Import flat file wizard</source>
</trans-unit>
<trans-unit id="flatFileImport.page1Name">
<source xml:lang="en">Specify Input File</source>
<target state="translated">Specificare il File di Input</target>
</trans-unit>
<trans-unit id="flatFileImport.page2Name">
<source xml:lang="en">Preview Data</source>
</trans-unit>
<trans-unit id="flatFileImport.page3Name">
<source xml:lang="en">Modify Columns</source>
</trans-unit>
<trans-unit id="flatFileImport.page4Name">
<source xml:lang="en">Summary</source>
<target state="translated">Riepilogo</target>
</trans-unit>
<trans-unit id="flatFileImport.importNewFile">
<source xml:lang="en">Import new file</source>
</trans-unit>
</body></file>
</xliff>

Some files were not shown because too many files have changed in this diff Show More