Compare commits

...

10 Commits

Author SHA1 Message Date
Sung-Hyun Kang
d735ec8322 Bundle and fallback english localization strings 2026-03-17 16:42:24 -05:00
sunghyunkang1111
e661faea0b Fix portal background opening health metric (#2425)
* Fix portal background opening

* fix rAF
2026-03-17 12:10:16 -05:00
Nishtha Ahuja
8cce0a4802 Filtering DBs and option for pin(fav)(#2301)
* implemented search bar

* formatting corrected

* added pin(fav) and sorting in local in sidebar tree of DE

* reverted changes

* fixed lint and formatting issues

* fixed lint and formatting issues

* theme toggle button is disabled if in portal

* fixed lint error

* added link on disabled theme toggle button

* updated the variable for pin icon

* removed en-us from url

---------

Co-authored-by: nishthaAhujaa <nishtha17354@iiittd.ac.in>
Co-authored-by: sakshigupta12feb <sakshigupta12feb1@gmail.com>
Co-authored-by: Sakshi Gupta <sakshig@microsoft.com>
2026-03-16 20:23:44 +05:30
asier-isayas
454a02bc53 Handle partition key path with whitespace (#2423)
* Handle partition key path with white space

* add whitespace test case for pkey

* remove trailing whitespace

---------

Co-authored-by: Asier Isayas <aisayas@microsoft.com>
2026-03-16 07:21:41 -07:00
Laurent Nguyen
7a93df6a4b Fix: Remove duplicate database refresh logic (Fabric). Add logging for collection fetching. (#2426)
* Remove duplicate database refresh logic. Add logging for collection fetching

* fix: Fix unit test

* fix: Update snapshots to include databasesRefreshed property

---------

Co-authored-by: Laurent Nguyen <languye@microsoft.com>
2026-03-16 14:24:27 +01:00
olprod
c5d1f4f06f Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2453843 (#2424) 2026-03-13 10:57:56 -05:00
Nishtha Ahuja
3c97778da5 Searchable dropdown (#2312)
* Searchable dropdown

* format fix

* Refactor SearchableDropdown with Fluent UI components, extract styles, and add tests (#2329)

* Initial plan

* Refactor SearchableDropdown with Fluent UI components and add tests

- Replace native HTML elements with Fluent UI components (Stack, DefaultButton, Text)
- Extract inline styles to SearchableDropdown.styles.ts
- Add comprehensive unit tests (14 test cases)
- Verify behavior consistency with AccountSwitcher tests

Co-authored-by: nishthaAhujaa <45535788+nishthaAhujaa@users.noreply.github.com>

* Optimize SearchableDropdown with useMemo for filteredItems

Co-authored-by: nishthaAhujaa <45535788+nishthaAhujaa@users.noreply.github.com>

* Fix text alignment to match original UI - ensure left alignment

- Add flexContainer.justifyContent: "flex-start" to button styles
- Add textAlign: "left" to button label, item styles, and empty message
- Restore original left-aligned appearance for placeholder and selected text

Co-authored-by: nishthaAhujaa <45535788+nishthaAhujaa@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nishthaAhujaa <45535788+nishthaAhujaa@users.noreply.github.com>

* Fix TypeScript implicit type errors in SearchableDropdown tests (#2355)

* Initial plan

* Fix TypeScript compilation errors in SearchableDropdown.test.tsx

Co-authored-by: nishthaAhujaa <45535788+nishthaAhujaa@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nishthaAhujaa <45535788+nishthaAhujaa@users.noreply.github.com>

* ui fixes minor

* format fix

* added search icon and updated the text

* removed callbacks

* added mocked playwright data

* fixed formatting

---------

Co-authored-by: nishthaAhujaa <nishtha17354@iiittd.ac.in>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Sakshi Gupta <sakshig@microsoft.com>
Co-authored-by: sakshigupta12feb <sakshigupta12feb1@gmail.com>
2026-03-12 20:35:59 +05:30
olprod
1dce9c1f37 Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2449149 (#2414)
* Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2445565

* Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2445655

* Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2446595

* Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2446660

* Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2448008

* Localized file check-in by OneLocBuild Task: Build definition ID 13114: Build ID 2449149

---------

Co-authored-by: sunghyunkang1111 <114709653+sunghyunkang1111@users.noreply.github.com>
2026-03-11 16:36:33 -05:00
sunghyunkang1111
f723b4746d Localizations batch 5 and import update (#2422)
* Locations import update

* Fix formatting

* Fix import paths
2026-03-11 13:51:19 -05:00
sunghyunkang1111
0cf0eca068 Add localization strings batch 4 (#2420)
* Add localization strings batch 4

* run prettier

* Update test snap

* Remove duplicates
2026-03-10 14:32:41 -05:00
122 changed files with 16144 additions and 2368 deletions

3
images/Pin.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.25 1.5C9.25 1.22386 9.47386 1 9.75 1H10.25C10.5261 1 10.75 1.22386 10.75 1.5V5.5L13 7.5V9H8.75V14L8 15L7.25 14V9H3V7.5L5.25 5.5V1.5C5.25 1.22386 5.47386 1 5.75 1H6.25C6.52614 1 6.75 1.22386 6.75 1.5V5.25H9.25V1.5Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 354 B

View File

@@ -1,5 +1,5 @@
import "i18next";
import Resources from "../Localization/en/Resources.json";
import Resources from "Localization/en/Resources.json";
declare module "i18next" {
interface CustomTypeOptions {

View File

@@ -0,0 +1,78 @@
import { IButtonStyles, IStackStyles, ITextStyles } from "@fluentui/react";
import * as React from "react";
export const getDropdownButtonStyles = (disabled: boolean): IButtonStyles => ({
root: {
width: "100%",
height: "32px",
padding: "0 28px 0 8px",
border: "1px solid #8a8886",
background: "#fff",
color: "#323130",
textAlign: "left",
cursor: disabled ? "not-allowed" : "pointer",
position: "relative",
},
flexContainer: {
justifyContent: "flex-start",
},
label: {
fontWeight: "normal",
fontSize: "14px",
textAlign: "left",
},
});
export const buttonLabelStyles: ITextStyles = {
root: {
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
display: "block",
textAlign: "left",
},
};
export const buttonWrapperStyles: React.CSSProperties = {
position: "relative",
width: "100%",
};
export const chevronStyles: React.CSSProperties = {
position: "absolute",
right: "8px",
top: "50%",
transform: "translateY(-50%)",
pointerEvents: "none",
fontSize: "12px",
};
export const calloutContentStyles: IStackStyles = {
root: {
display: "flex",
flexDirection: "column",
},
};
export const listContainerStyles: IStackStyles = {
root: {
maxHeight: "300px",
overflowY: "auto",
},
};
export const getItemStyles = (isSelected: boolean): React.CSSProperties => ({
padding: "8px 12px",
cursor: "pointer",
fontSize: "14px",
backgroundColor: isSelected ? "#e6e6e6" : "transparent",
textAlign: "left",
});
export const emptyMessageStyles: ITextStyles = {
root: {
padding: "8px 12px",
color: "#605e5c",
textAlign: "left",
},
};

View File

@@ -0,0 +1,200 @@
import { fireEvent, render, screen } from "@testing-library/react";
import "@testing-library/jest-dom";
import React from "react";
import { SearchableDropdown } from "./SearchableDropdown";
interface TestItem {
id: string;
name: string;
}
describe("SearchableDropdown", () => {
const mockItems: TestItem[] = [
{ id: "1", name: "Item One" },
{ id: "2", name: "Item Two" },
{ id: "3", name: "Item Three" },
];
const defaultProps = {
label: "Test Label",
items: mockItems,
selectedItem: null as TestItem | null,
onSelect: jest.fn(),
getKey: (item: TestItem) => item.id,
getDisplayText: (item: TestItem) => item.name,
placeholder: "Select an item",
filterPlaceholder: "Filter items",
className: "test-dropdown",
};
beforeEach(() => {
jest.clearAllMocks();
});
it("should render with label and placeholder", () => {
render(<SearchableDropdown {...defaultProps} />);
expect(screen.getByText("Test Label")).toBeInTheDocument();
expect(screen.getByText("Select an item")).toBeInTheDocument();
});
it("should display selected item", () => {
const propsWithSelection = {
...defaultProps,
selectedItem: mockItems[0],
};
render(<SearchableDropdown {...propsWithSelection} />);
expect(screen.getByText("Item One")).toBeInTheDocument();
});
it("should show 'No items found' when items array is empty", () => {
const propsWithEmptyItems = {
...defaultProps,
items: [] as TestItem[],
};
render(<SearchableDropdown {...propsWithEmptyItems} />);
expect(screen.getByText("No Test Labels Found")).toBeInTheDocument();
});
it("should open dropdown when button is clicked", () => {
render(<SearchableDropdown {...defaultProps} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
expect(screen.getByPlaceholderText("Filter items")).toBeInTheDocument();
});
it("should filter items based on search text", () => {
render(<SearchableDropdown {...defaultProps} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
const searchBox = screen.getByPlaceholderText("Filter items");
fireEvent.change(searchBox, { target: { value: "Two" } });
expect(screen.getByText("Item Two")).toBeInTheDocument();
expect(screen.queryByText("Item One")).not.toBeInTheDocument();
expect(screen.queryByText("Item Three")).not.toBeInTheDocument();
});
it("should call onSelect when an item is clicked", () => {
const onSelectMock = jest.fn();
const propsWithMock = {
...defaultProps,
onSelect: onSelectMock,
};
render(<SearchableDropdown {...propsWithMock} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
const item = screen.getByText("Item Two");
fireEvent.click(item);
expect(onSelectMock).toHaveBeenCalledWith(mockItems[1]);
});
it("should close dropdown after selecting an item", () => {
render(<SearchableDropdown {...defaultProps} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
expect(screen.getByPlaceholderText("Filter items")).toBeInTheDocument();
const item = screen.getByText("Item One");
fireEvent.click(item);
expect(screen.queryByPlaceholderText("Filter items")).not.toBeInTheDocument();
});
it("should disable button when disabled prop is true", () => {
const propsWithDisabled = {
...defaultProps,
disabled: true,
};
render(<SearchableDropdown {...propsWithDisabled} />);
const button = screen.getByRole("button");
expect(button).toBeDisabled();
});
it("should not open dropdown when disabled", () => {
const propsWithDisabled = {
...defaultProps,
disabled: true,
};
render(<SearchableDropdown {...propsWithDisabled} />);
const button = screen.getByRole("button");
fireEvent.click(button);
expect(screen.queryByPlaceholderText("Filter items")).not.toBeInTheDocument();
});
it("should show 'No items found' when search yields no results", () => {
render(<SearchableDropdown {...defaultProps} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
const searchBox = screen.getByPlaceholderText("Filter items");
fireEvent.change(searchBox, { target: { value: "Nonexistent" } });
expect(screen.getByText("No items found")).toBeInTheDocument();
});
it("should handle case-insensitive filtering", () => {
render(<SearchableDropdown {...defaultProps} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
const searchBox = screen.getByPlaceholderText("Filter items");
fireEvent.change(searchBox, { target: { value: "two" } });
expect(screen.getByText("Item Two")).toBeInTheDocument();
expect(screen.queryByText("Item One")).not.toBeInTheDocument();
});
it("should clear filter text when dropdown is closed and reopened", () => {
render(<SearchableDropdown {...defaultProps} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
const searchBox = screen.getByPlaceholderText("Filter items");
fireEvent.change(searchBox, { target: { value: "Two" } });
// Close dropdown by selecting an item
const item = screen.getByText("Item Two");
fireEvent.click(item);
// Reopen dropdown
fireEvent.click(button);
// Filter text should be cleared
const reopenedSearchBox = screen.getByPlaceholderText("Filter items");
expect(reopenedSearchBox).toHaveValue("");
});
it("should use custom placeholder text", () => {
const propsWithCustomPlaceholder = {
...defaultProps,
placeholder: "Choose an option",
};
render(<SearchableDropdown {...propsWithCustomPlaceholder} />);
expect(screen.getByText("Choose an option")).toBeInTheDocument();
});
it("should use custom filter placeholder text", () => {
const propsWithCustomFilterPlaceholder = {
...defaultProps,
filterPlaceholder: "Search here",
};
render(<SearchableDropdown {...propsWithCustomFilterPlaceholder} />);
const button = screen.getByText("Select an item");
fireEvent.click(button);
expect(screen.getByPlaceholderText("Search here")).toBeInTheDocument();
});
});

View File

@@ -0,0 +1,155 @@
import {
Callout,
DefaultButton,
DirectionalHint,
Icon,
ISearchBoxStyles,
Label,
SearchBox,
Stack,
Text,
} from "@fluentui/react";
import * as React from "react";
import { useMemo, useRef, useState } from "react";
import {
buttonLabelStyles,
buttonWrapperStyles,
calloutContentStyles,
chevronStyles,
emptyMessageStyles,
getDropdownButtonStyles,
getItemStyles,
listContainerStyles,
} from "./SearchableDropdown.styles";
interface SearchableDropdownProps<T> {
label: string;
items: T[];
selectedItem: T | null;
onSelect: (item: T) => void;
getKey: (item: T) => string;
getDisplayText: (item: T) => string;
placeholder?: string;
filterPlaceholder?: string;
className?: string;
disabled?: boolean;
onDismiss?: () => void;
searchBoxStyles?: Partial<ISearchBoxStyles>;
}
export const SearchableDropdown = <T,>({
label,
items,
selectedItem,
onSelect,
getKey,
getDisplayText,
placeholder = "Select an item",
filterPlaceholder = "Filter items",
className,
disabled = false,
onDismiss,
searchBoxStyles: customSearchBoxStyles,
}: SearchableDropdownProps<T>): React.ReactElement => {
const [isOpen, setIsOpen] = useState(false);
const [filterText, setFilterText] = useState("");
const buttonRef = useRef<HTMLDivElement>(null);
const closeDropdown = () => {
setIsOpen(false);
setFilterText("");
};
const filteredItems = useMemo(
() => items?.filter((item) => getDisplayText(item).toLowerCase().includes(filterText.toLowerCase())),
[items, filterText, getDisplayText],
);
const handleDismiss = () => {
closeDropdown();
onDismiss?.();
};
const handleButtonClick = () => {
if (disabled) {
return;
}
setIsOpen(!isOpen);
};
const handleSelect = (item: T) => {
onSelect(item);
closeDropdown();
};
const buttonLabel = selectedItem
? getDisplayText(selectedItem)
: items?.length === 0
? `No ${label}s Found`
: placeholder;
const buttonId = `${className}-button`;
const buttonStyles = getDropdownButtonStyles(disabled);
return (
<Stack>
<Label htmlFor={buttonId}>{label}</Label>
<div ref={buttonRef} style={buttonWrapperStyles}>
<DefaultButton
id={buttonId}
className={className}
onClick={handleButtonClick}
styles={buttonStyles}
disabled={disabled}
>
<Text styles={buttonLabelStyles}>{buttonLabel}</Text>
</DefaultButton>
<Icon iconName="ChevronDown" style={chevronStyles} />
</div>
{isOpen && (
<Callout
target={buttonRef.current}
onDismiss={handleDismiss}
directionalHint={DirectionalHint.bottomLeftEdge}
isBeakVisible={false}
gapSpace={0}
setInitialFocus
>
<Stack styles={calloutContentStyles} style={{ width: buttonRef.current?.offsetWidth || 300 }}>
<SearchBox
placeholder={filterPlaceholder}
value={filterText}
onChange={(_, newValue) => setFilterText(newValue || "")}
styles={customSearchBoxStyles}
showIcon={true}
/>
<Stack styles={listContainerStyles}>
{filteredItems && filteredItems.length > 0 ? (
filteredItems.map((item) => {
const key = getKey(item);
const isSelected = selectedItem ? getKey(selectedItem) === key : false;
return (
<div
key={key}
onClick={() => handleSelect(item)}
style={getItemStyles(isSelected)}
onMouseEnter={(e) => (e.currentTarget.style.backgroundColor = "#f3f2f1")}
onMouseLeave={(e) =>
(e.currentTarget.style.backgroundColor = isSelected ? "#e6e6e6" : "transparent")
}
>
<Text>{getDisplayText(item)}</Text>
</div>
);
})
) : (
<Text styles={emptyMessageStyles}>No items found</Text>
)}
</Stack>
</Stack>
</Callout>
)}
</Stack>
);
};

View File

@@ -1,5 +1,6 @@
import { ContainerResponse } from "@azure/cosmos";
import { Queries } from "Common/Constants";
import * as Logger from "Common/Logger";
import { CosmosDbArtifactType } from "Contracts/FabricMessagesContract";
import { isFabric, isFabricMirroredKey } from "Platform/Fabric/FabricUtil";
import { AuthType } from "../../AuthType";
@@ -61,7 +62,14 @@ export async function readCollections(databaseId: string): Promise<DataModels.Co
return await readCollectionsWithARM(databaseId);
}
Logger.logInfo(`readCollections: calling fetchAll for database ${databaseId}`, "readCollections");
const fetchAllStart = Date.now();
const sdkResponse = await client().database(databaseId).containers.readAll().fetchAll();
Logger.logInfo(
`readCollections: fetchAll completed for database ${databaseId}, count=${sdkResponse.resources
?.length}, durationMs=${Date.now() - fetchAllStart}`,
"readCollections",
);
return sdkResponse.resources as DataModels.Collection[];
} catch (error) {
handleError(error, "ReadCollections", `Error while querying containers for database ${databaseId}`);

View File

@@ -185,9 +185,10 @@ describe("CommandBar Utils", () => {
it("should respect disabled state when provided", () => {
const buttons = getCommandBarButtons(mockExplorer, false);
buttons.forEach((button) => {
expect(button.disabled).toBe(false);
});
// Theme toggle (index 2) is disabled in Portal mode, others are not
const expectedDisabled = buttons.map((_, index) => index === 2);
const actualDisabled = buttons.map((button) => button.disabled);
expect(actualDisabled).toEqual(expectedDisabled);
});
it("should return CommandButtonComponentProps with all required properties", () => {

View File

@@ -14,6 +14,7 @@ import { CopyJobCommandBarBtnType } from "../Types/CopyJobTypes";
function getCopyJobBtns(explorer: Explorer, isDarkMode: boolean): CopyJobCommandBarBtnType[] {
const monitorCopyJobsRef = MonitorCopyJobsRefState((state) => state.ref);
const isPortal = configContext.platform === Platform.Portal;
const buttons: CopyJobCommandBarBtnType[] = [
{
key: "createCopyJob",
@@ -33,8 +34,13 @@ function getCopyJobBtns(explorer: Explorer, isDarkMode: boolean): CopyJobCommand
key: "themeToggle",
iconSrc: isDarkMode ? SunIcon : MoonIcon,
label: isDarkMode ? "Light Theme" : "Dark Theme",
ariaLabel: isDarkMode ? "Switch to Light Theme" : "Switch to Dark Theme",
onClick: () => useThemeStore.getState().toggleTheme(),
ariaLabel: isPortal
? "Dark Mode is managed in Azure Portal Settings"
: isDarkMode
? "Switch to Light Theme"
: "Switch to Dark Theme",
disabled: isPortal,
onClick: isPortal ? () => {} : () => useThemeStore.getState().toggleTheme(),
},
];

View File

@@ -7,8 +7,7 @@ import {
AddGlobalSecondaryIndexPanelProps,
} from "Explorer/Panes/AddGlobalSecondaryIndexPanel/AddGlobalSecondaryIndexPanel";
import { useDatabases } from "Explorer/useDatabases";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { isFabric, isFabricNative, openRestoreContainerDialog } from "Platform/Fabric/FabricUtil";
import { Action } from "Shared/Telemetry/TelemetryConstants";
import { traceOpen } from "Shared/Telemetry/TelemetryProcessor";
@@ -25,6 +24,7 @@ import DeleteSprocIcon from "../../images/DeleteSproc.svg";
import DeleteTriggerIcon from "../../images/DeleteTrigger.svg";
import DeleteUDFIcon from "../../images/DeleteUDF.svg";
import HostedTerminalIcon from "../../images/Hosted-Terminal.svg";
import PinIcon from "../../images/Pin.svg";
import * as ViewModels from "../Contracts/ViewModels";
import { extractFeatures } from "../Platform/Hosted/extractFeatures";
import { userContext } from "../UserContext";
@@ -54,8 +54,14 @@ export const createDatabaseContextMenu = (container: Explorer, databaseId: strin
if (isFabric() && userContext.fabricContext?.isReadOnly) {
return undefined;
}
const isPinned = useDatabases.getState().isPinned(databaseId);
const items: TreeNodeMenuItem[] = [
{
iconSrc: PinIcon,
onClick: () => useDatabases.getState().togglePinDatabase(databaseId),
label: isPinned ? "Unpin from top" : "Pin to top",
},
{
iconSrc: AddCollectionIcon,
onClick: () => container.onNewCollectionClicked({ databaseId }),
@@ -78,13 +84,13 @@ export const createDatabaseContextMenu = (container: Explorer, databaseId: strin
items.push({
iconSrc: DeleteDatabaseIcon,
onClick: (lastFocusedElement?: React.RefObject<HTMLElement>) => {
(useSidePanel.getState().getRef = lastFocusedElement),
useSidePanel
.getState()
.openSidePanel(
t(Keys.contextMenu.deleteDatabase, { databaseName: getDatabaseName() }),
<DeleteDatabaseConfirmationPanel refreshDatabases={() => container.refreshAllDatabases()} />,
);
useSidePanel.getState().getRef = lastFocusedElement;
useSidePanel
.getState()
.openSidePanel(
"Delete " + getDatabaseName(),
<DeleteDatabaseConfirmationPanel refreshDatabases={() => container.refreshAllDatabases()} />,
);
},
label: t(Keys.contextMenu.deleteDatabase, { databaseName: getDatabaseName() }),
styleClass: "deleteDatabaseMenuItem",
@@ -177,13 +183,13 @@ export const createCollectionContextMenuButton = (
iconSrc: DeleteCollectionIcon,
onClick: (lastFocusedElement?: React.RefObject<HTMLElement>) => {
useSelectedNode.getState().setSelectedNode(selectedCollection);
(useSidePanel.getState().getRef = lastFocusedElement),
useSidePanel
.getState()
.openSidePanel(
t(Keys.contextMenu.deleteContainer, { containerName: getCollectionName() }),
<DeleteCollectionConfirmationPane refreshDatabases={() => container.refreshAllDatabases()} />,
);
useSidePanel.getState().getRef = lastFocusedElement;
useSidePanel
.getState()
.openSidePanel(
"Delete " + getCollectionName(),
<DeleteCollectionConfirmationPane refreshDatabases={() => container.refreshAllDatabases()} />,
);
},
label: t(Keys.contextMenu.deleteContainer, { containerName: getCollectionName() }),
styleClass: "deleteCollectionMenuItem",

View File

@@ -58,6 +58,11 @@ export interface CommandButtonComponentProps {
*/
tooltipText?: string;
/**
* Rich JSX content for tooltip (used instead of tooltipText when provided)
*/
tooltipContent?: React.ReactNode;
/**
* Custom styles to apply to the button using Fluent UI theme tokens
*/

View File

@@ -17,6 +17,7 @@ import {
} from "@fluentui/react";
import React, { FC, useEffect } from "react";
import create, { UseStore } from "zustand";
import { Keys, t } from "Localization";
export interface DialogState {
visible: boolean;
@@ -88,7 +89,7 @@ export const useDialog: UseStore<DialogState> = create((set, get) => ({
isModal: true,
title,
subText,
primaryButtonText: "Close",
primaryButtonText: t(Keys.common.close),
secondaryButtonText: undefined,
onPrimaryButtonClick: () => {
get().closeDialog();

View File

@@ -44,6 +44,7 @@ import { useCommandBar } from "../../Menus/CommandBar/CommandBarComponentAdapter
import { SettingsTabV2 } from "../../Tabs/SettingsTabV2";
import "./SettingsComponent.less";
import { mongoIndexingPolicyAADError } from "./SettingsRenderUtils";
import { Keys, t } from "Localization";
import {
ConflictResolutionComponent,
ConflictResolutionComponentProps,
@@ -689,12 +690,12 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
private onDataMaskingContentChange = (newDataMasking: DataModels.DataMaskingPolicy): void => {
const validationErrors = [];
if (newDataMasking.includedPaths === undefined || newDataMasking.includedPaths === null) {
validationErrors.push("includedPaths is required");
validationErrors.push(t(Keys.controls.settings.dataMasking.includedPathsRequired));
} else if (!Array.isArray(newDataMasking.includedPaths)) {
validationErrors.push("includedPaths must be an array");
validationErrors.push(t(Keys.controls.settings.dataMasking.includedPathsMustBeArray));
}
if (newDataMasking.excludedPaths !== undefined && !Array.isArray(newDataMasking.excludedPaths)) {
validationErrors.push("excludedPaths must be an array if provided");
validationErrors.push(t(Keys.controls.settings.dataMasking.excludedPathsMustBeArray));
}
this.setState({
@@ -896,7 +897,7 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
const buttons: CommandButtonComponentProps[] = [];
const isExecuting = this.props.settingsTab.isExecuting();
if (this.saveSettingsButton.isVisible()) {
const label = "Save";
const label = t(Keys.common.save);
buttons.push({
iconSrc: SaveIcon,
iconAlt: label,
@@ -909,7 +910,7 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
}
if (this.discardSettingsChangesButton.isVisible()) {
const label = "Discard";
const label = t(Keys.common.discard);
buttons.push({
iconSrc: DiscardIcon,
iconAlt: label,
@@ -934,9 +935,10 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
const numberOfRegions = userContext.databaseAccount?.properties.locations?.length || 1;
const throughputDelta = (newThroughput - this.offer.autoscaleMaxThroughput) * numberOfRegions;
if (throughputCap && throughputCap !== -1 && throughputCap - this.totalThroughputUsed < throughputDelta) {
throughputError = `Your account is currently configured with a total throughput limit of ${throughputCap} RU/s. This update isn't possible because it would increase the total throughput to ${
this.totalThroughputUsed + throughputDelta
} RU/s. Change total throughput limit in cost management.`;
throughputError = t(Keys.controls.settings.throughput.throughputCapError, {
throughputCap: String(throughputCap),
newTotalThroughput: String(this.totalThroughputUsed + throughputDelta),
});
}
this.setState({ autoPilotThroughput: newThroughput, throughputError });
};
@@ -947,9 +949,10 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
const numberOfRegions = userContext.databaseAccount?.properties.locations?.length || 1;
const throughputDelta = (newThroughput - this.offer.manualThroughput) * numberOfRegions;
if (throughputCap && throughputCap !== -1 && throughputCap - this.totalThroughputUsed < throughputDelta) {
throughputError = `Your account is currently configured with a total throughput limit of ${throughputCap} RU/s. This update isn't possible because it would increase the total throughput to ${
this.totalThroughputUsed + throughputDelta
} RU/s. Change total throughput limit in cost management.`;
throughputError = t(Keys.controls.settings.throughput.throughputCapError, {
throughputCap: String(throughputCap),
newTotalThroughput: String(this.totalThroughputUsed + throughputDelta),
});
}
this.setState({ throughput: newThroughput, throughputError });
};
@@ -1560,7 +1563,7 @@ export class SettingsComponent extends React.Component<SettingsComponentProps, S
}
>
{this.shouldShowKeyspaceSharedThroughputMessage() && (
<div>This table shared throughput is configured at the keyspace</div>
<div>{t(Keys.controls.settings.scale.keyspaceSharedThroughput)}</div>
)}
<div

View File

@@ -22,6 +22,7 @@ import {
Stack,
Text,
} from "@fluentui/react";
import { Keys, t } from "Localization";
import * as React from "react";
import { Urls } from "../../../Common/Constants";
import { StyleConstants } from "../../../Common/StyleConstants";
@@ -338,10 +339,12 @@ export const getEstimatedSpendingElement = (
const ruRange: string = isAutoscale ? throughput / 10 + " RU/s - " : "";
return (
<Stack>
<Text style={{ fontWeight: 600, color: "var(--colorNeutralForeground1)" }}>Cost estimate*</Text>
<Text style={{ fontWeight: 600, color: "var(--colorNeutralForeground1)" }}>
{t(Keys.controls.settings.costEstimate.title)}
</Text>
{costElement}
<Text style={{ fontWeight: 600, marginTop: 15, color: "var(--colorNeutralForeground1)" }}>
How we calculate this
{t(Keys.controls.settings.costEstimate.howWeCalculate)}
</Text>
<Stack id="throughputSpendElement" style={{ marginTop: 5 }}>
<span>
@@ -353,7 +356,8 @@ export const getEstimatedSpendingElement = (
</span>
<span>
{priceBreakdown.currencySign}
{priceBreakdown.pricePerRu}/RU
{priceBreakdown.pricePerRu}
{t(Keys.controls.settings.costEstimate.perRu)}
</span>
</Stack>
<Text style={{ marginTop: 15, color: "var(--colorNeutralForeground1)" }}>
@@ -365,18 +369,16 @@ export const getEstimatedSpendingElement = (
export const manualToAutoscaleDisclaimerElement: JSX.Element = (
<Text styles={infoAndToolTipTextStyle} id="manualToAutoscaleDisclaimerElement">
The starting autoscale max RU/s will be determined by the system, based on the current manual throughput settings
and storage of your resource. After autoscale has been enabled, you can change the max RU/s.{" "}
<Link href={Urls.autoscaleMigration}>Learn more</Link>
{t(Keys.controls.settings.throughput.manualToAutoscaleDisclaimer)}{" "}
<Link href={Urls.autoscaleMigration}>{t(Keys.common.learnMore)}</Link>
</Text>
);
export const ttlWarning: JSX.Element = (
<Text styles={infoAndToolTipTextStyle}>
The system will automatically delete items based on the TTL value (in seconds) you provide, without needing a delete
operation explicitly issued by a client application. For more information see,{" "}
{t(Keys.controls.settings.throughput.ttlWarningText)}{" "}
<Link target="_blank" href="https://aka.ms/cosmos-db-ttl">
Time to Live (TTL) in Azure Cosmos DB
{t(Keys.controls.settings.throughput.ttlWarningLinkText)}
</Link>
.
</Text>
@@ -384,29 +386,28 @@ export const ttlWarning: JSX.Element = (
export const unsavedEditorWarningMessage = (editor: editorType): JSX.Element => (
<Text styles={infoAndToolTipTextStyle}>
You have not saved the latest changes made to your{" "}
{t(Keys.controls.settings.throughput.unsavedEditorWarningPrefix)}{" "}
{editor === "indexPolicy"
? "indexing policy"
? t(Keys.controls.settings.throughput.unsavedIndexingPolicy)
: editor === "dataMasking"
? "data masking policy"
: "computed properties"}
. Please click save to confirm the changes.
? t(Keys.controls.settings.throughput.unsavedDataMaskingPolicy)
: t(Keys.controls.settings.throughput.unsavedComputedProperties)}
{t(Keys.controls.settings.throughput.unsavedEditorWarningSuffix)}
</Text>
);
export const updateThroughputDelayedApplyWarningMessage: JSX.Element = (
<Text styles={infoAndToolTipTextStyle} id="updateThroughputDelayedApplyWarningMessage">
You are about to request an increase in throughput beyond the pre-allocated capacity. This operation will take some
time to complete.
{t(Keys.controls.settings.throughput.updateDelayedApplyWarning)}
</Text>
);
export const getUpdateThroughputBeyondInstantLimitMessage = (instantMaximumThroughput: number): JSX.Element => {
return (
<Text id="updateThroughputDelayedApplyWarningMessage">
Scaling up will take 4-6 hours as it exceeds what Azure Cosmos DB can instantly support currently based on your
number of physical partitions. You can increase your throughput to {instantMaximumThroughput} instantly or proceed
with this value and wait until the scale-up is completed.
{t(Keys.controls.settings.throughput.scalingUpDelayMessage, {
instantMaximumThroughput: String(instantMaximumThroughput),
})}
</Text>
);
};
@@ -418,22 +419,26 @@ export const getUpdateThroughputBeyondSupportLimitMessage = (
return (
<>
<Text styles={infoAndToolTipTextStyle} id="updateThroughputDelayedApplyWarningMessage">
Your request to increase throughput exceeds the pre-allocated capacity which may take longer than expected.
There are three options you can choose from to proceed:
{t(Keys.controls.settings.throughput.exceedPreAllocatedMessage)}
</Text>
<ol style={{ fontSize: 14, color: "var(--colorNeutralForeground1)", marginTop: "5px" }}>
<li>You can instantly scale up to {instantMaximumThroughput} RU/s.</li>
<li>
{t(Keys.controls.settings.throughput.instantScaleOption, {
instantMaximumThroughput: String(instantMaximumThroughput),
})}
</li>
{instantMaximumThroughput < maximumThroughput && (
<li>You can asynchronously scale up to any value under {maximumThroughput} RU/s in 4-6 hours.</li>
<li>
{t(Keys.controls.settings.throughput.asyncScaleOption, { maximumThroughput: String(maximumThroughput) })}
</li>
)}
<li>
Your current quota max is {maximumThroughput} RU/s. To go over this limit, you must request a quota increase
and the Azure Cosmos DB team will review.
{t(Keys.controls.settings.throughput.quotaMaxOption, { maximumThroughput: String(maximumThroughput) })}
<Link
href="https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/create-support-request-quota-increase"
target="_blank"
>
Learn more
{t(Keys.common.learnMore)}
</Link>
</li>
</ol>
@@ -444,23 +449,19 @@ export const getUpdateThroughputBeyondSupportLimitMessage = (
export const getUpdateThroughputBelowMinimumMessage = (minimum: number): JSX.Element => {
return (
<Text styles={infoAndToolTipTextStyle}>
You are not able to lower throughput below your current minimum of {minimum} RU/s. For more information on this
limit, please refer to our service quote documentation.
{t(Keys.controls.settings.throughput.belowMinimumMessage, { minimum: String(minimum) })}
<Link
href="https://learn.microsoft.com/en-us/azure/cosmos-db/concepts-limits#minimum-throughput-limits"
target="_blank"
>
Learn more
{t(Keys.common.learnMore)}
</Link>
</Text>
);
};
export const saveThroughputWarningMessage: JSX.Element = (
<Text>
Your bill will be affected as you update your throughput settings. Please review the updated cost estimate below
before saving your changes
</Text>
<Text>{t(Keys.controls.settings.throughput.saveThroughputWarning)}</Text>
);
const getCurrentThroughput = (
@@ -472,23 +473,29 @@ const getCurrentThroughput = (
if (targetThroughput) {
if (throughput) {
return isAutoscale
? `, Current autoscale throughput: ${Math.round(
? `, ${t(Keys.controls.settings.throughput.currentAutoscaleThroughput)} ${Math.round(
throughput / 10,
)} - ${throughput} ${throughputUnit}, Target autoscale throughput: ${Math.round(
targetThroughput / 10,
)} - ${targetThroughput} ${throughputUnit}`
: `, Current manual throughput: ${throughput} ${throughputUnit}, Target manual throughput: ${targetThroughput}`;
)} - ${throughput} ${throughputUnit}, ${t(
Keys.controls.settings.throughput.targetAutoscaleThroughput,
)} ${Math.round(targetThroughput / 10)} - ${targetThroughput} ${throughputUnit}`
: `, ${t(Keys.controls.settings.throughput.currentManualThroughput)} ${throughput} ${throughputUnit}, ${t(
Keys.controls.settings.throughput.targetManualThroughput,
)} ${targetThroughput}`;
} else {
return isAutoscale
? `, Target autoscale throughput: ${Math.round(targetThroughput / 10)} - ${targetThroughput} ${throughputUnit}`
: `, Target manual throughput: ${targetThroughput} ${throughputUnit}`;
? `, ${t(Keys.controls.settings.throughput.targetAutoscaleThroughput)} ${Math.round(
targetThroughput / 10,
)} - ${targetThroughput} ${throughputUnit}`
: `, ${t(Keys.controls.settings.throughput.targetManualThroughput)} ${targetThroughput} ${throughputUnit}`;
}
}
if (!targetThroughput && throughput) {
return isAutoscale
? `, Current autoscale throughput: ${Math.round(throughput / 10)} - ${throughput} ${throughputUnit}`
: `, Current manual throughput: ${throughput} ${throughputUnit}`;
? `, ${t(Keys.controls.settings.throughput.currentAutoscaleThroughput)} ${Math.round(
throughput / 10,
)} - ${throughput} ${throughputUnit}`
: `, ${t(Keys.controls.settings.throughput.currentManualThroughput)} ${throughput} ${throughputUnit}`;
}
return "";
@@ -503,10 +510,10 @@ export const getThroughputApplyDelayedMessage = (
requestedThroughput: number,
): JSX.Element => (
<Text styles={infoAndToolTipTextStyle}>
The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days
to complete. View the latest status in Notifications.
{t(Keys.controls.settings.throughput.applyDelayedMessage)}
<br />
Database: {databaseName}, Container: {collectionName}{" "}
{t(Keys.controls.settings.throughput.databaseLabel)} {databaseName},{" "}
{t(Keys.controls.settings.throughput.containerLabel)} {collectionName}{" "}
{getCurrentThroughput(isAutoscale, throughput, throughputUnit, requestedThroughput)}
</Text>
);
@@ -519,9 +526,13 @@ export const getThroughputApplyShortDelayMessage = (
collectionName: string,
): JSX.Element => (
<Text styles={infoAndToolTipTextStyle} id="throughputApplyShortDelayMessage">
A request to increase the throughput is currently in progress. This operation will take some time to complete.
{t(Keys.controls.settings.throughput.applyShortDelayMessage)}
<br />
{collectionName ? `Database: ${databaseName}, Container: ${collectionName} ` : `Database: ${databaseName} `}
{collectionName
? `${t(Keys.controls.settings.throughput.databaseLabel)} ${databaseName}, ${t(
Keys.controls.settings.throughput.containerLabel,
)} ${collectionName} `
: `${t(Keys.controls.settings.throughput.databaseLabel)} ${databaseName} `}
{getCurrentThroughput(isAutoscale, throughput, throughputUnit)}
</Text>
);
@@ -535,10 +546,13 @@ export const getThroughputApplyLongDelayMessage = (
requestedThroughput: number,
): JSX.Element => (
<Text styles={infoAndToolTipTextStyle} id="throughputApplyLongDelayMessage">
A request to increase the throughput is currently in progress. This operation will take 1-3 business days to
complete. View the latest status in Notifications.
{t(Keys.controls.settings.throughput.applyLongDelayMessage)}
<br />
{collectionName ? `Database: ${databaseName}, Container: ${collectionName} ` : `Database: ${databaseName} `}
{collectionName
? `${t(Keys.controls.settings.throughput.databaseLabel)} ${databaseName}, ${t(
Keys.controls.settings.throughput.containerLabel,
)} ${collectionName} `
: `${t(Keys.controls.settings.throughput.databaseLabel)} ${databaseName} `}
{getCurrentThroughput(isAutoscale, throughput, throughputUnit, requestedThroughput)}
</Text>
);
@@ -547,63 +561,49 @@ export const getToolTipContainer = (content: string | JSX.Element): JSX.Element
content ? <Text styles={infoAndToolTipTextStyle}>{content}</Text> : undefined;
export const conflictResolutionLwwTooltip: JSX.Element = (
<Text styles={infoAndToolTipTextStyle}>
Gets or sets the name of a integer property in your documents which is used for the Last Write Wins (LWW) based
conflict resolution scheme. By default, the system uses the system defined timestamp property, _ts to decide the
winner for the conflicting versions of the document. Specify your own integer property if you want to override the
default timestamp based conflict resolution.
</Text>
<Text styles={infoAndToolTipTextStyle}>{t(Keys.controls.settings.conflictResolution.lwwTooltip)}</Text>
);
export const conflictResolutionCustomToolTip: JSX.Element = (
<Text styles={infoAndToolTipTextStyle}>
Gets or sets the name of a stored procedure (aka merge procedure) for resolving the conflicts. You can write
application defined logic to determine the winner of the conflicting versions of a document. The stored procedure
will get executed transactionally, exactly once, on the server side. If you do not provide a stored procedure, the
conflicts will be populated in the
{t(Keys.controls.settings.conflictResolution.customTooltip)}
<Link className="linkDarkBackground" href="https://aka.ms/dataexplorerconflics" target="_blank">
{` conflicts feed`}
{t(Keys.controls.settings.conflictResolution.customTooltipConflictsFeed)}
</Link>
. You can update/re-register the stored procedure at any time.
{t(Keys.controls.settings.conflictResolution.customTooltipSuffix)}
</Text>
);
export const changeFeedPolicyToolTip: JSX.Element = (
<Text styles={infoAndToolTipTextStyle}>
Enable change feed log retention policy to retain last 10 minutes of history for items in the container by default.
To support this, the request unit (RU) charge for this container will be multiplied by a factor of two for writes.
Reads are unaffected.
</Text>
<Text styles={infoAndToolTipTextStyle}>{t(Keys.controls.settings.changeFeed.tooltip)}</Text>
);
export const mongoIndexingPolicyDisclaimer: JSX.Element = (
<Text style={{ color: "var(--colorNeutralForeground1)" }}>
For queries that filter on multiple properties, create multiple single field indexes instead of a compound index.
{t(Keys.controls.settings.mongoIndexing.disclaimer)}
<Link
href="https://docs.microsoft.com/azure/cosmos-db/mongodb-indexing#index-types"
target="_blank"
style={{ color: "var(--colorBrandForeground1)" }}
>
{` Compound indexes `}
{t(Keys.controls.settings.mongoIndexing.disclaimerCompoundIndexesLink)}
</Link>
are only used for sorting query results. If you need to add a compound index, you can create one using the Mongo
shell.
{t(Keys.controls.settings.mongoIndexing.disclaimerSuffix)}
</Text>
);
export const mongoCompoundIndexNotSupportedMessage: JSX.Element = (
<Text style={{ color: "var(--colorNeutralForeground1)" }}>
Collections with compound indexes are not yet supported in the indexing editor. To modify indexing policy for this
collection, use the Mongo Shell.
{t(Keys.controls.settings.mongoIndexing.compoundNotSupported)}
</Text>
);
export const mongoIndexingPolicyAADError: JSX.Element = (
<MessageBar messageBarType={MessageBarType.error}>
<Text>
To use the indexing policy editor, please login to the
{t(Keys.controls.settings.mongoIndexing.aadError)}
<Link target="_blank" href="https://portal.azure.com">
{"azure portal."}
{t(Keys.controls.settings.mongoIndexing.aadErrorLink)}
</Link>
</Text>
</MessageBar>
@@ -611,7 +611,7 @@ export const mongoIndexingPolicyAADError: JSX.Element = (
export const mongoIndexTransformationRefreshingMessage: JSX.Element = (
<Stack horizontal {...mongoWarningStackProps}>
<Text styles={infoAndToolTipTextStyle}>Refreshing index transformation progress</Text>
<Text styles={infoAndToolTipTextStyle}>{t(Keys.controls.settings.mongoIndexing.refreshingProgress)}</Text>
<Spinner size={SpinnerSize.small} />
</Stack>
);
@@ -623,15 +623,18 @@ export const renderMongoIndexTransformationRefreshMessage = (
if (progress === 0) {
return (
<Text styles={infoAndToolTipTextStyle}>
{"You can make more indexing changes once the current index transformation is complete. "}
<Link onClick={performRefresh}>{"Refresh to check if it has completed."}</Link>
{t(Keys.controls.settings.mongoIndexing.canMakeMoreChangesZero)}
<Link onClick={performRefresh}>{t(Keys.controls.settings.mongoIndexing.refreshToCheck)}</Link>
</Text>
);
} else {
return (
<Text styles={infoAndToolTipTextStyle}>
{`You can make more indexing changes once the current index transformation has completed. It is ${progress}% complete. `}
<Link onClick={performRefresh}>{"Refresh to check the progress."}</Link>
{`${t(Keys.controls.settings.mongoIndexing.canMakeMoreChangesProgress).replace(
"{{progress}}",
String(progress),
)} `}
<Link onClick={performRefresh}>{t(Keys.controls.settings.mongoIndexing.refreshToCheckProgress)}</Link>
</Text>
);
}

View File

@@ -4,6 +4,7 @@ import { titleAndInputStackProps, unsavedEditorWarningMessage } from "Explorer/C
import { isDirty } from "Explorer/Controls/Settings/SettingsUtils";
import { loadMonaco } from "Explorer/LazyMonaco";
import { monacoTheme, useThemeStore } from "hooks/useTheme";
import { Keys, t } from "Localization";
import * as monaco from "monaco-editor";
import * as React from "react";
export interface ComputedPropertiesComponentProps {
@@ -107,7 +108,7 @@ export class ComputedPropertiesComponent extends React.Component<
this.computedPropertiesEditor = monaco.editor.create(this.computedPropertiesDiv.current, {
value: value,
language: "json",
ariaLabel: "Computed properties",
ariaLabel: t(Keys.controls.settings.computedProperties.ariaLabel),
theme: monacoTheme(),
});
if (this.computedPropertiesEditor) {
@@ -151,9 +152,9 @@ export class ComputedPropertiesComponent extends React.Component<
)}
<Text style={{ marginLeft: "30px", marginBottom: "10px", color: "var(--colorNeutralForeground1)" }}>
<Link target="_blank" href="https://aka.ms/computed-properties-preview/">
{"Learn more"} <FontIcon iconName="NavigateExternalInline" />
{t(Keys.common.learnMore)} <FontIcon iconName="NavigateExternalInline" />
</Link>
&#160; about how to define computed properties and how to use them.
&#160; {t(Keys.controls.settings.computedProperties.learnMorePrefix)}
</Text>
<div
className="settingsV2Editor"

View File

@@ -2,6 +2,7 @@ import { ChoiceGroup, IChoiceGroupOption, ITextFieldProps, Stack, TextField } fr
import * as React from "react";
import * as DataModels from "../../../../Contracts/DataModels";
import * as ViewModels from "../../../../Contracts/ViewModels";
import { Keys, t } from "Localization";
import {
conflictResolutionCustomToolTip,
conflictResolutionLwwTooltip,
@@ -32,9 +33,12 @@ export class ConflictResolutionComponent extends React.Component<ConflictResolut
private conflictResolutionChoiceGroupOptions: IChoiceGroupOption[] = [
{
key: DataModels.ConflictResolutionMode.LastWriterWins,
text: "Last Write Wins (default)",
text: t(Keys.controls.settings.conflictResolution.lwwDefault),
},
{
key: DataModels.ConflictResolutionMode.Custom,
text: t(Keys.controls.settings.conflictResolution.customMergeProcedure),
},
{ key: DataModels.ConflictResolutionMode.Custom, text: "Merge Procedure (custom)" },
];
componentDidMount(): void {
@@ -85,7 +89,7 @@ export class ConflictResolutionComponent extends React.Component<ConflictResolut
private getConflictResolutionModeComponent = (): JSX.Element => (
<ChoiceGroup
label="Mode"
label={t(Keys.controls.settings.conflictResolution.mode)}
selectedKey={this.props.conflictResolutionPolicyMode}
options={this.conflictResolutionChoiceGroupOptions}
onChange={this.onConflictResolutionPolicyModeChange}
@@ -103,7 +107,7 @@ export class ConflictResolutionComponent extends React.Component<ConflictResolut
private getConflictResolutionLWWComponent = (): JSX.Element => (
<TextField
id="conflictResolutionLwwTextField"
label={"Conflict Resolver Property"}
label={t(Keys.controls.settings.conflictResolution.conflictResolverProperty)}
onRenderLabel={this.onRenderLwwComponentTextField}
styles={{
fieldGroup: {
@@ -158,7 +162,7 @@ export class ConflictResolutionComponent extends React.Component<ConflictResolut
return (
<TextField
id="conflictResolutionCustomTextField"
label="Stored procedure"
label={t(Keys.controls.settings.conflictResolution.storedProcedure)}
onRenderLabel={this.onRenderCustomComponentTextField}
styles={{
fieldGroup: {

View File

@@ -7,6 +7,7 @@ import {
import { titleAndInputStackProps } from "Explorer/Controls/Settings/SettingsRenderUtils";
import { ContainerPolicyTabTypes, isDirty } from "Explorer/Controls/Settings/SettingsUtils";
import { VectorEmbeddingPoliciesComponent } from "Explorer/Controls/VectorSearch/VectorEmbeddingPoliciesComponent";
import { Keys, t } from "Localization";
import React from "react";
export interface ContainerPolicyComponentProps {
@@ -153,7 +154,7 @@ export const ContainerPolicyComponent: React.FC<ContainerPolicyComponentProps> =
<PivotItem
itemKey={ContainerPolicyTabTypes[ContainerPolicyTabTypes.VectorPolicyTab]}
style={{ marginTop: 20, color: "var(--colorNeutralForeground1)" }}
headerText="Vector Policy"
headerText={t(Keys.controls.settings.containerPolicy.vectorPolicy)}
>
<Stack {...titleAndInputStackProps} styles={{ root: { position: "relative", maxWidth: "400px" } }}>
{vectorEmbeddings && (
@@ -175,7 +176,7 @@ export const ContainerPolicyComponent: React.FC<ContainerPolicyComponentProps> =
<PivotItem
itemKey={ContainerPolicyTabTypes[ContainerPolicyTabTypes.FullTextPolicyTab]}
style={{ marginTop: 20, color: "var(--colorNeutralForeground1)" }}
headerText="Full Text Policy"
headerText={t(Keys.controls.settings.containerPolicy.fullTextPolicy)}
>
<Stack {...titleAndInputStackProps} styles={{ root: { position: "relative", maxWidth: "400px" } }}>
{fullTextSearchPolicy ? (
@@ -218,7 +219,7 @@ export const ContainerPolicyComponent: React.FC<ContainerPolicyComponentProps> =
});
}}
>
Create new full text search policy
{t(Keys.controls.settings.containerPolicy.createFullTextPolicy)}
</DefaultButton>
)}
</Stack>

View File

@@ -2,6 +2,7 @@ import { MessageBar, MessageBarType, Stack } from "@fluentui/react";
import * as monaco from "monaco-editor";
import * as React from "react";
import * as DataModels from "../../../../Contracts/DataModels";
import { Keys, t } from "Localization";
import { loadMonaco } from "../../../LazyMonaco";
import { titleAndInputStackProps, unsavedEditorWarningMessage } from "../SettingsRenderUtils";
import { isDirty as isContentDirty, isDataMaskingEnabled } from "../SettingsUtils";
@@ -89,7 +90,7 @@ export class DataMaskingComponent extends React.Component<DataMaskingComponentPr
value: value,
language: "json",
automaticLayout: true,
ariaLabel: "Data Masking Policy",
ariaLabel: t(Keys.controls.settings.dataMasking.ariaLabel),
fontSize: 13,
minimap: { enabled: false },
wordWrap: "off",
@@ -142,7 +143,7 @@ export class DataMaskingComponent extends React.Component<DataMaskingComponentPr
)}
{this.props.validationErrors.length > 0 && (
<MessageBar messageBarType={MessageBarType.error}>
Validation failed: {this.props.validationErrors.join(", ")}
{t(Keys.controls.settings.dataMasking.validationFailed)} {this.props.validationErrors.join(", ")}
</MessageBar>
)}
<div className="settingsV2Editor" tabIndex={0} ref={this.dataMaskingDiv}></div>

View File

@@ -2,6 +2,7 @@ import { FontIcon, Link, Stack, Text } from "@fluentui/react";
import Explorer from "Explorer/Explorer";
import React from "react";
import * as ViewModels from "../../../../Contracts/ViewModels";
import { Keys, t } from "Localization";
import { GlobalSecondaryIndexSourceComponent } from "./GlobalSecondaryIndexSourceComponent";
import { GlobalSecondaryIndexTargetComponent } from "./GlobalSecondaryIndexTargetComponent";
@@ -21,7 +22,9 @@ export const GlobalSecondaryIndexComponent: React.FC<GlobalSecondaryIndexCompone
<Stack tokens={{ childrenGap: 8 }} styles={{ root: { maxWidth: 600 } }}>
<Stack horizontal verticalAlign="center" wrap tokens={{ childrenGap: 8 }}>
{isSourceContainer && (
<Text styles={{ root: { fontWeight: 600 } }}>This container has the following indexes defined for it.</Text>
<Text styles={{ root: { fontWeight: 600 } }}>
{t(Keys.controls.settings.globalSecondaryIndex.indexesDefined)}
</Text>
)}
<Text>
<Link
@@ -31,7 +34,7 @@ export const GlobalSecondaryIndexComponent: React.FC<GlobalSecondaryIndexCompone
Learn more
<FontIcon iconName="NavigateExternalInline" style={{ marginLeft: "4px" }} />
</Link>{" "}
about how to define global secondary indexes and how to use them.
{t(Keys.controls.settings.globalSecondaryIndex.learnMoreSuffix)}
</Text>
</Stack>
{isSourceContainer && <GlobalSecondaryIndexSourceComponent collection={collection} explorer={explorer} />}

View File

@@ -9,6 +9,7 @@ import { useSidePanel } from "hooks/useSidePanel";
import * as monaco from "monaco-editor";
import React, { useEffect, useRef } from "react";
import * as ViewModels from "../../../../Contracts/ViewModels";
import { Keys, t } from "Localization";
export interface GlobalSecondaryIndexSourceComponentProps {
collection: ViewModels.Collection;
@@ -67,7 +68,7 @@ export const GlobalSecondaryIndexSourceComponent: React.FC<GlobalSecondaryIndexS
editorRef.current = monacoInstance.editor.create(editorContainerRef.current, {
value: jsonValue,
language: "json",
ariaLabel: "Global Secondary Index JSON",
ariaLabel: t(Keys.controls.settings.globalSecondaryIndex.jsonAriaLabel),
readOnly: true,
});
};
@@ -98,7 +99,7 @@ export const GlobalSecondaryIndexSourceComponent: React.FC<GlobalSecondaryIndexS
}}
/>
<PrimaryButton
text="Add index"
text={t(Keys.controls.settings.globalSecondaryIndex.addIndex)}
styles={{ root: { width: "fit-content", marginTop: 12 } }}
onClick={() =>
useSidePanel

View File

@@ -1,6 +1,7 @@
import { Stack, Text } from "@fluentui/react";
import * as React from "react";
import * as ViewModels from "../../../../Contracts/ViewModels";
import { Keys, t } from "Localization";
export interface GlobalSecondaryIndexTargetComponentProps {
collection: ViewModels.Collection;
@@ -25,17 +26,21 @@ export const GlobalSecondaryIndexTargetComponent: React.FC<GlobalSecondaryIndexT
return (
<Stack tokens={{ childrenGap: 15 }} styles={{ root: { maxWidth: 600 } }}>
<Text styles={textHeadingStyle}>Global Secondary Index Settings</Text>
<Text styles={textHeadingStyle}>{t(Keys.controls.settings.globalSecondaryIndex.settingsTitle)}</Text>
<Stack tokens={{ childrenGap: 5 }}>
<Text styles={{ root: { fontWeight: "600" } }}>Source container</Text>
<Text styles={{ root: { fontWeight: "600" } }}>
{t(Keys.controls.settings.globalSecondaryIndex.sourceContainer)}
</Text>
<Stack styles={valueBoxStyle}>
<Text>{globalSecondaryIndexDefinition?.sourceCollectionId}</Text>
</Stack>
</Stack>
<Stack tokens={{ childrenGap: 5 }}>
<Text styles={{ root: { fontWeight: "600" } }}>Global secondary index definition</Text>
<Text styles={{ root: { fontWeight: "600" } }}>
{t(Keys.controls.settings.globalSecondaryIndex.indexDefinition)}
</Text>
<Stack styles={valueBoxStyle}>
<Text>{globalSecondaryIndexDefinition?.definition}</Text>
</Stack>

View File

@@ -3,6 +3,7 @@ import { monacoTheme, useThemeStore } from "hooks/useTheme";
import * as monaco from "monaco-editor";
import * as React from "react";
import * as DataModels from "../../../../Contracts/DataModels";
import { Keys, t } from "Localization";
import { loadMonaco } from "../../../LazyMonaco";
import { titleAndInputStackProps, unsavedEditorWarningMessage } from "../SettingsRenderUtils";
import { isDirty, isIndexTransforming } from "../SettingsUtils";
@@ -119,7 +120,7 @@ export class IndexingPolicyComponent extends React.Component<
value: value,
language: "json",
readOnly: isIndexTransforming(this.props.indexTransformationProgress),
ariaLabel: "Indexing Policy",
ariaLabel: t(Keys.controls.settings.indexingPolicy.ariaLabel),
theme: monacoTheme(),
});
if (this.indexingPolicyEditor) {

View File

@@ -1,6 +1,7 @@
import { MessageBar, MessageBarType } from "@fluentui/react";
import * as React from "react";
import { handleError } from "../../../../../Common/ErrorHandlingUtils";
import { Keys, t } from "Localization";
import {
mongoIndexTransformationRefreshingMessage,
renderMongoIndexTransformationRefreshMessage,
@@ -46,7 +47,11 @@ export class IndexingPolicyRefreshComponent extends React.Component<
try {
await this.props.refreshIndexTransformationProgress();
} catch (error) {
handleError(error, "RefreshIndexTransformationProgress", "Refreshing index transformation progress failed");
handleError(
error,
"RefreshIndexTransformationProgress",
t(Keys.controls.settings.indexingPolicyRefresh.refreshFailed),
);
} finally {
this.setState({ isRefreshing: false });
}

View File

@@ -14,7 +14,7 @@ exports[`IndexingPolicyRefreshComponent renders 1`] = `
}
}
>
You can make more indexing changes once the current index transformation has completed. It is 90% complete.
You can make more indexing changes once the current index transformation has completed. It is 90% complete.
<StyledLinkBase
onClick={[Function]}
>

View File

@@ -9,6 +9,7 @@ import {
IDropdownOption,
ITextField,
} from "@fluentui/react";
import { Keys, t } from "Localization";
import {
addMongoIndexSubElementsTokens,
mongoErrorMessageStyles,
@@ -66,7 +67,7 @@ export class AddMongoIndexComponent extends React.Component<AddMongoIndexCompone
<Stack {...mongoWarningStackProps}>
<Stack horizontal tokens={addMongoIndexSubElementsTokens}>
<TextField
ariaLabel={"Index Field Name " + this.props.position}
ariaLabel={t(Keys.controls.settings.mongoIndexing.indexFieldName) + " " + this.props.position}
disabled={this.props.disabled}
styles={shortWidthTextFieldStyles}
componentRef={this.setRef}
@@ -76,17 +77,17 @@ export class AddMongoIndexComponent extends React.Component<AddMongoIndexCompone
/>
<Dropdown
ariaLabel={"Index Type " + this.props.position}
ariaLabel={t(Keys.controls.settings.mongoIndexing.indexType) + " " + this.props.position}
disabled={this.props.disabled}
styles={shortWidthDropDownStyles}
placeholder="Select an index type"
placeholder={t(Keys.controls.settings.mongoIndexing.selectIndexType)}
selectedKey={this.props.type}
options={this.indexTypes}
onChange={this.onTypeChange}
/>
<IconButton
ariaLabel={"Undo Button " + this.props.position}
ariaLabel={t(Keys.controls.settings.mongoIndexing.undoButton) + " " + this.props.position}
iconProps={{ iconName: "Undo" }}
disabled={!this.props.description && !this.props.type}
onClick={() => this.props.onDiscard()}

View File

@@ -15,6 +15,7 @@ import {
} from "@fluentui/react";
import * as React from "react";
import { MongoIndex } from "../../../../../Utils/arm/generatedClients/cosmos/types";
import { Keys, t } from "Localization";
import { CollapsibleSectionComponent } from "../../../CollapsiblePanel/CollapsibleSectionComponent";
import {
addMongoIndexStackProps,
@@ -83,11 +84,25 @@ export class MongoIndexingPolicyComponent extends React.Component<MongoIndexingP
};
private initialIndexesColumns: IColumn[] = [
{ key: "definition", name: "Definition", fieldName: "definition", minWidth: 100, maxWidth: 200, isResizable: true },
{ key: "type", name: "Type", fieldName: "type", minWidth: 100, maxWidth: 200, isResizable: true },
{
key: "definition",
name: t(Keys.controls.settings.mongoIndexing.definitionColumn),
fieldName: "definition",
minWidth: 100,
maxWidth: 200,
isResizable: true,
},
{
key: "type",
name: t(Keys.controls.settings.mongoIndexing.typeColumn),
fieldName: "type",
minWidth: 100,
maxWidth: 200,
isResizable: true,
},
{
key: "actionButton",
name: "Drop Index",
name: t(Keys.controls.settings.mongoIndexing.dropIndexColumn),
fieldName: "actionButton",
minWidth: 100,
maxWidth: 200,
@@ -96,11 +111,25 @@ export class MongoIndexingPolicyComponent extends React.Component<MongoIndexingP
];
private indexesToBeDroppedColumns: IColumn[] = [
{ key: "definition", name: "Definition", fieldName: "definition", minWidth: 100, maxWidth: 200, isResizable: true },
{ key: "type", name: "Type", fieldName: "type", minWidth: 100, maxWidth: 200, isResizable: true },
{
key: "definition",
name: t(Keys.controls.settings.mongoIndexing.definitionColumn),
fieldName: "definition",
minWidth: 100,
maxWidth: 200,
isResizable: true,
},
{
key: "type",
name: t(Keys.controls.settings.mongoIndexing.typeColumn),
fieldName: "type",
minWidth: 100,
maxWidth: 200,
isResizable: true,
},
{
key: "actionButton",
name: "Add index back",
name: t(Keys.controls.settings.mongoIndexing.addIndexBackColumn),
fieldName: "actionButton",
minWidth: 100,
maxWidth: 200,
@@ -161,7 +190,7 @@ export class MongoIndexingPolicyComponent extends React.Component<MongoIndexingP
private getActionButton = (arrayPosition: number, isCurrentIndex: boolean): JSX.Element => {
return isCurrentIndex ? (
<IconButton
ariaLabel="Delete index Button"
ariaLabel={t(Keys.controls.settings.mongoIndexing.deleteIndexButton)}
iconProps={{ iconName: "Delete" }}
disabled={isIndexTransforming(this.props.indexTransformationProgress)}
onClick={() => {
@@ -170,7 +199,7 @@ export class MongoIndexingPolicyComponent extends React.Component<MongoIndexingP
/>
) : (
<IconButton
ariaLabel="Add back Index Button"
ariaLabel={t(Keys.controls.settings.mongoIndexing.addBackIndexButton)}
iconProps={{ iconName: "Add" }}
onClick={() => {
this.props.onRevertIndexDrop(arrayPosition);
@@ -258,7 +287,10 @@ export class MongoIndexingPolicyComponent extends React.Component<MongoIndexingP
return (
<Stack {...createAndAddMongoIndexStackProps} styles={mediumWidthStackStyles}>
<CollapsibleSectionComponent title="Current index(es)" isExpandedByDefault={true}>
<CollapsibleSectionComponent
title={t(Keys.controls.settings.mongoIndexing.currentIndexes)}
isExpandedByDefault={true}
>
{
<>
<DetailsList
@@ -285,7 +317,10 @@ export class MongoIndexingPolicyComponent extends React.Component<MongoIndexingP
return (
<Stack styles={mediumWidthStackStyles}>
<CollapsibleSectionComponent title="Index(es) to be dropped" isExpandedByDefault={true}>
<CollapsibleSectionComponent
title={t(Keys.controls.settings.mongoIndexing.indexesToBeDropped)}
isExpandedByDefault={true}
>
{indexesToBeDropped.length > 0 && (
<DetailsList
styles={customDetailsListStyles}

View File

@@ -18,6 +18,7 @@ import { cancelDataTransferJob, pollDataTransferJob } from "Common/dataAccess/da
import { Platform, configContext } from "ConfigContext";
import Explorer from "Explorer/Explorer";
import { ChangePartitionKeyPane } from "Explorer/Panes/ChangePartitionKeyPane/ChangePartitionKeyPane";
import { Keys, t } from "Localization";
import {
CosmosSqlDataTransferDataSourceSink,
DataTransferJobGetResults,
@@ -80,7 +81,7 @@ export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({
return (collection.partitionKeyProperties || []).map((property) => "/" + property).join(", ");
};
const partitionKeyName = "Partition key";
const partitionKeyName = t(Keys.controls.settings.partitionKey.partitionKey);
const partitionKeyValue = getPartitionKeyValue();
const textHeadingStyle = {
@@ -148,22 +149,28 @@ export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({
const getProgressDescription = (): string => {
const processedCount = portalDataTransferJob?.properties?.processedCount;
const totalCount = portalDataTransferJob?.properties?.totalCount;
const processedCountString = totalCount > 0 ? `(${processedCount} of ${totalCount} documents processed)` : "";
const processedCountString =
totalCount > 0
? t(Keys.controls.settings.partitionKeyEditor.documentsProcessed, {
processedCount: String(processedCount),
totalCount: String(totalCount),
})
: "";
return `${portalDataTransferJob?.properties?.status} ${processedCountString}`;
};
const startPartitionkeyChangeWorkflow = () => {
useSidePanel
.getState()
.openSidePanel(
"Change partition key",
<ChangePartitionKeyPane
sourceDatabase={database}
sourceCollection={collection}
explorer={explorer}
onClose={refreshDataTransferOperations}
/>,
);
useSidePanel.getState().openSidePanel(
t(Keys.controls.settings.partitionKeyEditor.changePartitionKey, {
partitionKeyName: t(Keys.controls.settings.partitionKey.partitionKey).toLowerCase(),
}),
<ChangePartitionKeyPane
sourceDatabase={database}
sourceCollection={collection}
explorer={explorer}
onClose={refreshDataTransferOperations}
/>,
);
};
const getPercentageComplete = () => {
@@ -181,16 +188,28 @@ export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({
return (
<Stack tokens={{ childrenGap: 20 }} styles={{ root: { maxWidth: 600 } }}>
<Stack tokens={{ childrenGap: 10 }}>
{!isReadOnly && <Text styles={textHeadingStyle}>Change {partitionKeyName.toLowerCase()}</Text>}
{!isReadOnly && (
<Text styles={textHeadingStyle}>
{t(Keys.controls.settings.partitionKeyEditor.changePartitionKey, {
partitionKeyName: partitionKeyName.toLowerCase(),
})}
</Text>
)}
<Stack horizontal tokens={{ childrenGap: 20 }}>
<Stack tokens={{ childrenGap: 5 }}>
<Text styles={textSubHeadingStyle}>Current {partitionKeyName.toLowerCase()}</Text>
<Text styles={textSubHeadingStyle}>Partitioning</Text>
<Text styles={textSubHeadingStyle}>
{t(Keys.controls.settings.partitionKeyEditor.currentPartitionKey, {
partitionKeyName: partitionKeyName.toLowerCase(),
})}
</Text>
<Text styles={textSubHeadingStyle}>{t(Keys.controls.settings.partitionKeyEditor.partitioning)}</Text>
</Stack>
<Stack tokens={{ childrenGap: 5 }} data-test="partition-key-values">
<Text styles={textSubHeadingStyle1}>{partitionKeyValue}</Text>
<Text styles={textSubHeadingStyle1}>
{isHierarchicalPartitionedContainer() ? "Hierarchical" : "Non-hierarchical"}
{isHierarchicalPartitionedContainer()
? t(Keys.controls.settings.partitionKeyEditor.hierarchical)
: t(Keys.controls.settings.partitionKeyEditor.nonHierarchical)}
</Text>
</Stack>
</Stack>
@@ -204,33 +223,33 @@ export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({
messageBarIconProps={{ iconName: "WarningSolid", className: "messageBarWarningIcon" }}
styles={darkThemeMessageBarStyles}
>
To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to
the source container for the entire duration of the partition key change process.
{t(Keys.controls.settings.partitionKeyEditor.safeguardWarning)}
<Link
href="https://learn.microsoft.com/azure/cosmos-db/container-copy#how-does-container-copy-work"
target="_blank"
underline
style={{ color: "var(--colorBrandForeground1)" }}
>
Learn more
{t(Keys.common.learnMore)}
</Link>
</MessageBar>
<Text styles={{ root: { color: "var(--colorNeutralForeground1)" } }}>
To change the partition key, a new destination container must be created or an existing destination
container selected. Data will then be copied to the destination container.
{t(Keys.controls.settings.partitionKeyEditor.changeDescription)}
</Text>
{configContext.platform !== Platform.Emulator && (
<PrimaryButton
data-test="change-partition-key-button"
styles={{ root: { width: "fit-content" } }}
text="Change"
text={t(Keys.controls.settings.partitionKeyEditor.changeButton)}
onClick={startPartitionkeyChangeWorkflow}
disabled={isCurrentJobInProgress(portalDataTransferJob)}
/>
)}
{portalDataTransferJob && (
<Stack>
<Text styles={textHeadingStyle}>{partitionKeyName} change job</Text>
<Text styles={textHeadingStyle}>
{t(Keys.controls.settings.partitionKeyEditor.changeJob, { partitionKeyName })}
</Text>
<Stack
horizontal
tokens={{ childrenGap: 20 }}
@@ -251,7 +270,10 @@ export const PartitionKeyComponent: React.FC<PartitionKeyComponentProps> = ({
}}
></ProgressIndicator>
{isCurrentJobInProgress(portalDataTransferJob) && (
<DefaultButton text="Cancel" onClick={() => cancelRunningDataTransferJob(portalDataTransferJob)} />
<DefaultButton
text={t(Keys.controls.settings.partitionKeyEditor.cancelButton)}
onClick={() => cancelRunningDataTransferJob(portalDataTransferJob)}
/>
)}
</Stack>
</Stack>

View File

@@ -1,4 +1,5 @@
import { Link, MessageBar, MessageBarType, Stack, Text, TextField } from "@fluentui/react";
import { Keys, t } from "Localization";
import * as React from "react";
import * as Constants from "../../../../Common/Constants";
import { Platform, configContext } from "../../../../ConfigContext";
@@ -92,8 +93,10 @@ export class ScaleComponent extends React.Component<ScaleComponentProps> {
}
const minThroughput: string = this.getMinRUs().toLocaleString();
const maxThroughput: string = !this.props.isFixedContainer ? "unlimited" : this.getMaxRUs().toLocaleString();
return `Throughput (${minThroughput} - ${maxThroughput} RU/s)`;
const maxThroughput: string = !this.props.isFixedContainer
? t(Keys.controls.settings.scale.unlimited)
: this.getMaxRUs().toLocaleString();
return t(Keys.controls.settings.scale.throughputRangeLabel, { min: minThroughput, max: maxThroughput });
};
public canThroughputExceedMaximumValue = (): boolean => {
@@ -156,14 +159,12 @@ export class ScaleComponent extends React.Component<ScaleComponentProps> {
const freeTierLimits = SharedConstants.FreeTierLimits;
return (
<Text>
With free tier, you will get the first {freeTierLimits.RU} RU/s and {freeTierLimits.Storage} GB of storage in
this account for free. To keep your account free, keep the total RU/s across all resources in the account to{" "}
{freeTierLimits.RU} RU/s.
{t(Keys.controls.settings.scale.freeTierInfo, { ru: freeTierLimits.RU, storage: freeTierLimits.Storage })}
<Link
href="https://docs.microsoft.com/en-us/azure/cosmos-db/understand-your-bill#billing-examples-with-free-tier-accounts"
target="_blank"
>
Learn more.
{t(Keys.controls.settings.scale.freeTierLearnMore)}
</Link>
</Text>
);
@@ -188,12 +189,9 @@ export class ScaleComponent extends React.Component<ScaleComponentProps> {
{/* TODO: Replace link with call to the Azure Support blade */}
{this.isAutoScaleEnabled() && (
<Stack {...titleAndInputStackProps}>
<Text>Throughput (RU/s)</Text>
<Text>{t(Keys.controls.settings.scale.throughputRuS)}</Text>
<TextField disabled styles={getTextFieldStyles(undefined, undefined)} />
<Text>
Your account has custom settings that prevents setting throughput at the container level. Please work with
your Cosmos DB engineering team point of contact to make changes.
</Text>
<Text>{t(Keys.controls.settings.scale.autoScaleCustomSettings)}</Text>
</Stack>
)}
</Stack>

View File

@@ -12,6 +12,7 @@ import {
} from "@fluentui/react";
import * as React from "react";
import * as ViewModels from "../../../../Contracts/ViewModels";
import { Keys, t } from "Localization";
import { userContext } from "../../../../UserContext";
import { Int32 } from "../../../Panes/Tables/Validators/EntityPropertyValidationCommon";
import {
@@ -85,9 +86,12 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
constructor(props: SubSettingsComponentProps) {
super(props);
this.geospatialVisible = userContext.apiType === "SQL";
this.partitionKeyName = userContext.apiType === "Mongo" ? "Shard key" : "Partition key";
this.partitionKeyName =
userContext.apiType === "Mongo"
? t(Keys.controls.settings.partitionKey.shardKey)
: t(Keys.controls.settings.partitionKey.partitionKey);
this.partitionKeyValue = this.getPartitionKeyValue();
this.uniqueKeyName = "Unique keys";
this.uniqueKeyName = t(Keys.controls.settings.subSettings.uniqueKeys);
this.uniqueKeyValue = this.getUniqueKeyValue();
}
@@ -143,9 +147,13 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
};
private ttlChoiceGroupOptions: IChoiceGroupOption[] = [
{ key: TtlType.Off, text: "Off", ariaLabel: "ttl-off-option" },
{ key: TtlType.OnNoDefault, text: "On (no default)", ariaLabel: "ttl-on-no-default-option" },
{ key: TtlType.On, text: "On", ariaLabel: "ttl-on-option" },
{ key: TtlType.Off, text: t(Keys.controls.settings.subSettings.ttlOff), ariaLabel: "ttl-off-option" },
{
key: TtlType.OnNoDefault,
text: t(Keys.controls.settings.subSettings.ttlOnNoDefault),
ariaLabel: "ttl-on-no-default-option",
},
{ key: TtlType.On, text: t(Keys.controls.settings.subSettings.ttlOn), ariaLabel: "ttl-on-option" },
];
public getTtlValue = (value: string): TtlType => {
@@ -216,13 +224,13 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
}}
>
<Text style={{ color: "var(--colorNeutralForeground1)" }}>
To enable time-to-live (TTL) for your collection/documents,{" "}
{t(Keys.controls.settings.subSettings.mongoTtlMessage)}{" "}
<Link
href="https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-time-to-live"
target="_blank"
style={{ color: "var(--colorBrandForeground1)" }}
>
create a TTL index
{t(Keys.controls.settings.subSettings.mongoTtlLinkText)}
</Link>
.
</Text>
@@ -231,7 +239,7 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
<Stack {...titleAndInputStackProps}>
<ChoiceGroup
id="timeToLive"
label="Time to Live"
label={t(Keys.controls.settings.subSettings.timeToLive)}
selectedKey={this.props.timeToLive}
options={this.ttlChoiceGroupOptions}
onChange={this.onTtlChange}
@@ -255,8 +263,8 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
max={Int32.Max}
value={this.props.displayedTtlSeconds}
onChange={this.onTimeToLiveSecondsChange}
suffix="second(s)"
ariaLabel={`Time to live in seconds`}
suffix={t(Keys.controls.settings.subSettings.seconds)}
ariaLabel={t(Keys.controls.settings.subSettings.timeToLiveInSeconds)}
data-test="ttl-input"
/>
)}
@@ -264,16 +272,16 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
);
private analyticalTtlChoiceGroupOptions: IChoiceGroupOption[] = [
{ key: TtlType.Off, text: "Off", disabled: true },
{ key: TtlType.OnNoDefault, text: "On (no default)" },
{ key: TtlType.On, text: "On" },
{ key: TtlType.Off, text: t(Keys.controls.settings.subSettings.ttlOff), disabled: true },
{ key: TtlType.OnNoDefault, text: t(Keys.controls.settings.subSettings.ttlOnNoDefault) },
{ key: TtlType.On, text: t(Keys.controls.settings.subSettings.ttlOn) },
];
private getAnalyticalStorageTtlComponent = (): JSX.Element => (
<Stack {...titleAndInputStackProps}>
<ChoiceGroup
id="analyticalStorageTimeToLive"
label="Analytical Storage Time to Live"
label={t(Keys.controls.settings.subSettings.analyticalStorageTtl)}
selectedKey={this.props.analyticalStorageTtlSelection}
options={this.analyticalTtlChoiceGroupOptions}
onChange={this.onAnalyticalStorageTtlSelectionChange}
@@ -294,7 +302,7 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
min={1}
max={Int32.Max}
value={this.props.analyticalStorageTtlSeconds?.toString()}
suffix="second(s)"
suffix={t(Keys.controls.settings.subSettings.seconds)}
onChange={this.onAnalyticalStorageTtlSecondsChange}
/>
)}
@@ -302,14 +310,22 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
);
private geoSpatialConfigTypeChoiceGroupOptions: IChoiceGroupOption[] = [
{ key: GeospatialConfigType.Geography, text: "Geography", ariaLabel: "geography-option" },
{ key: GeospatialConfigType.Geometry, text: "Geometry", ariaLabel: "geometry-option" },
{
key: GeospatialConfigType.Geography,
text: t(Keys.controls.settings.subSettings.geography),
ariaLabel: "geography-option",
},
{
key: GeospatialConfigType.Geometry,
text: t(Keys.controls.settings.subSettings.geometry),
ariaLabel: "geometry-option",
},
];
private getGeoSpatialComponent = (): JSX.Element => (
<ChoiceGroup
id="geoSpatialConfig"
label="Geospatial Configuration"
label={t(Keys.controls.settings.subSettings.geospatialConfiguration)}
selectedKey={this.props.geospatialConfigType}
options={this.geoSpatialConfigTypeChoiceGroupOptions}
onChange={this.onGeoSpatialConfigTypeChange}
@@ -318,8 +334,8 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
);
private changeFeedChoiceGroupOptions: IChoiceGroupOption[] = [
{ key: ChangeFeedPolicyState.Off, text: "Off" },
{ key: ChangeFeedPolicyState.On, text: "On" },
{ key: ChangeFeedPolicyState.Off, text: t(Keys.controls.settings.subSettings.ttlOff) },
{ key: ChangeFeedPolicyState.On, text: t(Keys.controls.settings.subSettings.ttlOn) },
];
private getChangeFeedComponent = (): JSX.Element => {
@@ -328,7 +344,10 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
return (
<Stack>
<Label id={labelId}>
<ToolTipLabelComponent label="Change feed log retention policy" toolTipElement={changeFeedPolicyToolTip} />
<ToolTipLabelComponent
label={t(Keys.controls.settings.changeFeed.label)}
toolTipElement={changeFeedPolicyToolTip}
/>
</Label>
<ChoiceGroup
id="changeFeedPolicy"
@@ -354,9 +373,10 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
<Stack {...titleAndInputStackProps}>
{this.getPartitionKeyVisible() && (
<TooltipHost
content={`This ${this.partitionKeyName.toLowerCase()} is used to distribute data across multiple partitions for scalability. The value "${
this.partitionKeyValue
}" determines how documents are partitioned.`}
content={t(Keys.controls.settings.subSettings.partitionKeyTooltipTemplate, {
partitionKeyName: this.partitionKeyName.toLowerCase(),
partitionKeyValue: this.partitionKeyValue,
})}
styles={{
root: {
display: "block",
@@ -373,14 +393,20 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
)}
{userContext.apiType === "SQL" && this.isLargePartitionKeyEnabled() && (
<Text className={classNames.hintText}>Large {this.partitionKeyName.toLowerCase()} has been enabled.</Text>
<Text className={classNames.hintText}>
{t(Keys.controls.settings.subSettings.largePartitionKeyEnabled, {
partitionKeyName: this.partitionKeyName.toLowerCase(),
})}
</Text>
)}
{userContext.apiType === "SQL" &&
(this.isHierarchicalPartitionedContainer() ? (
<Text className={classNames.hintText}>Hierarchically partitioned container.</Text>
<Text className={classNames.hintText}>{t(Keys.controls.settings.subSettings.hierarchicalPartitioned)}</Text>
) : (
<Text className={classNames.hintText}>Non-hierarchically partitioned container.</Text>
<Text className={classNames.hintText}>
{t(Keys.controls.settings.subSettings.nonHierarchicalPartitioned)}
</Text>
))}
</Stack>
);

View File

@@ -1,5 +1,6 @@
import { Label, Slider, Stack, TextField, Toggle } from "@fluentui/react";
import { ThroughputBucket } from "Contracts/DataModels";
import { Keys, t } from "Localization";
import React, { FC, useEffect, useState } from "react";
import { isDirty } from "../../SettingsUtils";
@@ -65,7 +66,9 @@ export const ThroughputBucketsComponent: FC<ThroughputBucketsComponentProps> = (
return (
<Stack tokens={{ childrenGap: "m" }} styles={{ root: { width: "70%", maxWidth: 700 } }}>
<Label styles={{ root: { color: "var(--colorNeutralForeground1)" } }}>Throughput Buckets</Label>
<Label styles={{ root: { color: "var(--colorNeutralForeground1)" } }}>
{t(Keys.controls.settings.throughputBuckets.label)}
</Label>
<Stack>
{throughputBuckets?.map((bucket) => (
<Stack key={bucket.id} horizontal tokens={{ childrenGap: 8 }} verticalAlign="center">
@@ -76,7 +79,9 @@ export const ThroughputBucketsComponent: FC<ThroughputBucketsComponentProps> = (
value={bucket.maxThroughputPercentage}
onChange={(newValue) => handleBucketChange(bucket.id, newValue)}
showValue={false}
label={`Bucket ${bucket.id}${bucket.id === 1 ? " (Data Explorer Query Bucket)" : ""}`}
label={`${t(Keys.controls.settings.throughputBuckets.bucketLabel, { id: String(bucket.id) })}${
bucket.id === 1 ? t(Keys.controls.settings.throughputBuckets.dataExplorerQueryBucket) : ""
}`}
styles={{
root: { flex: 2, maxWidth: 400 },
titleLabel: {
@@ -99,8 +104,8 @@ export const ThroughputBucketsComponent: FC<ThroughputBucketsComponentProps> = (
disabled={bucket.maxThroughputPercentage === 100}
/>
<Toggle
onText="Active"
offText="Inactive"
onText={t(Keys.controls.settings.throughputBuckets.active)}
offText={t(Keys.controls.settings.throughputBuckets.inactive)}
checked={bucket.maxThroughputPercentage !== 100}
onChange={(event, checked) => onToggle(bucket.id, checked)}
styles={{

View File

@@ -16,6 +16,7 @@ import {
Text,
TextField,
} from "@fluentui/react";
import { Keys, t } from "Localization";
import React from "react";
import * as DataModels from "../../../../../Contracts/DataModels";
import * as SharedConstants from "../../../../../Shared/Constants";
@@ -97,8 +98,8 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
private throughputInputMaxValue: number;
private autoPilotInputMaxValue: number;
private options: IChoiceGroupOption[] = [
{ key: "true", text: "Autoscale" },
{ key: "false", text: "Manual" },
{ key: "true", text: t(Keys.controls.settings.throughputInput.autoscale) },
{ key: "false", text: t(Keys.controls.settings.throughputInput.manual) },
];
// Style constants for theme-aware colors and layout
@@ -244,7 +245,7 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
return (
<div>
<Text style={{ fontWeight: 600, color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY }}>
Updated cost per month
{t(Keys.controls.settings.costEstimate.updatedCostPerMonth)}
</Text>
<Stack horizontal style={{ marginTop: 5, marginBottom: 10 }}>
<Text
@@ -253,7 +254,8 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY,
}}
>
{newPrices.currencySign} {calculateEstimateNumber(newPrices.monthlyPrice / 10)} min
{newPrices.currencySign} {calculateEstimateNumber(newPrices.monthlyPrice / 10)}{" "}
{t(Keys.controls.settings.throughputInput.min)}
</Text>
<Text
style={{
@@ -261,7 +263,8 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY,
}}
>
{newPrices.currencySign} {calculateEstimateNumber(newPrices.monthlyPrice)} max
{newPrices.currencySign} {calculateEstimateNumber(newPrices.monthlyPrice)}{" "}
{t(Keys.controls.settings.throughputInput.max)}
</Text>
</Stack>
</div>
@@ -274,7 +277,7 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
<Stack {...checkBoxAndInputStackProps} style={{ marginTop: 15 }}>
{newThroughput && newThroughputCostElement()}
<Text style={{ fontWeight: 600, color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY }}>
Current cost per month
{t(Keys.controls.settings.costEstimate.currentCostPerMonth)}
</Text>
<Stack horizontal style={{ marginTop: 5, color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY }}>
<Text
@@ -283,7 +286,8 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY,
}}
>
{prices.currencySign} {calculateEstimateNumber(prices.monthlyPrice / 10)} min
{prices.currencySign} {calculateEstimateNumber(prices.monthlyPrice / 10)}{" "}
{t(Keys.controls.settings.throughputInput.min)}
</Text>
<Text
style={{
@@ -291,7 +295,8 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY,
}}
>
{prices.currencySign} {calculateEstimateNumber(prices.monthlyPrice)} max
{prices.currencySign} {calculateEstimateNumber(prices.monthlyPrice)}{" "}
{t(Keys.controls.settings.throughputInput.max)}
</Text>
</Stack>
</Stack>
@@ -326,17 +331,20 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
return (
<div>
<Text style={{ fontWeight: 600, color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY }}>
Updated cost per month
{t(Keys.controls.settings.costEstimate.updatedCostPerMonth)}
</Text>
<Stack horizontal style={{ marginTop: 5, marginBottom: 10 }}>
<Text style={this.settingsAndScaleStyle.root}>
{newPrices.currencySign} {calculateEstimateNumber(newPrices.hourlyPrice)}/hr
{newPrices.currencySign} {calculateEstimateNumber(newPrices.hourlyPrice)}
{t(Keys.controls.settings.costEstimate.perHour)}
</Text>
<Text style={this.settingsAndScaleStyle.root}>
{newPrices.currencySign} {calculateEstimateNumber(newPrices.dailyPrice)}/day
{newPrices.currencySign} {calculateEstimateNumber(newPrices.dailyPrice)}
{t(Keys.controls.settings.costEstimate.perDay)}
</Text>
<Text style={this.settingsAndScaleStyle.root}>
{newPrices.currencySign} {calculateEstimateNumber(newPrices.monthlyPrice)}/mo
{newPrices.currencySign} {calculateEstimateNumber(newPrices.monthlyPrice)}
{t(Keys.controls.settings.costEstimate.perMonth)}
</Text>
</Stack>
</div>
@@ -349,17 +357,20 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
<Stack {...checkBoxAndInputStackProps} style={{ marginTop: 15 }}>
{newThroughput && newThroughputCostElement()}
<Text style={{ fontWeight: 600, color: ThroughputInputAutoPilotV3Component.TEXT_COLOR_PRIMARY }}>
Current cost per month
{t(Keys.controls.settings.costEstimate.currentCostPerMonth)}
</Text>
<Stack horizontal style={{ marginTop: 5 }}>
<Text style={this.settingsAndScaleStyle.root}>
{prices.currencySign} {calculateEstimateNumber(prices.hourlyPrice)}/hr
{prices.currencySign} {calculateEstimateNumber(prices.hourlyPrice)}
{t(Keys.controls.settings.costEstimate.perHour)}
</Text>
<Text style={this.settingsAndScaleStyle.root}>
{prices.currencySign} {calculateEstimateNumber(prices.dailyPrice)}/day
{prices.currencySign} {calculateEstimateNumber(prices.dailyPrice)}
{t(Keys.controls.settings.costEstimate.perDay)}
</Text>
<Text style={this.settingsAndScaleStyle.root}>
{prices.currencySign} {calculateEstimateNumber(prices.monthlyPrice)}/mo
{prices.currencySign} {calculateEstimateNumber(prices.monthlyPrice)}
{t(Keys.controls.settings.costEstimate.perMonth)}
</Text>
</Stack>
</Stack>
@@ -444,10 +455,14 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
this.setState({ spendAckChecked: checked });
private getStorageCapacityTitle = (): JSX.Element => {
const capacity: string = this.props.isFixed ? "Fixed" : "Unlimited";
const capacity: string = this.props.isFixed
? t(Keys.controls.settings.throughputInput.fixed)
: t(Keys.controls.settings.throughputInput.unlimited);
return (
<Stack {...titleAndInputStackProps}>
<Label style={{ color: "var(--colorNeutralForeground1)" }}>Storage capacity</Label>
<Label style={{ color: "var(--colorNeutralForeground1)" }}>
{t(Keys.controls.settings.throughputInput.storageCapacity)}
</Label>
<Text style={{ color: "var(--colorNeutralForeground1)" }}>{capacity}</Text>
</Stack>
);
@@ -555,10 +570,14 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
/>
<Stack horizontal>
<Stack.Item style={{ width: "34%", paddingRight: "5px" }}>
<Separator styles={this.thoughputRangeSeparatorStyles}>Instant</Separator>
<Separator styles={this.thoughputRangeSeparatorStyles}>
{t(Keys.controls.settings.throughputInput.instant)}
</Separator>
</Stack.Item>
<Stack.Item style={{ width: "66%", paddingLeft: "5px" }}>
<Separator styles={this.thoughputRangeSeparatorStyles}>4-6 hrs</Separator>
<Separator styles={this.thoughputRangeSeparatorStyles}>
{t(Keys.controls.settings.throughputInput.fourToSixHrs)}
</Separator>
</Stack.Item>
</Stack>
</Stack>
@@ -638,7 +657,7 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
variant="small"
style={{ lineHeight: "20px", fontWeight: 600, color: "var(--colorNeutralForeground1)" }}
>
Minimum RU/s
{t(Keys.controls.settings.throughputInput.minimumRuS)}
</Text>
<FontIcon iconName="Info" style={{ fontSize: 12, color: "var(--colorNeutralForeground2)" }} />
</Stack>
@@ -672,7 +691,7 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
color: "var(--colorNeutralForeground1)",
}}
>
x 10 =
{t(Keys.controls.settings.throughputInput.x10Equals)}
</Text>
{/* Column 3: Maximum RU/s */}
@@ -682,7 +701,7 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
variant="small"
style={{ lineHeight: "20px", fontWeight: 600, color: "var(--colorNeutralForeground1)" }}
>
Maximum RU/s
{t(Keys.controls.settings.throughputInput.maximumRuS)}
</Text>
<FontIcon iconName="Info" style={{ fontSize: 12, color: "var(--colorNeutralForeground2)" }} />
</Stack>
@@ -723,7 +742,9 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
onGetErrorMessage={(value: string) => {
const sanitizedValue = getSanitizedInputValue(value);
const errorMessage: string =
sanitizedValue % 1000 ? "Throughput value must be in increments of 1000" : this.props.throughputError;
sanitizedValue % 1000
? t(Keys.controls.settings.throughput.throughputIncrementError)
: this.props.throughputError;
return <span data-test="autopilot-throughput-input-error">{errorMessage}</span>;
}}
validateOnLoad={false}
@@ -769,7 +790,9 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
)}
{this.props.isAutoPilotSelected ? (
<Text style={{ marginTop: "40px", color: "var(--colorNeutralForeground1)" }}>
Based on usage, your {this.props.collectionName ? "container" : "database"} throughput will scale from{" "}
{t(Keys.controls.settings.throughputInput.autoscaleDescription, {
resourceType: this.props.collectionName ? "container" : "database",
})}{" "}
<b>
{AutoPilotUtils.getMinRUsBasedOnUserInput(this.props.maxAutoPilotThroughput)} RU/s (10% of max RU/s) -{" "}
{this.props.maxAutoPilotThroughput} RU/s
@@ -784,16 +807,19 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
styles={this.darkThemeMessageBarStyles}
style={{ marginTop: "40px" }}
>
{`Billing will apply if you provision more than ${SharedConstants.FreeTierLimits.RU} RU/s of manual throughput, or if the resource scales beyond ${SharedConstants.FreeTierLimits.RU} RU/s with autoscale.`}
{t(Keys.controls.settings.throughputInput.freeTierWarning, {
ru: String(SharedConstants.FreeTierLimits.RU),
})}
</MessageBar>
)}
</>
)}
{!this.overrideWithProvisionedThroughputSettings() && (
<Text style={{ color: "var(--colorNeutralForeground1)" }}>
Estimate your required RU/s with
{t(Keys.controls.settings.throughputInput.capacityCalculator)}
<Link target="_blank" href="https://cosmos.azure.com/capacitycalculator/">
{` capacity calculator`} <FontIcon iconName="NavigateExternalInline" />
{t(Keys.controls.settings.throughputInput.capacityCalculatorLink)}{" "}
<FontIcon iconName="NavigateExternalInline" />
</Link>
</Text>
)}
@@ -806,9 +832,7 @@ export class ThroughputInputAutoPilotV3Component extends React.Component<
onChange={this.onSpendAckChecked}
/>
)}
{this.props.isFixed && (
<p>When using a collection with fixed storage capacity, you can set up to 10,000 RU/s.</p>
)}
{this.props.isFixed && <p>{t(Keys.controls.settings.throughputInput.fixedStorageNote)}</p>}
{this.props.collectionName && (
<Stack.Item style={{ marginTop: "40px" }}>{this.getStorageCapacityTitle()}</Stack.Item>
)}

View File

@@ -552,9 +552,7 @@ exports[`ThroughputInputAutoPilotV3Component autopilot input visible 1`] = `
}
}
>
You are not able to lower throughput below your current minimum of
10000
RU/s. For more information on this limit, please refer to our service quote documentation.
You are not able to lower throughput below your current minimum of 10000 RU/s. For more information on this limit, please refer to our service quote documentation.
<StyledLinkBase
href="https://learn.microsoft.com/en-us/azure/cosmos-db/concepts-limits#minimum-throughput-limits"
target="_blank"
@@ -572,9 +570,7 @@ exports[`ThroughputInputAutoPilotV3Component autopilot input visible 1`] = `
}
}
>
Based on usage, your
container
throughput will scale from
Based on usage, your container throughput will scale from
<b>
400
@@ -683,7 +679,8 @@ exports[`ThroughputInputAutoPilotV3Component autopilot input visible 1`] = `
$
35.04
min
min
</Text>
<Text
style={
@@ -696,7 +693,8 @@ exports[`ThroughputInputAutoPilotV3Component autopilot input visible 1`] = `
$
350.40
max
max
</Text>
</Stack>
</div>
@@ -730,7 +728,8 @@ exports[`ThroughputInputAutoPilotV3Component autopilot input visible 1`] = `
$
35.04
min
min
</Text>
<Text
style={
@@ -743,7 +742,8 @@ exports[`ThroughputInputAutoPilotV3Component autopilot input visible 1`] = `
$
350.40
max
max
</Text>
</Stack>
</Stack>
@@ -1151,9 +1151,7 @@ exports[`ThroughputInputAutoPilotV3Component spendAck checkbox visible 1`] = `
}
}
>
You are not able to lower throughput below your current minimum of
10000
RU/s. For more information on this limit, please refer to our service quote documentation.
You are not able to lower throughput below your current minimum of 10000 RU/s. For more information on this limit, please refer to our service quote documentation.
<StyledLinkBase
href="https://learn.microsoft.com/en-us/azure/cosmos-db/concepts-limits#minimum-throughput-limits"
target="_blank"
@@ -1728,9 +1726,7 @@ exports[`ThroughputInputAutoPilotV3Component throughput input visible 1`] = `
}
}
>
You are not able to lower throughput below your current minimum of
10000
RU/s. For more information on this limit, please refer to our service quote documentation.
You are not able to lower throughput below your current minimum of 10000 RU/s. For more information on this limit, please refer to our service quote documentation.
<StyledLinkBase
href="https://learn.microsoft.com/en-us/azure/cosmos-db/concepts-limits#minimum-throughput-limits"
target="_blank"

View File

@@ -27,7 +27,8 @@ exports[`ComputedPropertiesComponent renders 1`] = `
iconName="NavigateExternalInline"
/>
</StyledLinkBase>
  about how to define computed properties and how to use them.
 
about how to define computed properties and how to use them.
</Text>
<div
className="settingsV2Editor"

View File

@@ -33,8 +33,7 @@ exports[`PartitionKeyComponent renders default component and matches snapshot 1`
}
}
>
Change
partition key
Change partition key
</Text>
<Stack
horizontal={true}
@@ -61,8 +60,7 @@ exports[`PartitionKeyComponent renders default component and matches snapshot 1`
}
}
>
Current
partition key
Current partition key
</Text>
<Text
styles={
@@ -223,8 +221,7 @@ exports[`PartitionKeyComponent renders read-only component and matches snapshot
}
}
>
Current
partition key
Current partition key
</Text>
<Text
styles={

View File

@@ -410,9 +410,7 @@ exports[`SubSettingsComponent analyticalTimeToLive hidden 1`] = `
<Text
className="hintText-115"
>
Large
partition key
has been enabled.
Large partition key has been enabled.
</Text>
<Text
className="hintText-115"
@@ -984,9 +982,7 @@ exports[`SubSettingsComponent analyticalTimeToLiveSeconds hidden 1`] = `
<Text
className="hintText-115"
>
Large
partition key
has been enabled.
Large partition key has been enabled.
</Text>
<Text
className="hintText-115"
@@ -1522,9 +1518,7 @@ exports[`SubSettingsComponent changeFeedPolicy hidden 1`] = `
<Text
className="hintText-115"
>
Large
partition key
has been enabled.
Large partition key has been enabled.
</Text>
<Text
className="hintText-115"
@@ -2157,9 +2151,7 @@ exports[`SubSettingsComponent renders 1`] = `
<Text
className="hintText-115"
>
Large
partition key
has been enabled.
Large partition key has been enabled.
</Text>
<Text
className="hintText-115"
@@ -2729,9 +2721,7 @@ exports[`SubSettingsComponent timeToLiveSeconds hidden 1`] = `
<Text
className="hintText-115"
>
Large
partition key
has been enabled.
Large partition key has been enabled.
</Text>
<Text
className="hintText-115"

View File

@@ -1,6 +1,7 @@
import * as Constants from "../../../Common/Constants";
import * as DataModels from "../../../Contracts/DataModels";
import * as ViewModels from "../../../Contracts/ViewModels";
import { Keys, t } from "Localization";
import { isFabricNative } from "../../../Platform/Fabric/FabricUtil";
import { userContext } from "../../../UserContext";
import { isCapabilityEnabled } from "../../../Utils/CapabilityUtils";
@@ -175,25 +176,27 @@ const getStringValue = (value: isDirtyTypes, type: string): string => {
export const getTabTitle = (tab: SettingsV2TabTypes): string => {
switch (tab) {
case SettingsV2TabTypes.ScaleTab:
return "Scale";
return t(Keys.controls.settings.tabTitles.scale);
case SettingsV2TabTypes.ConflictResolutionTab:
return "Conflict Resolution";
return t(Keys.controls.settings.tabTitles.conflictResolution);
case SettingsV2TabTypes.SubSettingsTab:
return "Settings";
return t(Keys.controls.settings.tabTitles.settings);
case SettingsV2TabTypes.IndexingPolicyTab:
return "Indexing Policy";
return t(Keys.controls.settings.tabTitles.indexingPolicy);
case SettingsV2TabTypes.PartitionKeyTab:
return isFabricNative() ? "Partition Keys" : "Partition Keys (preview)";
return isFabricNative()
? t(Keys.controls.settings.tabTitles.partitionKeys)
: t(Keys.controls.settings.tabTitles.partitionKeysPreview);
case SettingsV2TabTypes.ComputedPropertiesTab:
return "Computed Properties";
return t(Keys.controls.settings.tabTitles.computedProperties);
case SettingsV2TabTypes.ContainerVectorPolicyTab:
return "Container Policies";
return t(Keys.controls.settings.tabTitles.containerPolicies);
case SettingsV2TabTypes.ThroughputBucketsTab:
return "Throughput Buckets";
return t(Keys.controls.settings.tabTitles.throughputBuckets);
case SettingsV2TabTypes.GlobalSecondaryIndexTab:
return "Global Secondary Index (Preview)";
return t(Keys.controls.settings.tabTitles.globalSecondaryIndexPreview);
case SettingsV2TabTypes.DataMaskingTab:
return "Masking Policy (preview)";
return t(Keys.controls.settings.tabTitles.maskingPolicyPreview);
default:
throw new Error(`Unknown tab ${tab}`);
}
@@ -203,19 +206,19 @@ export const getMongoNotification = (description: string, type: MongoIndexTypes)
if (description && !type) {
return {
type: MongoNotificationType.Warning,
message: "Please select a type for each index.",
message: t(Keys.controls.settings.mongoNotifications.selectTypeWarning),
};
}
if (type && (!description || description.trim().length === 0)) {
return {
type: MongoNotificationType.Error,
message: "Please enter a field name.",
message: t(Keys.controls.settings.mongoNotifications.enterFieldNameError),
};
} else if (type === MongoIndexTypes.Wildcard && description?.indexOf("$**") === -1) {
return {
type: MongoNotificationType.Error,
message: "Wildcard path is not present in the field name. Use a pattern like " + MongoWildcardPlaceHolder,
message: t(Keys.controls.settings.mongoNotifications.wildcardPathError) + MongoWildcardPlaceHolder,
};
}
@@ -249,28 +252,29 @@ export const isIndexTransforming = (indexTransformationProgress: number): boolea
indexTransformationProgress !== undefined && indexTransformationProgress !== 100;
export const getPartitionKeyName = (apiType: string, isLowerCase?: boolean): string => {
const partitionKeyName = apiType === "Mongo" ? "Shard key" : "Partition key";
const partitionKeyName =
apiType === "Mongo"
? t(Keys.controls.settings.partitionKey.shardKey)
: t(Keys.controls.settings.partitionKey.partitionKey);
return isLowerCase ? partitionKeyName.toLocaleLowerCase() : partitionKeyName;
};
export const getPartitionKeyTooltipText = (apiType: string): string => {
if (apiType === "Mongo") {
return "The shard key (field) is used to split your data across many replica sets (shards) to achieve unlimited scalability. Its critical to choose a field that will evenly distribute your data.";
return t(Keys.controls.settings.partitionKey.shardKeyTooltip);
}
let tooltipText = `The ${getPartitionKeyName(
apiType,
true,
)} is used to automatically distribute data across partitions for scalability. Choose a property in your JSON document that has a wide range of values and evenly distributes request volume.`;
let tooltipText = `The ${getPartitionKeyName(apiType, true)} ${t(
Keys.controls.settings.partitionKey.partitionKeyTooltip,
)}`;
if (apiType === "SQL") {
tooltipText += " For small read-heavy workloads or write-heavy workloads of any size, id is often a good choice.";
tooltipText += t(Keys.controls.settings.partitionKey.sqlPartitionKeyTooltipSuffix);
}
return tooltipText;
};
export const getPartitionKeySubtext = (partitionKeyDefault: boolean, apiType: string): string => {
if (partitionKeyDefault && (apiType === "SQL" || apiType === "Mongo")) {
const subtext = "For small workloads, the item ID is a suitable choice for the partition key.";
return subtext;
return t(Keys.controls.settings.partitionKey.partitionKeySubtext);
}
return "";
};
@@ -278,18 +282,18 @@ export const getPartitionKeySubtext = (partitionKeyDefault: boolean, apiType: st
export const getPartitionKeyPlaceHolder = (apiType: string, index?: number): string => {
switch (apiType) {
case "Mongo":
return "e.g., categoryId";
return t(Keys.controls.settings.partitionKey.mongoPlaceholder);
case "Gremlin":
return "e.g., /address";
return t(Keys.controls.settings.partitionKey.gremlinPlaceholder);
case "SQL":
return `${
index === undefined
? "Required - first partition key e.g., /TenantId"
? t(Keys.controls.settings.partitionKey.sqlFirstPartitionKey)
: index === 0
? "second partition key e.g., /UserId"
: "third partition key e.g., /SessionId"
? t(Keys.controls.settings.partitionKey.sqlSecondPartitionKey)
: t(Keys.controls.settings.partitionKey.sqlThirdPartitionKey)
}`;
default:
return "e.g., /address/zipCode";
return t(Keys.controls.settings.partitionKey.defaultPlaceholder);
}
};

View File

@@ -110,6 +110,7 @@ exports[`SettingsComponent renders 1`] = `
"conflictResolutionPolicy": [Function],
"container": Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],
@@ -231,6 +232,7 @@ exports[`SettingsComponent renders 1`] = `
"conflictResolutionPolicy": [Function],
"container": Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],
@@ -453,6 +455,7 @@ exports[`SettingsComponent renders 1`] = `
"conflictResolutionPolicy": [Function],
"container": Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],
@@ -524,6 +527,7 @@ exports[`SettingsComponent renders 1`] = `
explorer={
Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],
@@ -692,6 +696,7 @@ exports[`SettingsComponent renders 1`] = `
"conflictResolutionPolicy": [Function],
"container": Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],
@@ -763,6 +768,7 @@ exports[`SettingsComponent renders 1`] = `
explorer={
Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],

View File

@@ -127,9 +127,13 @@ exports[`SettingsUtils functions render 1`] = `
>
The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days to complete. View the latest status in Notifications.
<br />
Database:
Database:
sampleDb
, Container:
,
Container:
sampleCollection
, Current manual throughput: 1000 RU/s, Target manual throughput: 2000
@@ -309,7 +313,7 @@ exports[`SettingsUtils functions render 1`] = `
}
}
>
You can make more indexing changes once the current index transformation has completed. It is 90% complete.
You can make more indexing changes once the current index transformation has completed. It is 90% complete.
<StyledLinkBase
onClick={[Function]}
>

View File

@@ -107,6 +107,12 @@ export default class Explorer {
private static readonly MaxNbDatabasesToAutoExpand = 5;
public phoenixClient: PhoenixClient;
/**
* Resolves when the initial refreshAllDatabases (including collection loading) completes.
* Await this instead of calling refreshAllDatabases again to avoid duplicate concurrent loads.
*/
public databasesRefreshed: Promise<void> = Promise.resolve();
constructor() {
const startKey: number = TelemetryProcessor.traceStart(Action.InitializeDataExplorer, {
dataExplorerArea: Constants.Areas.ResourceTree,
@@ -1197,9 +1203,11 @@ export default class Explorer {
}
if (userContext.apiType !== "Postgres" && userContext.apiType !== "VCoreMongo") {
userContext.authType === AuthType.ResourceToken
? this.refreshDatabaseForResourceToken()
: await this.refreshAllDatabases(); // await: we rely on the databases to be loaded before restoring the tabs further in the flow
this.databasesRefreshed =
userContext.authType === AuthType.ResourceToken
? this.refreshDatabaseForResourceToken()
: this.refreshAllDatabases();
await this.databasesRefreshed; // await: we rely on the databases to be loaded before restoring the tabs further in the flow
}
if (!isFabricNative()) {

View File

@@ -167,7 +167,7 @@ export function createContextCommandBarButtons(
export function createControlCommandBarButtons(container: Explorer): CommandButtonComponentProps[] {
const buttons: CommandButtonComponentProps[] = [
ThemeToggleButton(),
ThemeToggleButton(configContext.platform === Platform.Portal),
{
iconSrc: SettingsIcon,
iconAlt: "Settings",

View File

@@ -5,6 +5,7 @@ import {
IconType,
IDropdownOption,
IDropdownStyles,
TooltipHost,
} from "@fluentui/react";
import { useQueryCopilot } from "hooks/useQueryCopilot";
import { KeyboardHandlerMap } from "KeyboardShortcuts";
@@ -154,6 +155,21 @@ export const convertButton = (btns: CommandButtonComponentProps[], backgroundCol
id: btn.id,
};
if (btn.tooltipContent) {
result.title = undefined;
result.commandBarButtonAs = (props: IComponentAsProps<ICommandBarItemProps>) => {
const { defaultRender: DefaultRender, ...rest } = props;
return React.createElement(
TooltipHost,
{
content: btn.tooltipContent as JSX.Element,
calloutProps: { gapSpace: 0 },
},
React.createElement(DefaultRender, rest),
);
};
}
if (isSplit) {
// It's a split button
result.split = true;

View File

@@ -1,10 +1,13 @@
import { Link, Text } from "@fluentui/react";
import * as React from "react";
import MoonIcon from "../../../../images/MoonIcon.svg";
import SunIcon from "../../../../images/SunIcon.svg";
import { useThemeStore } from "../../../hooks/useTheme";
import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent";
export const ThemeToggleButton = (): CommandButtonComponentProps => {
const PORTAL_SETTINGS_URL = "https://learn.microsoft.com/azure/azure-portal/set-preferences";
export const ThemeToggleButton = (isPortal?: boolean): CommandButtonComponentProps => {
const [darkMode, setDarkMode] = React.useState(useThemeStore.getState().isDarkMode);
React.useEffect(() => {
@@ -16,6 +19,34 @@ export const ThemeToggleButton = (): CommandButtonComponentProps => {
const tooltipText = darkMode ? "Switch to Light Theme" : "Switch to Dark Theme";
if (isPortal) {
return {
iconSrc: darkMode ? SunIcon : MoonIcon,
iconAlt: "Theme Toggle",
onCommandClick: undefined,
commandButtonLabel: undefined,
ariaLabel: "Dark Mode is managed in Azure Portal Settings",
tooltipText: undefined,
tooltipContent: React.createElement(
"div",
{ style: { padding: "4px 0" } },
React.createElement(Text, { block: true, variant: "small" }, "Dark Mode is managed in Azure Portal Settings"),
React.createElement(
Link,
{
href: PORTAL_SETTINGS_URL,
target: "_blank",
rel: "noopener noreferrer",
style: { display: "inline-block", marginTop: "4px", fontSize: "12px" },
},
"Open settings",
),
),
hasPopup: false,
disabled: true,
};
}
return {
iconSrc: darkMode ? SunIcon : MoonIcon,
iconAlt: "Theme Toggle",

View File

@@ -42,8 +42,7 @@ import {
} from "Explorer/Panes/AddCollectionPanel/AddCollectionPanelUtility";
import { useSidePanel } from "hooks/useSidePanel";
import { useTeachingBubble } from "hooks/useTeachingBubble";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { DEFAULT_FABRIC_NATIVE_CONTAINER_THROUGHPUT, isFabricNative } from "Platform/Fabric/FabricUtil";
import React from "react";
import { CollectionCreation } from "Shared/Constants";
@@ -185,25 +184,25 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
{this.state.teachingBubbleStep === 1 && (
<TeachingBubble
headline="Create sample database"
headline={t(Keys.panes.addCollection.teachingBubble.step1Headline)}
target={"#newDatabaseId"}
calloutProps={{ gapSpace: 16 }}
primaryButtonProps={{ text: "Next", onClick: () => this.setState({ teachingBubbleStep: 2 }) }}
secondaryButtonProps={{ text: "Cancel", onClick: () => this.setState({ teachingBubbleStep: 0 }) }}
primaryButtonProps={{ text: t(Keys.common.next), onClick: () => this.setState({ teachingBubbleStep: 2 }) }}
secondaryButtonProps={{
text: t(Keys.common.cancel),
onClick: () => this.setState({ teachingBubbleStep: 0 }),
}}
onDismiss={() => this.setState({ teachingBubbleStep: 0 })}
footerContent="Step 1 of 4"
footerContent={t(Keys.panes.addCollection.teachingBubble.stepOfTotal, { current: "1", total: "4" })}
>
<Stack>
<Text style={{ color: "white" }}>
Database is the parent of a container. You can create a new database or use an existing one. In this
tutorial we are creating a new database named SampleDB.
</Text>
<Text style={{ color: "white" }}>{t(Keys.panes.addCollection.teachingBubble.step1Body)}</Text>
<Link
style={{ color: "white", fontWeight: 600 }}
target="_blank"
href="https://aka.ms/TeachingbubbleResources"
>
Learn more about resources.
{t(Keys.panes.addCollection.teachingBubble.step1LearnMore)}
</Link>
</Stack>
</TeachingBubble>
@@ -211,21 +210,21 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
{this.state.teachingBubbleStep === 2 && (
<TeachingBubble
headline="Setting throughput"
headline={t(Keys.panes.addCollection.teachingBubble.step2Headline)}
target={"#autoscaleRUValueField"}
calloutProps={{ gapSpace: 16 }}
primaryButtonProps={{ text: "Next", onClick: () => this.setState({ teachingBubbleStep: 3 }) }}
secondaryButtonProps={{ text: "Previous", onClick: () => this.setState({ teachingBubbleStep: 1 }) }}
primaryButtonProps={{ text: t(Keys.common.next), onClick: () => this.setState({ teachingBubbleStep: 3 }) }}
secondaryButtonProps={{
text: t(Keys.common.previous),
onClick: () => this.setState({ teachingBubbleStep: 1 }),
}}
onDismiss={() => this.setState({ teachingBubbleStep: 0 })}
footerContent="Step 2 of 4"
footerContent={t(Keys.panes.addCollection.teachingBubble.stepOfTotal, { current: "2", total: "4" })}
>
<Stack>
<Text style={{ color: "white" }}>
Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of
throughput based on the max RU/s set (Request Units).
</Text>
<Text style={{ color: "white" }}>{t(Keys.panes.addCollection.teachingBubble.step2Body)}</Text>
<Link style={{ color: "white", fontWeight: 600 }} target="_blank" href="https://aka.ms/teachingbubbleRU">
Learn more about RU/s.
{t(Keys.panes.addCollection.teachingBubble.step2LearnMore)}
</Link>
</Stack>
</TeachingBubble>
@@ -233,36 +232,41 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
{this.state.teachingBubbleStep === 3 && (
<TeachingBubble
headline="Naming container"
headline={t(Keys.panes.addCollection.teachingBubble.step3Headline)}
target={"#collectionId"}
calloutProps={{ gapSpace: 16 }}
primaryButtonProps={{ text: "Next", onClick: () => this.setState({ teachingBubbleStep: 4 }) }}
secondaryButtonProps={{ text: "Previous", onClick: () => this.setState({ teachingBubbleStep: 2 }) }}
primaryButtonProps={{ text: t(Keys.common.next), onClick: () => this.setState({ teachingBubbleStep: 4 }) }}
secondaryButtonProps={{
text: t(Keys.common.previous),
onClick: () => this.setState({ teachingBubbleStep: 2 }),
}}
onDismiss={() => this.setState({ teachingBubbleStep: 0 })}
footerContent="Step 3 of 4"
footerContent={t(Keys.panes.addCollection.teachingBubble.stepOfTotal, { current: "3", total: "4" })}
>
Name your container
{t(Keys.panes.addCollection.teachingBubble.step3Body)}
</TeachingBubble>
)}
{this.state.teachingBubbleStep === 4 && (
<TeachingBubble
headline="Setting partition key"
headline={t(Keys.panes.addCollection.teachingBubble.step4Headline)}
target={"#addCollection-partitionKeyValue"}
calloutProps={{ gapSpace: 16 }}
primaryButtonProps={{
text: "Create container",
text: t(Keys.panes.addCollection.teachingBubble.step4CreateContainer),
onClick: () => {
this.setState({ teachingBubbleStep: 5 });
this.submit();
},
}}
secondaryButtonProps={{ text: "Previous", onClick: () => this.setState({ teachingBubbleStep: 2 }) }}
secondaryButtonProps={{
text: t(Keys.common.previous),
onClick: () => this.setState({ teachingBubbleStep: 2 }),
}}
onDismiss={() => this.setState({ teachingBubbleStep: 0 })}
footerContent="Step 4 of 4"
footerContent={t(Keys.panes.addCollection.teachingBubble.stepOfTotal, { current: "4", total: "4" })}
>
Last step - you will need to define a partition key for your collection. /address was chosen for this
particular example. A good partition key should have a wide range of possible value
{t(Keys.panes.addCollection.teachingBubble.step4Body)}
</TeachingBubble>
)}
@@ -272,7 +276,9 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
<Stack horizontal>
<span className="mandatoryStar">*&nbsp;</span>
<Text className="panelTextBold" variant="small">
Database {userContext.apiType === "Mongo" ? "name" : "id"}
{userContext.apiType === "Mongo"
? t(Keys.panes.addCollection.databaseFieldLabelName)
: t(Keys.panes.addCollection.databaseFieldLabelId)}
</Text>
<TooltipHost
directionalHint={DirectionalHint.bottomLeftEdge}
@@ -297,7 +303,7 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
<input
className="panelRadioBtn"
checked={this.state.createNewDatabase}
aria-label="Create new database"
aria-label={t(Keys.panes.addCollection.createNewDatabaseAriaLabel)}
aria-checked={this.state.createNewDatabase}
name="databaseType"
type="radio"
@@ -311,7 +317,7 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
<input
className="panelRadioBtn"
checked={!this.state.createNewDatabase}
aria-label="Use existing database"
aria-label={t(Keys.panes.addCollection.useExistingDatabaseAriaLabel)}
aria-checked={!this.state.createNewDatabase}
name="databaseType"
type="radio"
@@ -335,10 +341,10 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
autoComplete="off"
pattern={ValidCosmosDbIdInputPattern.source}
title={ValidCosmosDbIdDescription}
placeholder="Type a new database id"
placeholder={t(Keys.panes.addCollection.newDatabaseIdPlaceholder)}
size={40}
className="panelTextField"
aria-label="New database id, Type a new database id"
aria-label={t(Keys.panes.addCollection.newDatabaseIdAriaLabel)}
tabIndex={0}
value={this.state.newDatabaseId}
onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
@@ -404,10 +410,10 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
)}
{!this.state.createNewDatabase && (
<Dropdown
ariaLabel="Choose an existing database"
ariaLabel={t(Keys.panes.addCollection.chooseExistingDatabase)}
styles={{ title: { height: 27, lineHeight: 27 }, dropdownItem: { fontSize: 12 } }}
style={{ width: 300, fontSize: 12 }}
placeholder="Choose an existing database"
placeholder={t(Keys.panes.addCollection.chooseExistingDatabase)}
options={this.getDatabaseOptions()}
onChange={(event: React.FormEvent<HTMLDivElement>, database: IDropdownOption) =>
this.setState({ selectedDatabaseId: database.key as string })
@@ -1027,16 +1033,15 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
<PanelLoadingScreen />
{this.state.teachingBubbleStep === 5 && (
<TeachingBubble
headline="Creating sample container"
headline={t(Keys.panes.addCollection.teachingBubble.step5Headline)}
target={"#loadingScreen"}
onDismiss={() => this.setState({ teachingBubbleStep: 0 })}
styles={{ footer: { width: "100%" } }}
>
A sample container is now being created and we are adding sample data for you. It should take about 1
minute.
{t(Keys.panes.addCollection.teachingBubble.step5Body)}
<br />
<br />
Once the sample container is created, review your sample dataset and follow next steps
{t(Keys.panes.addCollection.teachingBubble.step5BodyFollowUp)}
<br />
<br />
<ProgressIndicator

View File

@@ -3,8 +3,7 @@ import * as Constants from "Common/Constants";
import { configContext, Platform } from "ConfigContext";
import * as DataModels from "Contracts/DataModels";
import { getFullTextLanguageOptions } from "Explorer/Controls/FullTextSeach/FullTextPoliciesComponent";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { isFabricNative } from "Platform/Fabric/FabricUtil";
import React from "react";
import { userContext } from "UserContext";

View File

@@ -29,8 +29,7 @@ exports[`AddCollectionPanel should render Default properly 1`] = `
className="panelTextBold"
variant="small"
>
Database
id
Database id
</Text>
<StyledTooltipHostBase
content="A database is analogous to a namespace. It is the unit of management for a set of containers."

View File

@@ -1,7 +1,6 @@
import { Checkbox, Stack, Text, TextField } from "@fluentui/react";
import { getNewDatabaseSharedThroughputDefault } from "Common/DatabaseUtility";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils";
import React, { FunctionComponent, useEffect, useState } from "react";
import * as Constants from "../../../Common/Constants";
@@ -156,7 +155,9 @@ export const AddDatabasePanel: FunctionComponent<AddDatabasePaneProps> = ({
if (throughput > SharedConstants.CollectionCreation.DefaultCollectionRUs100K && !isCostAcknowledged) {
setFormErrors(
t(Keys.panes.addDatabase.acknowledgeSpendError, { period: isAutoscaleSelected ? "monthly" : "daily" }),
isAutoscaleSelected
? t(Keys.panes.addDatabase.acknowledgeSpendErrorMonthly)
: t(Keys.panes.addDatabase.acknowledgeSpendErrorDaily),
);
return false;
}
@@ -227,7 +228,7 @@ export const AddDatabasePanel: FunctionComponent<AddDatabasePaneProps> = ({
{!isServerlessAccount() && (
<Stack horizontal>
<Checkbox
title="Provision shared throughput"
title={t(Keys.panes.addDatabase.provisionSharedThroughputTitle)}
styles={{
text: { fontSize: 12, color: "var(--colorNeutralForeground1)" },
checkbox: { width: 12, height: 12 },
@@ -238,7 +239,7 @@ export const AddDatabasePanel: FunctionComponent<AddDatabasePaneProps> = ({
},
},
}}
label="Provision throughput"
label={t(Keys.panes.addDatabase.provisionThroughputLabel)}
checked={databaseCreateNewShared}
onChange={() => setDatabaseCreateNewShared(!databaseCreateNewShared)}
/>

View File

@@ -40,8 +40,7 @@ import { PanelInfoErrorComponent } from "Explorer/Panes/PanelInfoErrorComponent"
import { PanelLoadingScreen } from "Explorer/Panes/PanelLoadingScreen";
import { useDatabases } from "Explorer/useDatabases";
import { useSidePanel } from "hooks/useSidePanel";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import React, { MutableRefObject, useEffect, useRef, useState } from "react";
import { CollectionCreation } from "Shared/Constants";
import { Action } from "Shared/Telemetry/TelemetryConstants";

View File

@@ -146,6 +146,7 @@ exports[`AddGlobalSecondaryIndexPanel render default panel 1`] = `
explorer={
Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],

View File

@@ -3,8 +3,7 @@ import * as Constants from "Common/Constants";
import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils";
import { InfoTooltip } from "Common/Tooltip/InfoTooltip";
import { useSidePanel } from "hooks/useSidePanel";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import React, { FunctionComponent, useState } from "react";
import * as SharedConstants from "Shared/Constants";
import { Action } from "Shared/Telemetry/TelemetryConstants";

View File

@@ -26,8 +26,7 @@ import {
import Explorer from "Explorer/Explorer";
import { RightPaneForm } from "Explorer/Panes/RightPaneForm/RightPaneForm";
import { useDatabases } from "Explorer/useDatabases";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { userContext } from "UserContext";
import { getCollectionName } from "Utils/APITypeUtils";
import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils";

View File

@@ -4,8 +4,7 @@ import { HttpStatusCodes, PoolIdType } from "../../../Common/Constants";
import { getErrorMessage, handleError } from "../../../Common/ErrorHandlingUtils";
import { GitHubOAuthService } from "../../../GitHub/GitHubOAuthService";
import { IPinnedRepo, JunoClient } from "../../../Juno/JunoClient";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import * as GitHubUtils from "../../../Utils/GitHubUtils";
import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils";
import { useSidePanel } from "../../../hooks/useSidePanel";

View File

@@ -12,8 +12,7 @@ import {
import { GitHubReposTitle } from "Explorer/Tree/ResourceTree";
import React, { FormEvent, FunctionComponent } from "react";
import { IPinnedRepo } from "../../../Juno/JunoClient";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import * as GitHubUtils from "../../../Utils/GitHubUtils";
import { useNotebook } from "../../Notebook/useNotebook";

View File

@@ -4,8 +4,7 @@ import DeleteFeedback from "Common/DeleteFeedback";
import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils";
import { deleteCollection } from "Common/dataAccess/deleteCollection";
import { Collection } from "Contracts/ViewModels";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { DefaultExperienceUtility } from "Shared/DefaultExperienceUtility";
import { Action, ActionModifiers } from "Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "Shared/Telemetry/TelemetryProcessor";
@@ -19,6 +18,24 @@ import { useDatabases } from "../../useDatabases";
import { useSelectedNode } from "../../useSelectedNode";
import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm";
const themedTextFieldStyles = {
fieldGroup: {
width: 300,
backgroundColor: "var(--colorNeutralBackground1)",
borderColor: "var(--colorNeutralStroke1)",
selectors: {
":hover": { borderColor: "var(--colorNeutralStroke1Hover)" },
},
},
field: {
color: "var(--colorNeutralForeground1)",
backgroundColor: "var(--colorNeutralBackground1)",
},
subComponentStyles: {
label: { root: { color: "var(--colorNeutralForeground1)" } },
},
};
export interface DeleteCollectionConfirmationPaneProps {
refreshDatabases: () => Promise<void>;
}
@@ -127,12 +144,14 @@ export const DeleteCollectionConfirmationPane: FunctionComponent<DeleteCollectio
<div className="panelMainContent">
<div className="confirmDeleteInput">
<span className="mandatoryStar">* </span>
<Text variant="small">{confirmContainer}</Text>
<Text variant="small" style={{ color: "var(--colorNeutralForeground1)" }}>
{confirmContainer}
</Text>
<TextField
id="confirmCollectionId"
autoFocus
value={inputCollectionName}
styles={{ fieldGroup: { width: 300 } }}
styles={themedTextFieldStyles}
onChange={(event, newInput?: string) => {
setInputCollectionName(newInput);
}}
@@ -142,15 +161,15 @@ export const DeleteCollectionConfirmationPane: FunctionComponent<DeleteCollectio
</div>
{shouldRecordFeedback() && (
<div className="deleteCollectionFeedback">
<Text variant="small" block>
<Text variant="small" block style={{ color: "var(--colorNeutralForeground1)" }}>
{t(Keys.panes.deleteCollection.feedbackTitle)}
</Text>
<Text variant="small" block>
<Text variant="small" block style={{ color: "var(--colorNeutralForeground1)" }}>
{t(Keys.panes.deleteCollection.feedbackReason, { collectionName })}
</Text>
<TextField
id="deleteCollectionFeedbackInput"
styles={{ fieldGroup: { width: 300 } }}
styles={themedTextFieldStyles}
multiline
value={deleteCollectionFeedback}
rows={3}

View File

@@ -29,10 +29,20 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect
*
</span>
<Text
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
variant="small"
>
<span
className="css-109"
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
>
Confirm by typing the container id
</span>
@@ -45,9 +55,27 @@ exports[`Delete Collection Confirmation Pane submit() should call delete collect
required={true}
styles={
{
"field": {
"backgroundColor": "var(--colorNeutralBackground1)",
"color": "var(--colorNeutralForeground1)",
},
"fieldGroup": {
"backgroundColor": "var(--colorNeutralBackground1)",
"borderColor": "var(--colorNeutralStroke1)",
"selectors": {
":hover": {
"borderColor": "var(--colorNeutralStroke1Hover)",
},
},
"width": 300,
},
"subComponentStyles": {
"label": {
"root": {
"color": "var(--colorNeutralForeground1)",
},
},
},
}
}
value=""

View File

@@ -5,8 +5,7 @@ import DeleteFeedback from "Common/DeleteFeedback";
import { getErrorMessage, getErrorStack } from "Common/ErrorHandlingUtils";
import { deleteDatabase } from "Common/dataAccess/deleteDatabase";
import { Collection, Database } from "Contracts/ViewModels";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { DefaultExperienceUtility } from "Shared/DefaultExperienceUtility";
import { Action, ActionModifiers } from "Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "Shared/Telemetry/TelemetryProcessor";
@@ -21,6 +20,24 @@ import { useSelectedNode } from "../useSelectedNode";
import { PanelInfoErrorComponent, PanelInfoErrorProps } from "./PanelInfoErrorComponent";
import { RightPaneForm, RightPaneFormProps } from "./RightPaneForm/RightPaneForm";
const themedTextFieldStyles = {
fieldGroup: {
width: 300,
backgroundColor: "var(--colorNeutralBackground1)",
borderColor: "var(--colorNeutralStroke1)",
selectors: {
":hover": { borderColor: "var(--colorNeutralStroke1Hover)" },
},
},
field: {
color: "var(--colorNeutralForeground1)",
backgroundColor: "var(--colorNeutralBackground1)",
},
subComponentStyles: {
label: { root: { color: "var(--colorNeutralForeground1)" } },
},
};
interface DeleteDatabaseConfirmationPanelProps {
refreshDatabases: () => Promise<void>;
}
@@ -144,12 +161,14 @@ export const DeleteDatabaseConfirmationPanel: FunctionComponent<DeleteDatabaseCo
<div className="panelMainContent">
<div className="confirmDeleteInput">
<span className="mandatoryStar">* </span>
<Text variant="small">{confirmDatabase}</Text>
<Text variant="small" style={{ color: "var(--colorNeutralForeground1)" }}>
{confirmDatabase}
</Text>
<TextField
id="confirmDatabaseId"
data-test="Input:confirmDatabaseId"
autoFocus
styles={{ fieldGroup: { width: 300 } }}
styles={themedTextFieldStyles}
onChange={(event, newInput?: string) => {
setDatabaseInput(newInput);
}}
@@ -159,15 +178,15 @@ export const DeleteDatabaseConfirmationPanel: FunctionComponent<DeleteDatabaseCo
</div>
{isLastNonEmptyDatabase() && (
<div className="deleteDatabaseFeedback">
<Text variant="small" block>
<Text variant="small" block style={{ color: "var(--colorNeutralForeground1)" }}>
{t(Keys.panes.deleteDatabase.feedbackTitle)}
</Text>
<Text variant="small" block>
<Text variant="small" block style={{ color: "var(--colorNeutralForeground1)" }}>
{t(Keys.panes.deleteDatabase.feedbackReason, { databaseName: getDatabaseName() })}
</Text>
<TextField
id="deleteDatabaseFeedbackInput"
styles={{ fieldGroup: { width: 300 } }}
styles={themedTextFieldStyles}
multiline
rows={3}
onChange={(event, newInput?: string) => {

View File

@@ -3,8 +3,7 @@ import { useBoolean } from "@fluentui/react-hooks";
import React, { FunctionComponent, useRef, useState } from "react";
import AddPropertyIcon from "../../../../images/Add-property.svg";
import { useSidePanel } from "../../../hooks/useSidePanel";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { logConsoleError } from "../../../Utils/NotificationConsoleUtils";
import StoredProcedure from "../../Tree/StoredProcedure";
import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm";

View File

@@ -11,8 +11,7 @@ import {
import React, { FunctionComponent } from "react";
import AddPropertyIcon from "../../../../images/Add-property.svg";
import EntityCancelIcon from "../../../../images/Entity_cancel.svg";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
const dropdownStyles: Partial<IDropdownStyles> = { dropdown: { width: 100 } };
const options = [

View File

@@ -18,6 +18,7 @@ exports[`GitHub Repos Panel should render Default properly 1`] = `
{
"container": Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],

View File

@@ -1,7 +1,6 @@
import React, { FunctionComponent } from "react";
import * as ViewModels from "../../../Contracts/ViewModels";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { useSidePanel } from "../../../hooks/useSidePanel";
import { GraphStyleComponent } from "../../Graph/GraphStyleComponent/GraphStyleComponent";
import { IGraphConfig } from "../../Tabs/GraphTab";

View File

@@ -5,8 +5,7 @@ import folderIcon from "../../../../images/folder_16x16.svg";
import { logError } from "../../../Common/Logger";
import { Collection } from "../../../Contracts/ViewModels";
import { useSidePanel } from "../../../hooks/useSidePanel";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { userContext } from "../../../UserContext";
import { logConsoleError, logConsoleInfo, logConsoleProgress } from "../../../Utils/NotificationConsoleUtils";
import { useSelectedNode } from "../../useSelectedNode";

View File

@@ -1,8 +1,7 @@
import { useBoolean } from "@fluentui/react-hooks";
import React, { FunctionComponent, useState } from "react";
import * as ViewModels from "../../../Contracts/ViewModels";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { useSidePanel } from "../../../hooks/useSidePanel";
import { NewVertexComponent } from "../../Graph/NewVertexComponent/NewVertexComponent";
import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm";

View File

@@ -1,6 +1,5 @@
import { Icon, Link, Stack, Text } from "@fluentui/react";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import React from "react";
import { useNotificationConsole } from "../../hooks/useNotificationConsole";

View File

@@ -5,8 +5,7 @@ import { getErrorMessage, getErrorStack, handleError } from "../../../Common/Err
import { useNotebookSnapshotStore } from "../../../hooks/useNotebookSnapshotStore";
import { useSidePanel } from "../../../hooks/useSidePanel";
import { JunoClient } from "../../../Juno/JunoClient";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { Action } from "../../../Shared/Telemetry/TelemetryConstants";
import { traceFailure, traceStart, traceSuccess } from "../../../Shared/Telemetry/TelemetryProcessor";
import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils";

View File

@@ -1,8 +1,7 @@
import { Dropdown, IDropdownProps, ITextFieldProps, Stack, Text, TextField } from "@fluentui/react";
import { ImmutableNotebook } from "@nteract/commutable";
import React, { FunctionComponent, useState } from "react";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { GalleryCardComponent } from "../../Controls/NotebookGallery/Cards/GalleryCardComponent";
import * as FileSystemUtil from "../../Notebook/FileSystemUtil";
import { SnapshotRequest } from "../../Notebook/NotebookComponent/types";

View File

@@ -4,8 +4,7 @@ import React, { FunctionComponent, useState } from "react";
import { Areas, SavedQueries } from "../../../Common/Constants";
import { getErrorMessage, getErrorStack } from "../../../Common/ErrorHandlingUtils";
import { Query } from "../../../Contracts/DataModels";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { Action } from "../../../Shared/Telemetry/TelemetryConstants";
import { traceFailure, traceStart, traceSuccess } from "../../../Shared/Telemetry/TelemetryProcessor";
import { logConsoleError } from "../../../Utils/NotificationConsoleUtils";

View File

@@ -24,8 +24,7 @@ import { InfoTooltip } from "Common/Tooltip/InfoTooltip";
import { Platform, configContext } from "ConfigContext";
import { useDialog } from "Explorer/Controls/Dialog";
import { useDatabases } from "Explorer/useDatabases";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { isFabric, isFabricNative } from "Platform/Fabric/FabricUtil";
import {
AppStateComponentNames,

View File

@@ -8,6 +8,7 @@ exports[`StringInput Pane should render Create new directory properly 1`] = `
explorer={
Explorer {
"_isInitializingNotebooks": false,
"databasesRefreshed": Promise {},
"isFixedCollectionWithSharedThroughputSupported": [Function],
"isTabsContentExpanded": [Function],
"onRefreshDatabasesKeyPress": [Function],

View File

@@ -11,8 +11,7 @@ import {
import { configContext } from "ConfigContext";
import { ColumnDefinition } from "Explorer/Tabs/DocumentsTabV2/DocumentsTableComponent";
import { CosmosFluentProvider, getPlatformTheme } from "Explorer/Theme/ThemeUtil";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import React from "react";
import { useSidePanel } from "../../../hooks/useSidePanel";

View File

@@ -1,7 +1,6 @@
import { IDropdownOption, Image, Label, Stack, Text, TextField } from "@fluentui/react";
import { useBoolean } from "@fluentui/react-hooks";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { logConsoleError } from "Utils/NotificationConsoleUtils";
import React, { FunctionComponent, useEffect, useState } from "react";
import * as _ from "underscore";

View File

@@ -1,7 +1,6 @@
import { IDropdownOption, Image, Label, Stack, Text, TextField } from "@fluentui/react";
import { useBoolean } from "@fluentui/react-hooks";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { logConsoleError } from "Utils/NotificationConsoleUtils";
import React, { FunctionComponent, useEffect, useState } from "react";
import * as _ from "underscore";

View File

@@ -1,6 +1,5 @@
import { Checkbox, Text } from "@fluentui/react";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import React, { FunctionComponent, useEffect, useState } from "react";
import { userContext } from "../../../../UserContext";
import { useSidePanel } from "../../../../hooks/useSidePanel";

View File

@@ -13,8 +13,7 @@ import {
} from "@fluentui/react";
import { Upload } from "Common/Upload/Upload";
import { UploadDetailsRecord } from "Contracts/ViewModels";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { logConsoleError } from "Utils/NotificationConsoleUtils";
import React, { ChangeEvent, FunctionComponent, useReducer, useState } from "react";
import { getErrorMessage } from "../../Tables/Utilities";

View File

@@ -356,10 +356,20 @@ exports[`Delete Database Confirmation Pane Should call delete database 1`] = `
*
</span>
<Text
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
variant="small"
>
<span
className="css-113"
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
>
Confirm by typing the Database id (name)
</span>
@@ -373,9 +383,27 @@ exports[`Delete Database Confirmation Pane Should call delete database 1`] = `
required={true}
styles={
{
"field": {
"backgroundColor": "var(--colorNeutralBackground1)",
"color": "var(--colorNeutralForeground1)",
},
"fieldGroup": {
"backgroundColor": "var(--colorNeutralBackground1)",
"borderColor": "var(--colorNeutralStroke1)",
"selectors": {
":hover": {
"borderColor": "var(--colorNeutralStroke1Hover)",
},
},
"width": 300,
},
"subComponentStyles": {
"label": {
"root": {
"color": "var(--colorNeutralForeground1)",
},
},
},
}
}
>
@@ -699,20 +727,40 @@ exports[`Delete Database Confirmation Pane Should call delete database 1`] = `
>
<Text
block={true}
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
variant="small"
>
<span
className="css-126"
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
>
Help us improve Azure Cosmos DB!
</span>
</Text>
<Text
block={true}
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
variant="small"
>
<span
className="css-126"
style={
{
"color": "var(--colorNeutralForeground1)",
}
}
>
What is the reason why you are deleting this Database?
</span>
@@ -725,9 +773,27 @@ exports[`Delete Database Confirmation Pane Should call delete database 1`] = `
rows={3}
styles={
{
"field": {
"backgroundColor": "var(--colorNeutralBackground1)",
"color": "var(--colorNeutralForeground1)",
},
"fieldGroup": {
"backgroundColor": "var(--colorNeutralBackground1)",
"borderColor": "var(--colorNeutralStroke1)",
"selectors": {
":hover": {
"borderColor": "var(--colorNeutralStroke1Hover)",
},
},
"width": 300,
},
"subComponentStyles": {
"label": {
"root": {
"color": "var(--colorNeutralForeground1)",
},
},
},
}
}
>

View File

@@ -6,8 +6,7 @@ import { DocumentAddRegular, LinkMultipleRegular, OpenRegular } from "@fluentui/
import { SampleDataConfiguration, SampleDataImportDialog } from "Explorer/SplashScreen/SampleDataImportDialog";
import { SampleDataFile } from "Explorer/SplashScreen/SampleUtil";
import { CosmosFluentProvider } from "Explorer/Theme/ThemeUtil";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { isFabricNative, isFabricNativeReadOnly } from "Platform/Fabric/FabricUtil";
import * as React from "react";
import { userContext } from "UserContext";

View File

@@ -12,8 +12,7 @@ import {
} from "@fluentui/react-components";
import Explorer from "Explorer/Explorer";
import { checkContainerExists, createContainer, importData, SampleDataFile } from "Explorer/SplashScreen/SampleUtil";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import React, { useEffect, useState } from "react";
import * as ViewModels from "../../Contracts/ViewModels";

View File

@@ -16,8 +16,7 @@ import { sendMessage } from "Common/MessageHandler";
import { MessageTypes } from "Contracts/ExplorerContracts";
import { TerminalKind } from "Contracts/ViewModels";
import { SplashScreenButton } from "Explorer/SplashScreen/SplashScreenButton";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { Action } from "Shared/Telemetry/TelemetryConstants";
import { traceOpen } from "Shared/Telemetry/TelemetryProcessor";
import { useCarousel } from "hooks/useCarousel";

View File

@@ -18,8 +18,7 @@ import { queryConflicts } from "../../Common/dataAccess/queryConflicts";
import { updateDocument } from "../../Common/dataAccess/updateDocument";
import * as DataModels from "../../Contracts/DataModels";
import * as ViewModels from "../../Contracts/ViewModels";
import { Keys } from "../../Localization/Keys.generated";
import { t } from "../../Localization/t";
import { Keys, t } from "Localization";
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";

View File

@@ -41,8 +41,7 @@ import { usePrevious } from "Explorer/Tabs/DocumentsTabV2/SelectionHelper";
import { CosmosFluentProvider, LayoutConstants, cosmosShorthands, tokens } from "Explorer/Theme/ThemeUtil";
import { useSelectedNode } from "Explorer/useSelectedNode";
import { KeyboardAction, KeyboardActionGroup, useKeyboardActionGroup } from "KeyboardShortcuts";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { isFabric } from "Platform/Fabric/FabricUtil";
import { QueryConstants } from "Shared/Constants";
import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility";

View File

@@ -1,8 +1,7 @@
import React, { Component } from "react";
import { configContext } from "../../../ConfigContext";
import * as ViewModels from "../../../Contracts/ViewModels";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { Keys, t } from "Localization";
import { Action, ActionModifiers } from "../../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor";
import { userContext } from "../../../UserContext";

View File

@@ -17,8 +17,7 @@ import { QueryTabStyles, useQueryTabStyles } from "Explorer/Tabs/QueryTab/Styles
import { CosmosFluentProvider } from "Explorer/Theme/ThemeUtil";
import { useSelectedNode } from "Explorer/useSelectedNode";
import { KeyboardAction } from "KeyboardShortcuts";
import { Keys } from "Localization/Keys.generated";
import { t } from "Localization/t";
import { Keys, t } from "Localization";
import { QueryConstants } from "Shared/Constants";
import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility";
import { Action } from "Shared/Telemetry/TelemetryConstants";

View File

@@ -1,6 +1,7 @@
import { Resource, StoredProcedureDefinition } from "@azure/cosmos";
import { Pivot, PivotItem } from "@fluentui/react";
import { KeyboardAction } from "KeyboardShortcuts";
import { Keys, t } from "Localization";
import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils";
import React from "react";
import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg";
@@ -11,8 +12,6 @@ import { createStoredProcedure } from "../../../Common/dataAccess/createStoredPr
import { ExecuteSprocResult } from "../../../Common/dataAccess/executeStoredProcedure";
import { updateStoredProcedure } from "../../../Common/dataAccess/updateStoredProcedure";
import * as ViewModels from "../../../Contracts/ViewModels";
import { Keys } from "../../../Localization/Keys.generated";
import { t } from "../../../Localization/t";
import { useNotificationConsole } from "../../../hooks/useNotificationConsole";
import { useTabs } from "../../../hooks/useTabs";
import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent";

View File

@@ -2,6 +2,7 @@ import { TriggerDefinition } from "@azure/cosmos";
import { IDropdownOption, IDropdownStyles, Label, TextField } from "@fluentui/react";
import { Dropdown } from "@fluentui/react/lib/Dropdown";
import { KeyboardAction } from "KeyboardShortcuts";
import { Keys, t } from "Localization";
import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils";
import React, { Component } from "react";
import DiscardIcon from "../../../images/discard.svg";
@@ -11,8 +12,6 @@ import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils"
import { createTrigger } from "../../Common/dataAccess/createTrigger";
import { updateTrigger } from "../../Common/dataAccess/updateTrigger";
import * as ViewModels from "../../Contracts/ViewModels";
import { Keys } from "../../Localization/Keys.generated";
import { t } from "../../Localization/t";
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import { SqlTriggerResource } from "../../Utils/arm/generatedClients/cosmos/types";

View File

@@ -2,6 +2,7 @@ import { UserDefinedFunctionDefinition } from "@azure/cosmos";
import { Label, TextField } from "@fluentui/react";
import { FluentProvider, webDarkTheme, webLightTheme } from "@fluentui/react-components";
import { KeyboardAction } from "KeyboardShortcuts";
import { Keys, t } from "Localization";
import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils";
import { useThemeStore } from "hooks/useTheme";
import React, { Component } from "react";
@@ -12,8 +13,6 @@ import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils"
import { createUserDefinedFunction } from "../../Common/dataAccess/createUserDefinedFunction";
import { updateUserDefinedFunction } from "../../Common/dataAccess/updateUserDefinedFunction";
import * as ViewModels from "../../Contracts/ViewModels";
import { Keys } from "../../Localization/Keys.generated";
import { t } from "../../Localization/t";
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";

View File

@@ -1,5 +1,12 @@
import { Tree, TreeItemValue, TreeOpenChangeData, TreeOpenChangeEvent } from "@fluentui/react-components";
import { Home16Regular } from "@fluentui/react-icons";
import {
Button,
Input,
Tree,
TreeItemValue,
TreeOpenChangeData,
TreeOpenChangeEvent,
} from "@fluentui/react-components";
import { ArrowSortDown20Regular, ArrowSortUp20Regular, Home16Regular, Search20Regular } from "@fluentui/react-icons";
import { AuthType } from "AuthType";
import { useTreeStyles } from "Explorer/Controls/TreeComponent/Styles";
import { TreeNode, TreeNodeComponent } from "Explorer/Controls/TreeComponent/TreeNodeComponent";
@@ -55,6 +62,11 @@ export const ResourceTree: React.FC<ResourceTreeProps> = ({ explorer }: Resource
sampleDataResourceTokenCollection: state.sampleDataResourceTokenCollection,
}));
const databasesFetchedSuccessfully = useDatabases((state) => state.databasesFetchedSuccessfully);
const searchText = useDatabases((state) => state.searchText);
const setSearchText = useDatabases((state) => state.setSearchText);
const sortOrder = useDatabases((state) => state.sortOrder);
const setSortOrder = useDatabases((state) => state.setSortOrder);
const pinnedDatabaseIds = useDatabases((state) => state.pinnedDatabaseIds);
const { isCopilotEnabled, isCopilotSampleDBEnabled } = useQueryCopilot((state) => ({
isCopilotEnabled: state.copilotEnabled,
isCopilotSampleDBEnabled: state.copilotSampleDBEnabled,
@@ -63,8 +75,24 @@ export const ResourceTree: React.FC<ResourceTreeProps> = ({ explorer }: Resource
const databaseTreeNodes = useMemo(() => {
return userContext.authType === AuthType.ResourceToken
? createResourceTokenTreeNodes(resourceTokenCollection)
: createDatabaseTreeNodes(explorer, isNotebookEnabled, databases, refreshActiveTab);
}, [resourceTokenCollection, databases, isNotebookEnabled, refreshActiveTab]);
: createDatabaseTreeNodes(
explorer,
isNotebookEnabled,
databases,
refreshActiveTab,
searchText,
sortOrder,
pinnedDatabaseIds,
);
}, [
resourceTokenCollection,
databases,
isNotebookEnabled,
refreshActiveTab,
searchText,
sortOrder,
pinnedDatabaseIds,
]);
const isSampleDataEnabled =
isCopilotEnabled &&
@@ -114,46 +142,65 @@ export const ResourceTree: React.FC<ResourceTreeProps> = ({ explorer }: Resource
} else {
return [...headerNodes, ...databaseTreeNodes];
}
// headerNodes is intentionally excluded — it depends only on isFabricMirrored() which is stable.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [databaseTreeNodes, sampleDataNodes]);
// Track complete DatabaseLoad scenario (start, tree rendered, interactive)
useDatabaseLoadScenario(databaseTreeNodes, databasesFetchedSuccessfully);
useEffect(() => {
// Compute open items based on node.isExpanded
const updateOpenItems = (node: TreeNode, parentNodeId: string): void => {
// This will look for ANY expanded node, event if its parent node isn't expanded
// and add it to the openItems list
const expandedIds: TreeItemValue[] = [];
const collectExpandedIds = (node: TreeNode, parentNodeId: string | undefined): void => {
const globalId = parentNodeId === undefined ? node.label : `${parentNodeId}/${node.label}`;
if (node.isExpanded) {
let found = false;
for (const id of openItems) {
if (id === globalId) {
found = true;
break;
}
}
if (!found) {
setOpenItems((prevOpenItems) => [...prevOpenItems, globalId]);
}
expandedIds.push(globalId);
}
if (node.children) {
for (const child of node.children) {
updateOpenItems(child, globalId);
collectExpandedIds(child, globalId);
}
}
};
rootNodes.forEach((n) => updateOpenItems(n, undefined));
}, [rootNodes, openItems, setOpenItems]);
rootNodes.forEach((n) => collectExpandedIds(n, undefined));
if (expandedIds.length > 0) {
setOpenItems((prevOpenItems) => {
const prevSet = new Set(prevOpenItems);
const newIds = expandedIds.filter((id) => !prevSet.has(id));
return newIds.length > 0 ? [...prevOpenItems, ...newIds] : prevOpenItems;
});
}
}, [rootNodes]);
const handleOpenChange = (event: TreeOpenChangeEvent, data: TreeOpenChangeData) =>
setOpenItems(Array.from(data.openItems));
const toggleSortOrder = () => {
setSortOrder(sortOrder === "az" ? "za" : "az");
};
return (
<div className={treeStyles.treeContainer}>
{userContext.authType !== AuthType.ResourceToken && databases.length > 0 && (
<div style={{ padding: "8px", display: "flex", gap: "4px", alignItems: "center" }}>
<Input
placeholder="Search databases only"
value={searchText}
onChange={(_, data) => setSearchText(data?.value || "")}
size="small"
contentBefore={<Search20Regular />}
style={{ flex: 1 }}
/>
<Button
appearance="subtle"
size="small"
icon={sortOrder === "az" ? <ArrowSortDown20Regular /> : <ArrowSortUp20Regular />}
onClick={toggleSortOrder}
/>
</div>
)}
<Tree
aria-label="CosmosDB resources"
openItems={openItems}

File diff suppressed because it is too large Load Diff

View File

@@ -363,7 +363,7 @@ describe("createDatabaseTreeNodes", () => {
},
} as never,
});
nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab);
nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab, "");
});
it("creates expected tree", () => {
@@ -445,6 +445,7 @@ describe("createDatabaseTreeNodes", () => {
isNotebookEnabled,
useDatabases.getState().databases,
refreshActiveTab,
"",
);
expect(nodes).toMatchSnapshot();
},
@@ -455,7 +456,7 @@ describe("createDatabaseTreeNodes", () => {
// The goal is to cover some key behaviors like loading child nodes, opening tabs/side panels, etc.
it("adds new collections to database as they appear", () => {
const nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab);
const nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab, "");
const giganticDbNode = nodes.find((node) => node.label === giganticDb.id());
expect(giganticDbNode).toBeDefined();
expect(giganticDbNode.children.map((node) => node.label)).toStrictEqual(["schemaCollection", "load more"]);
@@ -487,7 +488,7 @@ describe("createDatabaseTreeNodes", () => {
},
} as unknown as DataModels.DatabaseAccount,
});
nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab);
nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab, "");
standardDbNode = nodes.find((node) => node.label === standardDb.id());
sharedDbNode = nodes.find((node) => node.label === sharedDb.id());
giganticDbNode = nodes.find((node) => node.label === giganticDb.id());
@@ -642,7 +643,7 @@ describe("createDatabaseTreeNodes", () => {
setup();
// Rebuild the nodes after changing the user/config context.
nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab);
nodes = createDatabaseTreeNodes(explorer, false, useDatabases.getState().databases, refreshActiveTab, "");
standardDbNode = nodes.find((node) => node.label === standardDb.id());
standardCollectionNode = standardDbNode.children.find((node) => node.label === standardCollection.id());

View File

@@ -1,11 +1,17 @@
import { DatabaseRegular, DocumentMultipleRegular, EyeRegular, SettingsRegular } from "@fluentui/react-icons";
import {
DatabaseRegular,
DocumentMultipleRegular,
EyeRegular,
Pin16Filled,
SettingsRegular,
} from "@fluentui/react-icons";
import { TreeNode } from "Explorer/Controls/TreeComponent/TreeNodeComponent";
import { collectionWasOpened } from "Explorer/MostRecentActivity/MostRecentActivity";
import TabsBase from "Explorer/Tabs/TabsBase";
import StoredProcedure from "Explorer/Tree/StoredProcedure";
import Trigger from "Explorer/Tree/Trigger";
import UserDefinedFunction from "Explorer/Tree/UserDefinedFunction";
import { useDatabases } from "Explorer/useDatabases";
import { DatabaseSortOrder, useDatabases } from "Explorer/useDatabases";
import { isFabric, isFabricMirrored, isFabricNative, isFabricNativeReadOnly } from "Platform/Fabric/FabricUtil";
import { getItemName } from "Utils/APITypeUtils";
import { isServerlessAccount } from "Utils/CapabilityUtils";
@@ -27,7 +33,10 @@ export const shouldShowScriptNodes = (): boolean => {
const TreeDatabaseIcon = <DatabaseRegular fontSize={16} />;
const TreeSettingsIcon = <SettingsRegular fontSize={16} />;
const TreeCollectionIcon = <DocumentMultipleRegular fontSize={16} />;
const GlobalSecondaryIndexCollectionIcon = <EyeRegular fontSize={16} />; //check icon
const GlobalSecondaryIndexCollectionIcon = <EyeRegular fontSize={16} />;
const pinnedIconStyle: React.CSSProperties = { display: "inline-flex", alignItems: "center", gap: "2px" };
const pinnedBadgeStyle: React.CSSProperties = { color: "var(--colorBrandForeground1)" };
export const createSampleDataTreeNodes = (sampleDataResourceTokenCollection: ViewModels.CollectionBase): TreeNode[] => {
const updatedSampleTree: TreeNode = {
@@ -131,8 +140,31 @@ export const createDatabaseTreeNodes = (
isNotebookEnabled: boolean,
databases: ViewModels.Database[],
refreshActiveTab: (comparator: (tab: TabsBase) => boolean) => void,
searchText = "",
sortOrder: DatabaseSortOrder = "az",
pinnedDatabaseIds: Set<string> = new Set(),
): TreeNode[] => {
const databaseTreeNodes: TreeNode[] = databases.map((database: ViewModels.Database) => {
// Filter databases based on search text (cache lowercase to avoid repeated conversion)
const lowerSearch = searchText.toLowerCase();
const filteredDatabases = searchText
? databases.filter((db) => db.id().toLowerCase().includes(lowerSearch))
: databases;
// Sort: pinned first, then by name (A-Z or Z-A) within each group
const orderedDatabases = [...filteredDatabases].sort((first, second) => {
const isFirstPinned = pinnedDatabaseIds.has(first.id());
const isSecondPinned = pinnedDatabaseIds.has(second.id());
if (isFirstPinned !== isSecondPinned) {
return isFirstPinned ? -1 : 1;
}
const firstName = first.id();
const secondName = second.id();
return sortOrder === "az"
? firstName.localeCompare(secondName, undefined, { sensitivity: "base" })
: secondName.localeCompare(firstName, undefined, { sensitivity: "base" });
});
const databaseTreeNodes: TreeNode[] = orderedDatabases.map((database: ViewModels.Database) => {
const buildDatabaseChildNodes = (databaseNode: TreeNode) => {
databaseNode.children = [];
if (database.isDatabaseShared() && configContext.platform !== Platform.Fabric) {
@@ -170,13 +202,24 @@ export const createDatabaseTreeNodes = (
}
};
const isPinned = pinnedDatabaseIds.has(database.id());
const databaseIcon = isPinned ? (
<span style={pinnedIconStyle}>
<DatabaseRegular fontSize={16} />
<Pin16Filled fontSize={10} style={pinnedBadgeStyle} />
</span>
) : (
TreeDatabaseIcon
);
const databaseNode: TreeNode = {
label: database.id(),
className: "databaseNode",
children: [],
isSelected: () => useSelectedNode.getState().isDataNodeSelected(database.id()),
contextMenu: ResourceTreeContextMenuButtonFactory.createDatabaseContextMenu(container, database.id()),
iconSrc: TreeDatabaseIcon,
iconSrc: databaseIcon,
onExpanded: async () => {
useSelectedNode.getState().setSelectedNode(database);
if (!databaseNode.children || databaseNode.children?.length === 0) {
@@ -192,7 +235,6 @@ export const createDatabaseTreeNodes = (
isExpanded: database.isDatabaseExpanded(),
onCollapsed: () => {
database.collapseDatabase();
// useCommandBar.getState().setContextButtons([]);
useDatabases.getState().updateDatabase(database);
},
};
@@ -242,13 +284,13 @@ export const buildCollectionNode = (
(tab: TabsBase) =>
tab.collection?.id() === collection.id() && tab.collection.databaseId === collection.databaseId,
);
useDatabases.getState().updateDatabase(database);
// If we're showing script nodes, start loading them.
// If we're showing script nodes, start loading them in parallel.
if (shouldShowScriptNodes()) {
await collection.loadStoredProcedures();
await collection.loadUserDefinedFunctions();
await collection.loadTriggers();
await Promise.all([
collection.loadStoredProcedures(),
collection.loadUserDefinedFunctions(),
collection.loadTriggers(),
]);
}
useDatabases.getState().updateDatabase(database);
@@ -257,7 +299,6 @@ export const buildCollectionNode = (
onContextMenuOpen: () => useSelectedNode.getState().setSelectedNode(collection),
onCollapsed: () => {
collection.collapseCollection();
// useCommandBar.getState().setContextButtons([]);
useDatabases.getState().updateDatabase(database);
},
isExpanded: collection.isCollectionExpanded(),

View File

@@ -1,15 +1,25 @@
import _ from "underscore";
import create, { UseStore } from "zustand";
import * as Constants from "../Common/Constants";
import * as ViewModels from "../Contracts/ViewModels";
import * as LocalStorageUtility from "../Shared/LocalStorageUtility";
import { StorageKey } from "../Shared/StorageUtility";
import { userContext } from "../UserContext";
import { useSelectedNode } from "./useSelectedNode";
export type DatabaseSortOrder = "az" | "za";
interface DatabasesState {
databases: ViewModels.Database[];
resourceTokenCollection: ViewModels.CollectionBase;
sampleDataResourceTokenCollection: ViewModels.CollectionBase;
databasesFetchedSuccessfully: boolean; // Track if last database fetch was successful
searchText: string;
sortOrder: DatabaseSortOrder;
pinnedDatabaseIds: Set<string>;
setSearchText: (searchText: string) => void;
setSortOrder: (sortOrder: DatabaseSortOrder) => void;
togglePinDatabase: (databaseId: string) => void;
isPinned: (databaseId: string) => boolean;
updateDatabase: (database: ViewModels.Database) => void;
addDatabases: (databases: ViewModels.Database[]) => void;
deleteDatabase: (database: ViewModels.Database) => void;
@@ -27,11 +37,41 @@ interface DatabasesState {
validateCollectionId: (databaseId: string, collectionId: string) => Promise<boolean>;
}
const loadPinnedDatabases = (): Set<string> => {
const stored = LocalStorageUtility.getEntryObject<string[]>(StorageKey.PinnedDatabases);
return new Set(Array.isArray(stored) ? stored : []);
};
const loadSortOrder = (): DatabaseSortOrder => {
const stored = LocalStorageUtility.getEntryString(StorageKey.DatabaseSortOrder);
return stored === "az" || stored === "za" ? stored : "az";
};
export const useDatabases: UseStore<DatabasesState> = create((set, get) => ({
databases: [],
resourceTokenCollection: undefined,
sampleDataResourceTokenCollection: undefined,
databasesFetchedSuccessfully: false,
searchText: "",
sortOrder: loadSortOrder(),
pinnedDatabaseIds: loadPinnedDatabases(),
setSearchText: (searchText: string) => set({ searchText }),
setSortOrder: (sortOrder: DatabaseSortOrder) => {
LocalStorageUtility.setEntryString(StorageKey.DatabaseSortOrder, sortOrder);
set({ sortOrder });
},
togglePinDatabase: (databaseId: string) => {
const current = get().pinnedDatabaseIds;
const updated = new Set(current);
if (updated.has(databaseId)) {
updated.delete(databaseId);
} else {
updated.add(databaseId);
}
LocalStorageUtility.setEntryObject(StorageKey.PinnedDatabases, [...updated]);
set({ pinnedDatabaseIds: updated });
},
isPinned: (databaseId: string) => get().pinnedDatabaseIds.has(databaseId),
updateDatabase: (updatedDatabase: ViewModels.Database) =>
set((state) => {
const updatedDatabases = state.databases.map((database: ViewModels.Database) => {
@@ -45,29 +85,27 @@ export const useDatabases: UseStore<DatabasesState> = create((set, get) => ({
}),
addDatabases: (databases: ViewModels.Database[]) =>
set((state) => ({
databases: [...state.databases, ...databases].sort((db1, db2) => db1.id().localeCompare(db2.id())),
databases: [...state.databases, ...databases],
})),
deleteDatabase: (database: ViewModels.Database) =>
set((state) => ({ databases: state.databases.filter((db) => database.id() !== db.id()) })),
set((state) => {
const updated = new Set(state.pinnedDatabaseIds);
if (updated.delete(database.id())) {
LocalStorageUtility.setEntryObject(StorageKey.PinnedDatabases, [...updated]);
}
return {
databases: state.databases.filter((db) => database.id() !== db.id()),
pinnedDatabaseIds: updated,
};
}),
clearDatabases: () => set(() => ({ databases: [] })),
isSaveQueryEnabled: () => {
const savedQueriesDatabase: ViewModels.Database = _.find(
get().databases,
(database: ViewModels.Database) => database.id() === Constants.SavedQueries.DatabaseName,
const savedQueriesDatabase = get().databases.find(
(database) => database.id() === Constants.SavedQueries.DatabaseName,
);
if (!savedQueriesDatabase) {
return false;
}
const savedQueriesCollection: ViewModels.Collection =
savedQueriesDatabase &&
_.find(
savedQueriesDatabase.collections(),
(collection: ViewModels.Collection) => collection.id() === Constants.SavedQueries.CollectionName,
);
if (!savedQueriesCollection) {
return false;
}
return true;
return !!savedQueriesDatabase
?.collections()
?.find((collection) => collection.id() === Constants.SavedQueries.CollectionName);
},
findDatabaseWithId: (databaseId: string, isSampleDatabase?: boolean) => {
return isSampleDatabase === undefined
@@ -100,44 +138,24 @@ export const useDatabases: UseStore<DatabasesState> = create((set, get) => ({
return true;
},
loadDatabaseOffers: async () => {
await Promise.all(
get().databases?.map(async (database: ViewModels.Database) => {
await database.loadOffer();
}),
);
await Promise.all(get().databases.map((database: ViewModels.Database) => database.loadOffer()));
},
loadAllOffers: async () => {
await Promise.all(
get().databases?.map(async (database: ViewModels.Database) => {
await database.loadOffer();
await database.loadCollections();
get().databases.map(async (database: ViewModels.Database) => {
await Promise.all([database.loadOffer(), database.loadCollections()]);
await Promise.all(
(database.collections() || []).map(async (collection: ViewModels.Collection) => {
await collection.loadOffer();
}),
(database.collections() || []).map((collection: ViewModels.Collection) => collection.loadOffer()),
);
}),
);
},
isFirstResourceCreated: () => {
const databases = get().databases;
if (!databases || databases.length === 0) {
if (databases.length === 0) {
return false;
}
return databases.some((database) => {
// user has created at least one collection
if (database.collections()?.length > 0) {
return true;
}
// user has created a database with shared throughput
if (database.offer()) {
return true;
}
// use has created an empty database without shared throughput
return false;
});
return databases.some((database) => database.collections()?.length > 0 || !!database.offer());
},
findSelectedDatabase: (): ViewModels.Database => {
const selectedNode = useSelectedNode.getState().selectedNode;
@@ -145,7 +163,7 @@ export const useDatabases: UseStore<DatabasesState> = create((set, get) => ({
return undefined;
}
if (selectedNode.nodeKind === "Database") {
return _.find(get().databases, (database: ViewModels.Database) => database.id() === selectedNode.id());
return get().databases.find((database) => database.id() === selectedNode.id());
}
if (selectedNode.nodeKind === "Collection") {

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,9 @@
"upload": "Hochladen",
"connect": "Verbinden",
"remove": "Entfernen",
"load": "Laden",
"publish": "Veröffentlichen",
"browse": "Durchsuchen",
"increaseValueBy1": "Wert um 1 erhöhen",
"decreaseValueBy1": "Wert um 1 verringern"
},
@@ -291,5 +294,675 @@
"errorCreateContainer": "Fehler beim Erstellen des Containers: {{error}}",
"errorImportData": "Fehler beim Importieren von Daten: {{error}}"
}
},
"contextMenu": {
"newContainer": "Neu: {{containerName}}",
"restoreContainer": "{{containerName}} wiederherstellen",
"deleteDatabase": "{{databaseName}} löschen",
"deleteContainer": "{{containerName}} löschen",
"newSqlQuery": "Neue SQL-Abfrage",
"newQuery": "Neue Abfrage",
"openMongoShell": "Mongo Shell öffnen",
"newShell": "Neue Shell",
"openCassandraShell": "Cassandra Shell öffnen",
"newStoredProcedure": "Neue gespeicherte Prozedur",
"newUdf": "Neue UDF",
"newTrigger": "Neuer Trigger",
"deleteStoredProcedure": "Gespeicherte Prozedur löschen",
"deleteTrigger": "Trigger löschen",
"deleteUdf": "Benutzerdefinierte Funktion löschen"
},
"tabs": {
"documents": {
"newItem": "Neues Element",
"newDocument": "Neues Dokument",
"uploadItem": "Element hochladen",
"applyFilter": "Filter anwenden",
"unsavedChanges": "Nicht gespeicherte Änderungen",
"unsavedChangesMessage": "Ihre nicht gespeicherten Änderungen gehen verloren. Möchten Sie fortfahren?",
"createDocumentFailed": "Fehler beim Erstellen des Dokuments",
"updateDocumentFailed": "Fehler beim Aktualisieren des Dokuments",
"documentDeleted": "Das Dokument wurde erfolgreich gelöscht.",
"deleteDocumentDialogTitle": "Dokument löschen",
"deleteDocumentsDialogTitle": "Dokumente löschen",
"throttlingError": "Einige Dokumente konnten aufgrund einer Ratenbegrenzung nicht gelöscht werden. Versuchen Sie es später erneut. Um dies künftig zu vermeiden, sollten Sie den Durchsatz Ihres Containers oder Ihrer Datenbank erhöhen.",
"deleteFailed": "Fehler beim Löschen von Dokumenten ({{error}}).",
"missingShardProperty": "Im Dokument fehlt die Shardeigenschaft: {{partitionKeyProperty}}",
"refreshGridFailed": "Fehler beim Aktualisieren des Dokumentrasters",
"confirmDelete": "Möchten Sie {{documentName}} wirklich löschen?",
"confirmDeleteTitle": "Löschen bestätigen",
"selectedItems": "die ausgewählten {{count}} Elemente",
"selectedItem": "das ausgewählte Element",
"selectedDocuments": "die ausgewählten {{count}} Dokumente",
"selectedDocument": "das ausgewählte Dokument",
"deleteDocumentFailedLog": "Fehler beim Löschen des Dokuments {{documentId}} mit Statuscode {{statusCode}}.",
"deleteSuccessLog": "{{count}} Dokument(e) wurde(n) erfolgreich gelöscht.",
"deleteThrottledLog": "Fehler beim Löschen von {{count}} Dokument(en) aufgrund des Fehlers „Anforderung zu groß“ (429) Vorgang wird wiederholt …",
"missingShardKeyLog": "Fehler beim Speichern des neuen Dokuments: Der Shardschlüssel des Dokuments ist nicht definiert.",
"filterTooltip": "Geben Sie ein Abfrageprädikat ein oder wählen Sie eines aus der Liste aus.",
"loadMore": "Mehr laden",
"documentEditor": "Dokumenteneditor",
"savedFilters": "Gespeicherte Filter",
"defaultFilters": "Standardfilter",
"abort": "Abbrechen",
"deletingDocuments": "{{count}} Dokument(e) wird/werden gelöscht",
"deletedDocumentsSuccess": "{{count}} Dokument(e) wurde(n) erfolgreich gelöscht.",
"deleteAborted": "Das Löschen von Dokumenten wurde abgebrochen.",
"failedToDeleteDocuments": "Fehler beim Löschen von {{count}} Dokument(en).",
"requestTooLargeBase": "Einige Löschanforderungen sind aufgrund einer Ausnahme „Anforderung zu groß“ (429) fehlgeschlagen.",
"retriedSuccessfully": "wurden jedoch erfolgreich wiederholt.",
"retryingNow": "Der Vorgang wird jetzt wiederholt.",
"increaseThroughputTip": "Um dies künftig zu vermeiden, sollten Sie den Durchsatz Ihres Containers oder Ihrer Datenbank erhöhen.",
"numberOfSelectedDocuments": "Anzahl der ausgewählten Dokumente: {{count}}",
"mongoFilterPlaceholder": "Geben Sie ein Abfrageprädikat (z. B. {\"id\":\"foo\"}) ein, wählen Sie eines aus der Dropdownliste oder lassen Sie das Feld leer, um alle Dokumente abzufragen.",
"sqlFilterPlaceholder": "Geben Sie ein Abfrageprädikat (z. B. WHERE c.id=\"1\") ein, wählen Sie eines aus der Dropdownliste oder lassen Sie das Feld leer, um alle Dokumente abzufragen.",
"error": "Fehler",
"warning": "Warnung"
},
"query": {
"executeQuery": "Abfrage ausführen",
"executeSelection": "Auswahl ausführen",
"saveQuery": "Abfrage speichern",
"downloadQuery": "Abfrage herunterladen",
"cancelQuery": "Abfrage abbrechen",
"openSavedQueries": "Gespeicherte Abfragen öffnen",
"vertical": "Vertikal",
"horizontal": "Horizontal",
"view": "Ansicht",
"editingQuery": "Abfrage wird bearbeitet"
},
"storedProcedure": {
"id": "ID der gespeicherten Prozedur",
"idPlaceholder": "Geben Sie die ID der neuen gespeicherten Prozedur ein.",
"idAriaLabel": "ID der gespeicherten Prozedur",
"body": "Text der gespeicherten Prozedur",
"bodyAriaLabel": "Text der gespeicherten Prozedur",
"successfulExecution": "Die gespeicherte Prozedur wurde erfolgreich ausgeführt.",
"resultAriaLabel": "Ergebnis der gespeicherten Prozedur ausführen",
"logsAriaLabel": "Protokolle für gespeicherte Prozedur ausführen",
"errors": "Fehler:",
"errorDetailsAriaLabel": "Link zu Fehlerdetails",
"moreDetails": "Weitere Details",
"consoleLogTab": "console.log"
},
"trigger": {
"id": "Trigger-ID",
"idPlaceholder": "Geben Sie die neue Trigger-ID ein.",
"type": "Triggertyp",
"operation": "Triggervorgang",
"body": "Triggertext",
"bodyAriaLabel": "Triggertext",
"pre": "Vor",
"post": "Beitrag",
"all": "Alle",
"operationCreate": "Erstellen",
"operationDelete": "Löschen",
"operationReplace": "Ersetzen"
},
"udf": {
"id": "ID der benutzerdefinierten Funktion",
"idPlaceholder": "Geben Sie die ID der neuen benutzerdefinierten Funktion ein.",
"body": "Text der benutzerdefinierten Funktion",
"bodyAriaLabel": "Text der benutzerdefinierten Funktion"
},
"conflicts": {
"unsavedChanges": "Nicht gespeicherte Änderungen",
"changesWillBeLost": "Nicht gespeicherte Änderungen gehen verloren. Möchten Sie fortfahren?",
"resolveConflictFailed": "Fehler beim Auflösen des Konflikts",
"deleteConflictFailed": "Fehler beim Löschen des Konflikts.",
"refreshGridFailed": "Fehler beim Aktualisieren des Dokumentrasters"
},
"mongoShell": {
"title": "Mongo Shell"
}
},
"panes": {
"deleteDatabase": {
"panelTitle": "{{databaseName}} löschen",
"warningMessage": "Warnung! Die Aktion, die Sie ausführen möchten, kann nicht rückgängig gemacht werden. Wenn Sie fortfahren, werden diese Ressource und alle untergeordneten Ressourcen dauerhaft gelöscht.",
"confirmPrompt": "Durch Eingabe der {{databaseName}}-ID (Name) bestätigen",
"inputMismatch": "Eingabe {{databaseName}} Name „{{input}}“ stimmt nicht mit dem ausgewählten {{databaseName}} „{{selectedId}}“ überein.",
"feedbackTitle": "Helfen Sie uns, Azure Cosmos DB zu verbessern!",
"feedbackReason": "Aus welchem Grund löschen Sie diese {{databaseName}}?"
},
"deleteCollection": {
"panelTitle": "{{collectionName}} löschen",
"confirmPrompt": "Durch Eingabe der {{collectionName}}-ID bestätigen",
"inputMismatch": "Die Eingabe-ID {{input}} stimmt nicht mit der ausgewählten {{selectedId}} überein.",
"feedbackTitle": "Helfen Sie uns, Azure Cosmos DB zu verbessern!",
"feedbackReason": "Aus welchem Grund löschen Sie diese {{collectionName}}?"
},
"addDatabase": {
"databaseLabel": "Datenbank {{suffix}}",
"databaseIdLabel": "Datenbank-ID",
"keyspaceIdLabel": "Keyspace-ID",
"databaseIdPlaceholder": "Neue {{databaseLabel}}-ID eingeben",
"databaseTooltip": "{{databaseLabel}} ist ein logischer Container mit mindestens einem {{collectionsLabel}}",
"shareThroughput": "Durchsatz für {{collectionsLabel}} gemeinsam nutzen",
"shareThroughputTooltip": "Der bereitgestellte Durchsatz auf der {{databaseLabel}}-Ebene wird von allen {{collectionsLabel}} innerhalb von {{databaseLabel}} gemeinsam genutzt.",
"greaterThanError": "Geben Sie für den Autopilot-Durchsatz einen Wert ein, der größer als {{minValue}} ist.",
"acknowledgeSpendError": "Bestätigen Sie die geschätzten {{period}} Ausgaben.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "Neu erstellen",
"useExisting": "Vorhandene verwenden",
"databaseTooltip": "Eine Datenbank entspricht einem Namespace. Das ist die Verwaltungseinheit für einen Satz von {{collectionName}}.",
"shareThroughput": "Durchsatz für {{collectionName}} gemeinsam nutzen",
"shareThroughputTooltip": "Der auf Datenbankebene konfigurierte Durchsatz wird von allen {{collectionName}} innerhalb der Datenbank gemeinsam genutzt.",
"collectionIdLabel": "{{collectionName}} ID",
"collectionIdTooltip": "Eindeutiger Bezeichner für {{collectionName}} und wird für id-basiertes Routing über REST und alle SDKs verwendet.",
"collectionIdPlaceholder": "Beispiel: {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} ID, Beispiel {{collectionName}}1",
"existingDatabaseAriaLabel": "Vorhandene {{databaseName}}-ID auswählen",
"existingDatabasePlaceholder": "Vorhandene {{databaseName}}-ID auswählen",
"indexing": "Indizierung",
"turnOnIndexing": "Indizierung aktivieren",
"automatic": "Automatisch",
"turnOffIndexing": "Indizierung deaktivieren",
"off": "Aus",
"sharding": "Sharding",
"shardingTooltip": "Shardsammlungen teilen Ihre Daten auf viele Replikatgruppen (Shards) auf, um unbegrenzte Skalierbarkeit zu erzielen. Shardsammlungen erfordern die Auswahl eines Shardschlüssels (Felds), um Ihre Daten gleichmäßig zu verteilen.",
"unsharded": "Ohne Sharding",
"unshardedLabel": "Ohne Sharding (20-GB-Limit)",
"sharded": "Mit Sharding",
"addPartitionKey": "Hierarchischen Partitionsschlüssel hinzufügen",
"hierarchicalPartitionKeyInfo": "Mit diesem Feature können Sie Ihre Daten mit bis zu drei Schlüsselebenen partitionieren, um eine bessere Datenverteilung zu erzielen. Erfordert .NET V3, Java V4 SDK oder JavaScript V3 SDK (Vorschauversion).",
"provisionDedicatedThroughput": "Dedizierten Durchsatz für {{collectionName}} bereitstellen",
"provisionDedicatedThroughputTooltip": "Sie können optional dedizierten Durchsatz für eine {{collectionName}} in einer Datenbank bereitstellen, für die Durchsatz bereitgestellt wurde. Dieser dedizierte Durchsatz wird nicht für andere {{collectionNamePlural}} in der Datenbank freigegeben und zählt nicht zum Durchsatz, den Sie für die Datenbank bereitgestellt haben. Diese Durchsatzmenge wird zusätzlich zu dem Durchsatz, den Sie auf Datenbankebene bereitgestellt haben, in Rechnung gestellt.",
"uniqueKeysPlaceholderMongo": "Durch Trennzeichen getrennte Pfade, z. B. firstName,address.zipCode",
"uniqueKeysPlaceholderSql": "Durch Trennzeichen getrennte Pfade, z. B. /firstName,/address/zipCode",
"addUniqueKey": "Eindeutigen Schlüssel hinzufügen",
"enableAnalyticalStore": "Analysespeicher aktivieren",
"disableAnalyticalStore": "Analysespeicher deaktivieren",
"on": "Ein",
"analyticalStoreSynapseLinkRequired": "Azure Synapse Link ist zum Erstellen eines Analysespeichers {{collectionName}}erforderlich. Aktivieren Sie Synapse Link für dieses Cosmos DB-Konto.",
"enable": "Aktivieren",
"containerVectorPolicy": "Containervektorrichtlinie",
"containerFullTextSearchPolicy": "Richtlinie für Container-Volltextsuche",
"advanced": "Erweitert",
"mongoIndexingTooltip": "Das Feld _id wird standardmäßig indiziert. Das Erstellen eines Platzhalterindexes für alle Felder wird für die Entwicklung empfohlen, weil dadurch Abfragen optimiert werden.",
"createWildcardIndex": "Platzhalterindex für alle Felder erstellen",
"legacySdkCheckbox": "Meine Anwendung verwendet eine ältere Cosmos .NET- oder Java SDK-Version (.NET V1 oder Java V2).",
"legacySdkInfo": "Um die Kompatibilität mit älteren SDKs sicherzustellen, verwendet der erstellte Container ein Legacypartitionierungsschema, das Partitionsschlüsselwerte nur mit einer Größe von bis zu 101 Bytes unterstützt. Wenn dies aktiviert ist, können Sie keine hierarchischen Partitionsschlüssel verwenden.",
"indexingOnInfo": "Alle Eigenschaften in Ihren Dokumenten werden standardmäßig für flexible und effiziente Abfragen indiziert.",
"indexingOffInfo": "Die Indizierung wird deaktiviert. Empfohlen, wenn Sie keine Abfragen ausführen müssen oder nur Schlüsselwertvorgänge ausführen müssen.",
"indexingOffWarning": "Wenn Sie diesen Container mit deaktivierter Indizierung erstellen, können Sie keine Änderungen an der Indizierungsrichtlinie vornehmen. Indizierungsänderungen sind nur an einem Container mit einer Indizierungsrichtlinie zulässig.",
"acknowledgeSpendErrorMonthly": "Bestätigen Sie die geschätzten monatlichen Ausgaben.",
"acknowledgeSpendErrorDaily": "Bestätigen Sie die geschätzten täglichen Ausgaben.",
"unshardedMaxRuError": "Sammlungen ohne Sharding unterstützen bis zu 10.000 RUs.",
"acknowledgeShareThroughputError": "Bestätigen Sie die geschätzten Kosten für diesen dedizierten Durchsatz.",
"vectorPolicyError": "Beheben Sie Fehler in der Containervektorrichtlinie.",
"fullTextSearchPolicyError": "Beheben Sie Fehler in der Richtlinie für die Container-Volltextsuche.",
"addingSampleDataSet": "Beispieldataset wird hinzugefügt",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "Der Shardschlüssel (Feld) wird verwendet, um Ihre Daten auf viele Replikatgruppen (Shards) aufzuteilen, um unbegrenzte Skalierbarkeit zu erzielen. Es ist wichtig, ein Feld auszuwählen, das Ihre Daten gleichmäßig verteilt.",
"partitionKeyTooltip": "{{partitionKeyName}} wird verwendet, um Daten aus Gründen der Skalierbarkeit automatisch auf Partitionen zu verteilen. Wählen Sie in Ihrem JSON-Dokument eine Eigenschaft, die eine große Bandbreite an Werten aufweist und das Anforderungsvolumen gleichmäßig verteilt.",
"partitionKeyTooltipSqlSuffix": " Bei kleinen Workloads mit vielen Lese- oder Schreibvorgängen beliebiger Größe ist die ID häufig eine gute Wahl.",
"shardKeyLabel": "Shardschlüssel",
"partitionKeyLabel": "Partitionsschlüssel",
"shardKeyPlaceholder": "Beispiel: categoryId",
"partitionKeyPlaceholderDefault": "Beispiel: /address",
"partitionKeyPlaceholderFirst": "Erforderlich erster Partitionsschlüssel, z. B. /TenantId",
"partitionKeyPlaceholderSecond": "zweiter Partitionsschlüssel, z. B. /UserId",
"partitionKeyPlaceholderThird": "Dritter Partitionsschlüssel, z. B. /SessionId",
"partitionKeyPlaceholderGraph": "Beispiel: /address/zipCode",
"uniqueKeysTooltip": "Eindeutige Schlüssel bieten Entwicklern die Möglichkeit, ihrer Datenbank eine Ebene der Datenintegrität hinzuzufügen. Indem Sie beim Erstellen eines Containers eine Richtlinie für eindeutige Schlüssel erstellen, stellen Sie die Eindeutigkeit eines oder mehrerer Werte pro Partitionsschlüssel sicher.",
"uniqueKeysLabel": "Eindeutige Schlüssel",
"analyticalStoreLabel": "Analysespeicher",
"analyticalStoreTooltip": "Aktivieren Sie die Analysespeicherfunktion, um Analysen ihrer operativen Daten nahezu in Echtzeit durchzuführen, ohne die Leistung von Transaktionsworkloads zu beeinträchtigen.",
"analyticalStoreDescription": "Aktivieren Sie die Analysespeicherfunktion, um Analysen ihrer operativen Daten nahezu in Echtzeit durchzuführen, ohne die Leistung von Transaktionsworkloads zu beeinträchtigen.",
"vectorPolicyTooltip": "Beschreiben Sie alle Eigenschaften in Ihren Daten, die Vektoren enthalten, damit sie für Ähnlichkeitsabfragen verfügbar gemacht werden können."
},
"settings": {
"pageOptions": "Seitenoptionen",
"pageOptionsDescription": "Wählen Sie „Benutzerdefiniert“ aus, um eine feste Anzahl anzuzeigender Abfrageergebnisse anzugeben, oder wählen Sie „Unbegrenzt“ aus, um beliebig viele Abfrageergebnisse pro Seite anzuzeigen.",
"queryResultsPerPage": "Abfrageergebnisse pro Seite",
"queryResultsPerPageTooltip": "Geben Sie die Anzahl der Abfrageergebnisse ein, die pro Seite angezeigt werden sollen.",
"customQueryItemsPerPage": "Benutzerdefinierte Abfrageelemente pro Seite",
"custom": "Benutzerdefiniert",
"unlimited": "Unbegrenzt",
"entraIdRbac": "RBAC für Entra ID aktivieren",
"entraIdRbacDescription": "Wählen Sie „Automatisch“ aus, um RBAC für Entra ID automatisch zu aktivieren. True/False, um das Aktivieren/Deaktivieren von RBAC für Entra ID zu erzwingen.",
"true": "Wahr",
"false": "Falsch",
"regionSelection": "Bereichsauswahl",
"regionSelectionDescription": "Ändert die Region, die der Cosmos-Client für den Zugriff auf das Konto verwendet.",
"selectRegion": "Region auswählen",
"selectRegionTooltip": "Ändert den Kontoendpunkt, der zum Ausführen von Clientvorgängen verwendet wird.",
"globalDefault": "Global (Standard)",
"readWrite": "(Lesen/Schreiben)",
"read": "(Lesen)",
"queryTimeout": "Abfragetimeout",
"queryTimeoutDescription": "Wenn eine Abfrage ein angegebenes Zeitlimit erreicht, wird ein Popup mit einer Option zum Abbrechen der Abfrage angezeigt, es sei denn, der automatische Abbruch wurde aktiviert.",
"enableQueryTimeout": "Abfragetimeout aktivieren",
"queryTimeoutMs": "Abfragetimeout (ms)",
"automaticallyCancelQuery": "Abfrage nach Timeout automatisch abbrechen",
"ruLimit": "RU-Limit",
"ruLimitDescription": "Wenn eine Abfrage ein konfiguriertes RU-Limit überschreitet, wird die Abfrage abgebrochen.",
"enableRuLimit": "RU-Limit aktivieren",
"ruLimitLabel": "RU-Limit (RU)",
"defaultQueryResults": "Standardansicht der Abfrageergebnisse",
"defaultQueryResultsDescription": "Wählen Sie die Standardansicht aus, die zum Anzeigen von Abfrageergebnissen verwendet werden soll.",
"retrySettings": "Wiederholungseinstellungen",
"retrySettingsDescription": "Wiederholungsrichtlinie, die gedrosselten Anforderungen während CosmosDB-Abfragen zugeordnet ist.",
"maxRetryAttempts": "Max. Wiederholungsversuche",
"maxRetryAttemptsTooltip": "Maximale Anzahl von Wiederholungen, die für eine Anforderung ausgeführt werden sollen. Standardwert: 9.",
"fixedRetryInterval": "Festes Wiederholungsintervall (ms)",
"fixedRetryIntervalTooltip": "Festes Wiederholungsintervall in Millisekunden, das zwischen den einzelnen Wiederholungsversuchen abgewartet wird, wobei das als Teil der Antwort zurückgegebene retryAfter ignoriert wird. Der Standardwert beträgt 0 Millisekunden.",
"maxWaitTime": "Maximale Wartezeit (s)",
"maxWaitTimeTooltip": "Maximale Wartezeit in Sekunden für eine Anforderung während der Wiederholungsversuche. Standardwert: 30 Sekunden.",
"enableContainerPagination": "Containerpaginierung aktivieren",
"enableContainerPaginationDescription": "Laden Sie jeweils 50 Container. Derzeit werden Container nicht in alphanumerischer Reihenfolge abgerufen.",
"enableCrossPartitionQuery": "Partitionsübergreifende Abfrage aktivieren",
"enableCrossPartitionQueryDescription": "Senden Sie während der Ausführung einer Abfrage mehrere Anforderungen. Wenn die Abfrage nicht auf einen einzelnen Partitionsschlüsselwert beschränkt ist, sind mehrere Anforderungen erforderlich.",
"maxDegreeOfParallelism": "Max. Grad an Parallelität",
"maxDegreeOfParallelismDescription": "Ruft die Anzahl gleichzeitiger Vorgänge ab, die während der parallelen Abfrageausführung clientseitig ausgeführt werden, oder legt diese fest. Ein positiver Eigenschaftswert schränkt die Anzahl gleichzeitiger Vorgänge auf den festgelegten Wert ein. Wenn der Wert auf weniger als 0 festgelegt ist, entscheidet das System automatisch, wie viele gleichzeitige Vorgänge ausgeführt werden sollen.",
"maxDegreeOfParallelismQuery": "Bis zum maximalen Grad an Parallelität abfragen.",
"priorityLevel": "Prioritätsstufe",
"priorityLevelDescription": "Legt die Prioritätsstufe für Datenebenenanforderungen von Daten-Explorer fest, wenn die prioritätsbasierte Ausführung verwendet wird. Wenn „Keine“ ausgewählt ist, gibt Daten-Explorer keine Prioritätsstufe an, und die serverseitige Standardprioritätsstufe wird verwendet.",
"displayGremlinQueryResults": "Gremlin-Abfrageergebnisse anzeigen als:",
"displayGremlinQueryResultsDescription": "Wählen Sie „Graph“ aus, um die Abfrageergebnisse automatisch als Graph zu visualisieren, oder wählen Sie „JSON“ aus, um die Ergebnisse als JSON anzuzeigen.",
"graph": "Graph",
"json": "JSON",
"graphAutoVisualization": "Automatische Graphvisualisierung",
"enableSampleDatabase": "Beispieldatenbank aktivieren",
"enableSampleDatabaseDescription": "Dies ist eine Beispieldatenbank und Sammlung mit synthetischen Produktdaten, die Sie mithilfe von NoSQL-Abfragen untersuchen können. Dies wird als eine weitere Datenbank auf der Daten-Explorer-Benutzeroberfläche angezeigt und von Microsoft erstellt und kostenlos für Sie verwaltet.",
"enableSampleDbAriaLabel": "Beispieldatenbank für die Abfrageuntersuchung aktivieren",
"guidRepresentation": "GUID-Darstellung",
"guidRepresentationDescription": "GuidRepresentation in MongoDB bezieht sich darauf, wie GUIDs (Globally Unique Identifiers) serialisiert und deserialisiert werden, wenn sie in BSON-Dokumenten gespeichert werden. Dies gilt für alle Dokumentvorgänge.",
"advancedSettings": "Erweiterte Einstellungen",
"ignorePartitionKey": "Partitionsschlüssel bei Dokumentaktualisierung ignorieren",
"ignorePartitionKeyTooltip": "Wenn diese Option aktiviert ist, wird der Partitionsschlüsselwert nicht verwendet, um das Dokument während Aktualisierungsvorgängen zu finden. Verwenden Sie diese Option nur, wenn Dokumentaktualisierungen aufgrund eines ungewöhnlichen Partitionsschlüssels fehlschlagen.",
"clearHistory": "Verlauf löschen",
"clearHistoryConfirm": "Möchten Sie fortfahren?",
"clearHistoryDescription": "Durch diese Aktion werden alle Anpassungen für dieses Konto in diesem Browser gelöscht, einschließlich:",
"clearHistoryTabLayout": "Setzen Sie Ihre benutzerdefinierten Registerkartenlayouts zurück, einschließlich der Splitterpositionen",
"clearHistoryTableColumns": "Löschen Sie Ihre Tabellenspalteneinstellungen, einschließlich aller benutzerdefinierten Spalten",
"clearHistoryFilters": "Filterverlauf löschen",
"clearHistoryRegion": "Bereichsauswahl auf „Global“ zurücksetzen",
"increaseValueBy1000": "Wert um 1000 erhöhen",
"decreaseValueBy1000": "Wert um 1000 verringern",
"none": "Kein(e)",
"low": "Niedrig",
"high": "Hoch",
"automatic": "Automatisch",
"enhancedQueryControl": "Erweitertes Abfragesteuerelement",
"enableQueryControl": "Abfragesteuerelement aktivieren",
"explorerVersion": "Explorer-Version",
"accountId": "Konto-ID",
"sessionId": "Sitzungs-ID",
"popupsDisabledError": "Wir konnten keine Autorisierung für dieses Konto einrichten, weil Popups im Browser deaktiviert wurden.\nAktivieren Sie Popups für diese Website, und klicken Sie auf die Schaltfläche „Anmeldung für Entra-ID“.",
"failedToAcquireTokenError": "Fehler beim automatischen Abrufen des Autorisierungstokens. Klicken Sie auf die Schaltfläche „Anmeldung für Entra-ID“, um RBAC-Vorgänge für Entra ID zu aktivieren."
},
"saveQuery": {
"panelTitle": "Abfrage speichern",
"setupCostMessage": "Aus Compliancegründen speichern wir Abfragen in einem Container in Ihrem Azure Cosmos-Konto in einer separaten Datenbank namens „{{databaseName}}“. Um fortzufahren, müssen wir einen Container in Ihrem Konto erstellen. Die geschätzten zusätzlichen Kosten betragen 0,77 USD pro Tag.",
"completeSetup": "Einrichtung abschließen",
"noQueryNameError": "Kein Abfragename angegeben",
"invalidQueryContentError": "Ungültiger Abfrageinhalt angegeben",
"failedToSaveQueryError": "Fehler beim Speichern der Abfrage {{queryName}}",
"failedToSetupContainerError": "Fehler beim Einrichten eines Containers für gespeicherte Abfragen",
"accountNotSetupError": "Fehler beim Speichern der Abfrage: Konto zum Speichern von Abfragen nicht eingerichtet",
"name": "Name"
},
"loadQuery": {
"noFileSpecifiedError": "Keine Datei angegeben",
"failedToLoadQueryError": "Fehler beim Laden der Abfrage.",
"failedToLoadQueryFromFileError": "Fehler beim Laden der Abfrage aus der Datei {{fileName}}",
"selectFilesToOpen": "Abfragedokument auswählen",
"browseFiles": "Durchsuchen"
},
"executeStoredProcedure": {
"enterInputParameters": "Eingabeparameter eingeben (falls vorhanden)",
"key": "Schlüssel",
"param": "Param.",
"partitionKeyValue": "Partitionsschlüsselwert",
"value": "Wert",
"addNewParam": "Neuen Parameter hinzufügen",
"addParam": "Parameter hinzufügen",
"deleteParam": "Parameter löschen",
"invalidParamError": "Ungültiger Parameter angegeben: {{invalidParam}}",
"invalidParamConsoleError": "Ungültiger Parameter angegeben: {{invalidParam}} ist kein gültiger Literalwert.",
"stringType": "Zeichenfolge",
"customType": "Benutzerdefiniert"
},
"uploadItems": {
"noFilesSpecifiedError": "Es wurden keine Dateien angegeben. Geben Sie mindestens eine Datei ein.",
"selectJsonFiles": "JSON-Dateien auswählen",
"selectJsonFilesTooltip": "Wählen Sie mindestens eine JSON-Datei zum Hochladen aus. Jede Datei kann ein einzelnes JSON-Dokument oder ein Array von JSON-Dokumenten enthalten. Die kombinierte Größe aller Dateien in einem einzelnen Uploadvorgang muss kleiner als 2 MB sein. Sie können mehrere Uploadvorgänge für größere Datasets ausführen.",
"fileNameColumn": "DATEINAME",
"statusColumn": "STATUS",
"uploadStatus": "{{numSucceeded}} erstellt, {{numThrottled}} gedrosselt, {{numFailed}} Fehler",
"uploadedFiles": "Hochgeladene Dateien"
},
"copyNotebook": {
"copyFailedError": "Fehler beim Kopieren von {{name}} nach {{destination}}",
"uploadFailedError": "Fehler beim Hochladen von „{{name}}“",
"location": "Speicherort",
"locationAriaLabel": "Speicherort",
"selectLocation": "Notizbuchspeicherort zum Kopieren auswählen",
"name": "Name"
},
"publishNotebook": {
"publishFailedError": "Fehler beim Veröffentlichen von {{notebookName}} im Katalog",
"publishDescription": "Nach der Veröffentlichung wird dieses Notebook im öffentlichen Katalog Azure Cosmos DB Notebooks angezeigt. Stellen Sie sicher, dass Sie alle vertraulichen Daten oder Ausgaben vor der Veröffentlichung entfernt haben.",
"publishPrompt": "Möchten Sie „{{name}}“ im Katalog veröffentlichen und freigeben?",
"coverImage": "Titelbild",
"coverImageUrl": "Titelbild-URL",
"name": "Name",
"description": "Beschreibung",
"tags": "Kategorien",
"tagsPlaceholder": "Optionales Tag 1, optionales Tag 2",
"preview": "Vorschau",
"urlType": "URL",
"customImage": "Benutzerdefiniertes Image",
"takeScreenshot": "Screenshot erstellen",
"useFirstDisplayOutput": "Erste Anzeigeausgabe verwenden",
"failedToCaptureOutput": "Fehler beim Erfassen der ersten Ausgabe",
"outputDoesNotExist": "Für keine der Zellen ist eine Ausgabe vorhanden.",
"failedToConvertError": "Fehler beim Konvertieren von {{fileName}} in das Base64-Format",
"failedToUploadError": "Fehler beim Hochladen von „{{fileName}}“"
},
"changePartitionKey": {
"failedToStartError": "Fehler beim Starten des Datenübertragungsauftrags",
"suboptimalPartitionKeyError": "Warnung: Das System hat festgestellt, dass Ihre Sammlung möglicherweise keinen optimalen Partitionsschlüssel verwendet.",
"description": "Wenn Sie den Partitionsschlüssel eines Containers ändern, müssen Sie einen Zielcontainer mit dem richtigen Partitionsschlüssel erstellen. Sie können auch einen vorhandenen Zielcontainer auswählen.",
"sourceContainerId": "Quell-{{collectionName}}-ID",
"destinationContainerId": "Ziel-{{collectionName}}-ID",
"collectionIdTooltip": "Eindeutiger Bezeichner für {{collectionName}} und wird für id-basiertes Routing über REST und alle SDKs verwendet.",
"collectionIdPlaceholder": "Beispiel: {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} ID, Beispiel {{collectionName}}1",
"existingContainers": "Vorhandene Container",
"partitionKeyWarning": "Der Zielcontainer darf nicht bereits vorhanden sein. Daten-Explorer erstellt einen neuen Zielcontainer für Sie."
},
"cassandraAddCollection": {
"keyspaceLabel": "Keyspacename",
"keyspaceTooltip": "Wählen Sie einen vorhandenen Keyspace aus, oder geben Sie eine neue Keyspace-ID ein.",
"tableIdLabel": "Geben Sie den CQL-Befehl ein, um die Tabelle zu erstellen.",
"enterTableId": "Tabellen-ID eingeben",
"tableSchemaAriaLabel": "Tabellenschema",
"provisionDedicatedThroughput": "Dedizierten Durchsatz für diese Tabelle bereitstellen",
"provisionDedicatedThroughputTooltip": "Sie können optional dedizierten Durchsatz für eine Tabelle in einem Keyspace bereitstellen, in dem Durchsatz bereitgestellt wurde. Diese dedizierte Durchsatzmenge wird nicht für andere Tabellen im Keyspace freigegeben und wird nicht auf den Durchsatz angerechnet, den Sie für den Keyspace bereitgestellt haben. Diese Durchsatzmenge wird zusätzlich zu dem Durchsatz in Rechnung gestellt, den Sie auf Keyspaceebene bereitgestellt haben."
},
"tables": {
"addProperty": "Eigenschaft hinzufügen",
"addRow": "Zeile hinzufügen",
"addEntity": "Entität hinzufügen",
"back": "zurück",
"nullFieldsWarning": "Warnung: Nullfelder werden nicht zum Bearbeiten angezeigt.",
"propertyEmptyError": "{{property}} darf nicht leer sein. Geben Sie einen Wert für {{property}} ein.",
"whitespaceError": "{{property}} darf keine Leerzeichen enthalten. Geben Sie einen Wert für {{property}} ohne Leerzeichen ein.",
"propertyTypeEmptyError": "Der Eigenschaftentyp darf nicht leer sein. Wählen Sie einen Typ aus der Dropdownliste für die Eigenschaft {{property}} aus."
},
"tableQuerySelect": {
"selectColumns": "Wählen Sie die Spalten aus, die abgefragt werden sollen.",
"availableColumns": "Verfügbare Spalten"
},
"tableColumnSelection": {
"selectColumns": "Wählen Sie aus, welche Spalten in der Ansicht der Elemente in Ihrem Container angezeigt werden sollen.",
"searchFields": "Suchfelder",
"reset": "Zurücksetzen",
"partitionKeySuffix": " (Partitionsschlüssel)"
},
"newVertex": {
"addProperty": "Eigenschaft hinzufügen"
},
"addGlobalSecondaryIndex": {
"globalSecondaryIndexId": "Container-ID des globalen sekundären Indexes",
"globalSecondaryIndexIdPlaceholder": "Beispiel: indexbyEmailId",
"projectionQuery": "Projektionsabfrage",
"projectionQueryPlaceholder": "SELECT c.email, c.accountId FROM c",
"projectionQueryTooltip": "Erfahren Sie mehr über das Definieren globaler sekundärer Indizes.",
"disabledTitle": "Ein globaler sekundärer Index wird bereits erstellt. Warten Sie, bis der Vorgang abgeschlossen ist, bevor Sie einen weiteren erstellen."
},
"stringInput": {
"inputMismatchError": "Die Eingabe {{input}} stimmt nicht mit der ausgewählten {{selectedId}} überein."
},
"panelInfo": {
"information": "Informationen",
"moreDetails": "Weitere Details"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Scale",
"conflictResolution": "Conflict Resolution",
"settings": "Settings",
"indexingPolicy": "Indexing Policy",
"partitionKeys": "Partition Keys",
"partitionKeysPreview": "Partition Keys (preview)",
"computedProperties": "Computed Properties",
"containerPolicies": "Container Policies",
"throughputBuckets": "Throughput Buckets",
"globalSecondaryIndexPreview": "Global Secondary Index (Preview)",
"maskingPolicyPreview": "Masking Policy (preview)"
},
"mongoNotifications": {
"selectTypeWarning": "Please select a type for each index.",
"enterFieldNameError": "Geben Sie einen Feldnamen ein.",
"wildcardPathError": "Wildcard path is not present in the field name. Use a pattern like "
},
"partitionKey": {
"shardKey": "Shard key",
"partitionKey": "Partition key",
"shardKeyTooltip": "Der Shardschlüssel (Feld) wird verwendet, um Ihre Daten auf viele Replikatgruppen (Shards) aufzuteilen, um unbegrenzte Skalierbarkeit zu erzielen. Es ist wichtig, ein Feld auszuwählen, das Ihre Daten gleichmäßig verteilt.",
"partitionKeyTooltip": "is used to automatically distribute data across partitions for scalability. Choose a property in your JSON document that has a wide range of values and evenly distributes request volume.",
"sqlPartitionKeyTooltipSuffix": " Bei kleinen Workloads mit vielen Lese- oder Schreibvorgängen beliebiger Größe ist die ID häufig eine gute Wahl.",
"partitionKeySubtext": "For small workloads, the item ID is a suitable choice for the partition key.",
"mongoPlaceholder": "e.g., categoryId",
"gremlinPlaceholder": "e.g., /address",
"sqlFirstPartitionKey": "Erforderlich erster Partitionsschlüssel, z. B. /TenantId",
"sqlSecondPartitionKey": "zweiter Partitionsschlüssel, z. B. /UserId",
"sqlThirdPartitionKey": "Dritter Partitionsschlüssel, z. B. /SessionId",
"defaultPlaceholder": "e.g., /address/zipCode"
},
"costEstimate": {
"title": "Cost estimate*",
"howWeCalculate": "How we calculate this",
"updatedCostPerMonth": "Updated cost per month",
"currentCostPerMonth": "Current cost per month",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "The starting autoscale max RU/s will be determined by the system, based on the current manual throughput settings and storage of your resource. After autoscale has been enabled, you can change the max RU/s.",
"ttlWarningText": "The system will automatically delete items based on the TTL value (in seconds) you provide, without needing a delete operation explicitly issued by a client application. For more information see,",
"ttlWarningLinkText": "Time to Live (TTL) in Azure Cosmos DB",
"unsavedIndexingPolicy": "indexing policy",
"unsavedDataMaskingPolicy": "data masking policy",
"unsavedComputedProperties": "computed properties",
"unsavedEditorWarningPrefix": "You have not saved the latest changes made to your",
"unsavedEditorWarningSuffix": ". Please click save to confirm the changes.",
"updateDelayedApplyWarning": "You are about to request an increase in throughput beyond the pre-allocated capacity. This operation will take some time to complete.",
"scalingUpDelayMessage": "Scaling up will take 4-6 hours as it exceeds what Azure Cosmos DB can instantly support currently based on your number of physical partitions. You can increase your throughput to {{instantMaximumThroughput}} instantly or proceed with this value and wait until the scale-up is completed.",
"exceedPreAllocatedMessage": "Your request to increase throughput exceeds the pre-allocated capacity which may take longer than expected. There are three options you can choose from to proceed:",
"instantScaleOption": "You can instantly scale up to {{instantMaximumThroughput}} RU/s.",
"asyncScaleOption": "You can asynchronously scale up to any value under {{maximumThroughput}} RU/s in 4-6 hours.",
"quotaMaxOption": "Your current quota max is {{maximumThroughput}} RU/s. To go over this limit, you must request a quota increase and the Azure Cosmos DB team will review.",
"belowMinimumMessage": "You are not able to lower throughput below your current minimum of {{minimum}} RU/s. For more information on this limit, please refer to our service quote documentation.",
"saveThroughputWarning": "Your bill will be affected as you update your throughput settings. Please review the updated cost estimate below before saving your changes",
"currentAutoscaleThroughput": "Current autoscale throughput:",
"targetAutoscaleThroughput": "Target autoscale throughput:",
"currentManualThroughput": "Current manual throughput:",
"targetManualThroughput": "Target manual throughput:",
"applyDelayedMessage": "The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"databaseLabel": "Database:",
"containerLabel": "Container:",
"applyShortDelayMessage": "A request to increase the throughput is currently in progress. This operation will take some time to complete.",
"applyLongDelayMessage": "A request to increase the throughput is currently in progress. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"throughputCapError": "Your account is currently configured with a total throughput limit of {{throughputCap}} RU/s. This update isn't possible because it would increase the total throughput to {{newTotalThroughput}} RU/s. Change total throughput limit in cost management.",
"throughputIncrementError": "Throughput value must be in increments of 1000"
},
"conflictResolution": {
"lwwDefault": "Last Write Wins (default)",
"customMergeProcedure": "Merge Procedure (custom)",
"mode": "Mode",
"conflictResolverProperty": "Conflict Resolver Property",
"storedProcedure": "Stored procedure",
"lwwTooltip": "Gets or sets the name of a integer property in your documents which is used for the Last Write Wins (LWW) based conflict resolution scheme. By default, the system uses the system defined timestamp property, _ts to decide the winner for the conflicting versions of the document. Specify your own integer property if you want to override the default timestamp based conflict resolution.",
"customTooltip": "Gets or sets the name of a stored procedure (aka merge procedure) for resolving the conflicts. You can write application defined logic to determine the winner of the conflicting versions of a document. The stored procedure will get executed transactionally, exactly once, on the server side. If you do not provide a stored procedure, the conflicts will be populated in the",
"customTooltipConflictsFeed": " conflicts feed",
"customTooltipSuffix": ". You can update/re-register the stored procedure at any time."
},
"changeFeed": {
"label": "Change feed log retention policy",
"tooltip": "Enable change feed log retention policy to retain last 10 minutes of history for items in the container by default. To support this, the request unit (RU) charge for this container will be multiplied by a factor of two for writes. Reads are unaffected."
},
"mongoIndexing": {
"disclaimer": "For queries that filter on multiple properties, create multiple single field indexes instead of a compound index.",
"disclaimerCompoundIndexesLink": " Compound indexes ",
"disclaimerSuffix": "are only used for sorting query results. If you need to add a compound index, you can create one using the Mongo shell.",
"compoundNotSupported": "Collections with compound indexes are not yet supported in the indexing editor. To modify indexing policy for this collection, use the Mongo Shell.",
"aadError": "To use the indexing policy editor, please login to the",
"aadErrorLink": "azure portal.",
"refreshingProgress": "Refreshing index transformation progress",
"canMakeMoreChangesZero": "You can make more indexing changes once the current index transformation is complete. ",
"refreshToCheck": "Refresh to check if it has completed.",
"canMakeMoreChangesProgress": "You can make more indexing changes once the current index transformation has completed. It is {{progress}}% complete. ",
"refreshToCheckProgress": "Refresh to check the progress.",
"definitionColumn": "Definition",
"typeColumn": "Type",
"dropIndexColumn": "Drop Index",
"addIndexBackColumn": "Add index back",
"deleteIndexButton": "Delete index Button",
"addBackIndexButton": "Add back Index Button",
"currentIndexes": "Current index(es)",
"indexesToBeDropped": "Index(es) to be dropped",
"indexFieldName": "Index Field Name",
"indexType": "Index Type",
"selectIndexType": "Select an index type",
"undoButton": "Undo Button"
},
"subSettings": {
"timeToLive": "Time to Live",
"ttlOff": "Off",
"ttlOnNoDefault": "On (no default)",
"ttlOn": "On",
"seconds": "second(s)",
"timeToLiveInSeconds": "Time to live in seconds",
"analyticalStorageTtl": "Analytical Storage Time to Live",
"geospatialConfiguration": "Geospatial Configuration",
"geography": "Geography",
"geometry": "Geometry",
"uniqueKeys": "Unique keys",
"mongoTtlMessage": "To enable time-to-live (TTL) for your collection/documents,",
"mongoTtlLinkText": "create a TTL index",
"partitionKeyTooltipTemplate": "This {{partitionKeyName}} is used to distribute data across multiple partitions for scalability. The value \"{{partitionKeyValue}}\" determines how documents are partitioned.",
"largePartitionKeyEnabled": "Large {{partitionKeyName}} has been enabled.",
"hierarchicalPartitioned": "Hierarchically partitioned container.",
"nonHierarchicalPartitioned": "Non-hierarchically partitioned container."
},
"scale": {
"freeTierInfo": "With free tier, you will get the first {{ru}} RU/s and {{storage}} GB of storage in this account for free. To keep your account free, keep the total RU/s across all resources in the account to {{ru}} RU/s.",
"freeTierLearnMore": "Learn more.",
"throughputRuS": "Throughput (RU/s)",
"autoScaleCustomSettings": "Your account has custom settings that prevents setting throughput at the container level. Please work with your Cosmos DB engineering team point of contact to make changes.",
"keyspaceSharedThroughput": "This table shared throughput is configured at the keyspace",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Change {{partitionKeyName}}",
"currentPartitionKey": "Current {{partitionKeyName}}",
"partitioning": "Partitioning",
"hierarchical": "Hierarchical",
"nonHierarchical": "Non-hierarchical",
"safeguardWarning": "To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to the source container for the entire duration of the partition key change process.",
"changeDescription": "To change the partition key, a new destination container must be created or an existing destination container selected. Data will then be copied to the destination container.",
"changeButton": "Change",
"changeJob": "{{partitionKeyName}} change job",
"cancelButton": "Cancel",
"documentsProcessed": "({{processedCount}} of {{totalCount}} documents processed)"
},
"computedProperties": {
"ariaLabel": "Computed properties",
"learnMorePrefix": "about how to define computed properties and how to use them."
},
"indexingPolicy": {
"ariaLabel": "Indexing Policy"
},
"dataMasking": {
"ariaLabel": "Data Masking Policy",
"validationFailed": "Validation failed:",
"includedPathsRequired": "includedPaths is required",
"includedPathsMustBeArray": "includedPaths must be an array",
"excludedPathsMustBeArray": "excludedPaths must be an array if provided"
},
"containerPolicy": {
"vectorPolicy": "Vector Policy",
"fullTextPolicy": "Full Text Policy",
"createFullTextPolicy": "Create new full text search policy"
},
"globalSecondaryIndex": {
"indexesDefined": "This container has the following indexes defined for it.",
"learnMoreSuffix": "about how to define global secondary indexes and how to use them.",
"jsonAriaLabel": "Global Secondary Index JSON",
"addIndex": "Add index",
"settingsTitle": "Global Secondary Index Settings",
"sourceContainer": "Source container",
"indexDefinition": "Global secondary index definition"
},
"indexingPolicyRefresh": {
"refreshFailed": "Refreshing index transformation progress failed"
},
"throughputInput": {
"autoscale": "Autoscale",
"manual": "Manual",
"minimumRuS": "Minimum RU/s",
"maximumRuS": "Maximum RU/s",
"x10Equals": "x 10 =",
"storageCapacity": "Storage capacity",
"fixed": "Fixed",
"unlimited": "Unlimited",
"instant": "Instant",
"fourToSixHrs": "4-6 hrs",
"autoscaleDescription": "Based on usage, your {{resourceType}} throughput will scale from",
"freeTierWarning": "Billing will apply if you provision more than {{ru}} RU/s of manual throughput, or if the resource scales beyond {{ru}} RU/s with autoscale.",
"capacityCalculator": "Estimate your required RU/s with",
"capacityCalculatorLink": " capacity calculator",
"fixedStorageNote": "When using a collection with fixed storage capacity, you can set up to 10,000 RU/s.",
"min": "min",
"max": "max"
},
"throughputBuckets": {
"label": "Throughput Buckets",
"bucketLabel": "Bucket {{id}}",
"dataExplorerQueryBucket": " (Data Explorer Query Bucket)",
"active": "Active",
"inactive": "Inactive"
}
}
}
}

View File

@@ -441,7 +441,11 @@
"shareThroughput": "Share throughput across {{collectionsLabel}}",
"shareThroughputTooltip": "Provisioned throughput at the {{databaseLabel}} level will be shared across all {{collectionsLabel}} within the {{databaseLabel}}.",
"greaterThanError": "Please enter a value greater than {{minValue}} for autopilot throughput",
"acknowledgeSpendError": "Please acknowledge the estimated {{period}} spend."
"acknowledgeSpendError": "Please acknowledge the estimated {{period}} spend.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "Create new",
@@ -493,7 +497,31 @@
"acknowledgeShareThroughputError": "Please acknowledge the estimated cost of this dedicated throughput.",
"vectorPolicyError": "Please fix errors in container vector policy",
"fullTextSearchPolicyError": "Please fix errors in container full text search policy",
"addingSampleDataSet": "Adding sample data set"
"addingSampleDataSet": "Adding sample data set",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "The shard key (field) is used to split your data across many replica sets (shards) to achieve unlimited scalability. It's critical to choose a field that will evenly distribute your data.",
@@ -723,5 +751,218 @@
"information": "Information",
"moreDetails": "More details"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Scale",
"conflictResolution": "Conflict Resolution",
"settings": "Settings",
"indexingPolicy": "Indexing Policy",
"partitionKeys": "Partition Keys",
"partitionKeysPreview": "Partition Keys (preview)",
"computedProperties": "Computed Properties",
"containerPolicies": "Container Policies",
"throughputBuckets": "Throughput Buckets",
"globalSecondaryIndexPreview": "Global Secondary Index (Preview)",
"maskingPolicyPreview": "Masking Policy (preview)"
},
"mongoNotifications": {
"selectTypeWarning": "Please select a type for each index.",
"enterFieldNameError": "Please enter a field name.",
"wildcardPathError": "Wildcard path is not present in the field name. Use a pattern like "
},
"partitionKey": {
"shardKey": "Shard key",
"partitionKey": "Partition key",
"shardKeyTooltip": "The shard key (field) is used to split your data across many replica sets (shards) to achieve unlimited scalability. It's critical to choose a field that will evenly distribute your data.",
"partitionKeyTooltip": "is used to automatically distribute data across partitions for scalability. Choose a property in your JSON document that has a wide range of values and evenly distributes request volume.",
"sqlPartitionKeyTooltipSuffix": " For small read-heavy workloads or write-heavy workloads of any size, id is often a good choice.",
"partitionKeySubtext": "For small workloads, the item ID is a suitable choice for the partition key.",
"mongoPlaceholder": "e.g., categoryId",
"gremlinPlaceholder": "e.g., /address",
"sqlFirstPartitionKey": "Required - first partition key e.g., /TenantId",
"sqlSecondPartitionKey": "second partition key e.g., /UserId",
"sqlThirdPartitionKey": "third partition key e.g., /SessionId",
"defaultPlaceholder": "e.g., /address/zipCode"
},
"costEstimate": {
"title": "Cost estimate*",
"howWeCalculate": "How we calculate this",
"updatedCostPerMonth": "Updated cost per month",
"currentCostPerMonth": "Current cost per month",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "The starting autoscale max RU/s will be determined by the system, based on the current manual throughput settings and storage of your resource. After autoscale has been enabled, you can change the max RU/s.",
"ttlWarningText": "The system will automatically delete items based on the TTL value (in seconds) you provide, without needing a delete operation explicitly issued by a client application. For more information see,",
"ttlWarningLinkText": "Time to Live (TTL) in Azure Cosmos DB",
"unsavedIndexingPolicy": "indexing policy",
"unsavedDataMaskingPolicy": "data masking policy",
"unsavedComputedProperties": "computed properties",
"unsavedEditorWarningPrefix": "You have not saved the latest changes made to your",
"unsavedEditorWarningSuffix": ". Please click save to confirm the changes.",
"updateDelayedApplyWarning": "You are about to request an increase in throughput beyond the pre-allocated capacity. This operation will take some time to complete.",
"scalingUpDelayMessage": "Scaling up will take 4-6 hours as it exceeds what Azure Cosmos DB can instantly support currently based on your number of physical partitions. You can increase your throughput to {{instantMaximumThroughput}} instantly or proceed with this value and wait until the scale-up is completed.",
"exceedPreAllocatedMessage": "Your request to increase throughput exceeds the pre-allocated capacity which may take longer than expected. There are three options you can choose from to proceed:",
"instantScaleOption": "You can instantly scale up to {{instantMaximumThroughput}} RU/s.",
"asyncScaleOption": "You can asynchronously scale up to any value under {{maximumThroughput}} RU/s in 4-6 hours.",
"quotaMaxOption": "Your current quota max is {{maximumThroughput}} RU/s. To go over this limit, you must request a quota increase and the Azure Cosmos DB team will review.",
"belowMinimumMessage": "You are not able to lower throughput below your current minimum of {{minimum}} RU/s. For more information on this limit, please refer to our service quote documentation.",
"saveThroughputWarning": "Your bill will be affected as you update your throughput settings. Please review the updated cost estimate below before saving your changes",
"currentAutoscaleThroughput": "Current autoscale throughput:",
"targetAutoscaleThroughput": "Target autoscale throughput:",
"currentManualThroughput": "Current manual throughput:",
"targetManualThroughput": "Target manual throughput:",
"applyDelayedMessage": "The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"databaseLabel": "Database:",
"containerLabel": "Container:",
"applyShortDelayMessage": "A request to increase the throughput is currently in progress. This operation will take some time to complete.",
"applyLongDelayMessage": "A request to increase the throughput is currently in progress. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"throughputCapError": "Your account is currently configured with a total throughput limit of {{throughputCap}} RU/s. This update isn't possible because it would increase the total throughput to {{newTotalThroughput}} RU/s. Change total throughput limit in cost management.",
"throughputIncrementError": "Throughput value must be in increments of 1000"
},
"conflictResolution": {
"lwwDefault": "Last Write Wins (default)",
"customMergeProcedure": "Merge Procedure (custom)",
"mode": "Mode",
"conflictResolverProperty": "Conflict Resolver Property",
"storedProcedure": "Stored procedure",
"lwwTooltip": "Gets or sets the name of a integer property in your documents which is used for the Last Write Wins (LWW) based conflict resolution scheme. By default, the system uses the system defined timestamp property, _ts to decide the winner for the conflicting versions of the document. Specify your own integer property if you want to override the default timestamp based conflict resolution.",
"customTooltip": "Gets or sets the name of a stored procedure (aka merge procedure) for resolving the conflicts. You can write application defined logic to determine the winner of the conflicting versions of a document. The stored procedure will get executed transactionally, exactly once, on the server side. If you do not provide a stored procedure, the conflicts will be populated in the",
"customTooltipConflictsFeed": " conflicts feed",
"customTooltipSuffix": ". You can update/re-register the stored procedure at any time."
},
"changeFeed": {
"label": "Change feed log retention policy",
"tooltip": "Enable change feed log retention policy to retain last 10 minutes of history for items in the container by default. To support this, the request unit (RU) charge for this container will be multiplied by a factor of two for writes. Reads are unaffected."
},
"mongoIndexing": {
"disclaimer": "For queries that filter on multiple properties, create multiple single field indexes instead of a compound index.",
"disclaimerCompoundIndexesLink": " Compound indexes ",
"disclaimerSuffix": "are only used for sorting query results. If you need to add a compound index, you can create one using the Mongo shell.",
"compoundNotSupported": "Collections with compound indexes are not yet supported in the indexing editor. To modify indexing policy for this collection, use the Mongo Shell.",
"aadError": "To use the indexing policy editor, please login to the",
"aadErrorLink": "azure portal.",
"refreshingProgress": "Refreshing index transformation progress",
"canMakeMoreChangesZero": "You can make more indexing changes once the current index transformation is complete. ",
"refreshToCheck": "Refresh to check if it has completed.",
"canMakeMoreChangesProgress": "You can make more indexing changes once the current index transformation has completed. It is {{progress}}% complete. ",
"refreshToCheckProgress": "Refresh to check the progress.",
"definitionColumn": "Definition",
"typeColumn": "Type",
"dropIndexColumn": "Drop Index",
"addIndexBackColumn": "Add index back",
"deleteIndexButton": "Delete index Button",
"addBackIndexButton": "Add back Index Button",
"currentIndexes": "Current index(es)",
"indexesToBeDropped": "Index(es) to be dropped",
"indexFieldName": "Index Field Name",
"indexType": "Index Type",
"selectIndexType": "Select an index type",
"undoButton": "Undo Button"
},
"subSettings": {
"timeToLive": "Time to Live",
"ttlOff": "Off",
"ttlOnNoDefault": "On (no default)",
"ttlOn": "On",
"seconds": "second(s)",
"timeToLiveInSeconds": "Time to live in seconds",
"analyticalStorageTtl": "Analytical Storage Time to Live",
"geospatialConfiguration": "Geospatial Configuration",
"geography": "Geography",
"geometry": "Geometry",
"uniqueKeys": "Unique keys",
"mongoTtlMessage": "To enable time-to-live (TTL) for your collection/documents,",
"mongoTtlLinkText": "create a TTL index",
"partitionKeyTooltipTemplate": "This {{partitionKeyName}} is used to distribute data across multiple partitions for scalability. The value \"{{partitionKeyValue}}\" determines how documents are partitioned.",
"largePartitionKeyEnabled": "Large {{partitionKeyName}} has been enabled.",
"hierarchicalPartitioned": "Hierarchically partitioned container.",
"nonHierarchicalPartitioned": "Non-hierarchically partitioned container."
},
"scale": {
"freeTierInfo": "With free tier, you will get the first {{ru}} RU/s and {{storage}} GB of storage in this account for free. To keep your account free, keep the total RU/s across all resources in the account to {{ru}} RU/s.",
"freeTierLearnMore": "Learn more.",
"throughputRuS": "Throughput (RU/s)",
"autoScaleCustomSettings": "Your account has custom settings that prevents setting throughput at the container level. Please work with your Cosmos DB engineering team point of contact to make changes.",
"keyspaceSharedThroughput": "This table shared throughput is configured at the keyspace",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Change {{partitionKeyName}}",
"currentPartitionKey": "Current {{partitionKeyName}}",
"partitioning": "Partitioning",
"hierarchical": "Hierarchical",
"nonHierarchical": "Non-hierarchical",
"safeguardWarning": "To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to the source container for the entire duration of the partition key change process.",
"changeDescription": "To change the partition key, a new destination container must be created or an existing destination container selected. Data will then be copied to the destination container.",
"changeButton": "Change",
"changeJob": "{{partitionKeyName}} change job",
"cancelButton": "Cancel",
"documentsProcessed": "({{processedCount}} of {{totalCount}} documents processed)"
},
"computedProperties": {
"ariaLabel": "Computed properties",
"learnMorePrefix": "about how to define computed properties and how to use them."
},
"indexingPolicy": {
"ariaLabel": "Indexing Policy"
},
"dataMasking": {
"ariaLabel": "Data Masking Policy",
"validationFailed": "Validation failed:",
"includedPathsRequired": "includedPaths is required",
"includedPathsMustBeArray": "includedPaths must be an array",
"excludedPathsMustBeArray": "excludedPaths must be an array if provided"
},
"containerPolicy": {
"vectorPolicy": "Vector Policy",
"fullTextPolicy": "Full Text Policy",
"createFullTextPolicy": "Create new full text search policy"
},
"globalSecondaryIndex": {
"indexesDefined": "This container has the following indexes defined for it.",
"learnMoreSuffix": "about how to define global secondary indexes and how to use them.",
"jsonAriaLabel": "Global Secondary Index JSON",
"addIndex": "Add index",
"settingsTitle": "Global Secondary Index Settings",
"sourceContainer": "Source container",
"indexDefinition": "Global secondary index definition"
},
"indexingPolicyRefresh": {
"refreshFailed": "Refreshing index transformation progress failed"
},
"throughputInput": {
"autoscale": "Autoscale",
"manual": "Manual",
"minimumRuS": "Minimum RU/s",
"maximumRuS": "Maximum RU/s",
"x10Equals": "x 10 =",
"storageCapacity": "Storage capacity",
"fixed": "Fixed",
"unlimited": "Unlimited",
"instant": "Instant",
"fourToSixHrs": "4-6 hrs",
"autoscaleDescription": "Based on usage, your {{resourceType}} throughput will scale from",
"freeTierWarning": "Billing will apply if you provision more than {{ru}} RU/s of manual throughput, or if the resource scales beyond {{ru}} RU/s with autoscale.",
"capacityCalculator": "Estimate your required RU/s with",
"capacityCalculatorLink": " capacity calculator",
"fixedStorageNote": "When using a collection with fixed storage capacity, you can set up to 10,000 RU/s.",
"min": "min",
"max": "max"
},
"throughputBuckets": {
"label": "Throughput Buckets",
"bucketLabel": "Bucket {{id}}",
"dataExplorerQueryBucket": " (Data Explorer Query Bucket)",
"active": "Active",
"inactive": "Inactive"
}
}
}
}

View File

@@ -29,6 +29,9 @@
"upload": "Cargar",
"connect": "Conectar",
"remove": "Quitar",
"load": "Cargar",
"publish": "Publicar",
"browse": "Examinar",
"increaseValueBy1": "Aumentar valor en 1",
"decreaseValueBy1": "Disminuir valor en 1"
},
@@ -291,5 +294,675 @@
"errorCreateContainer": "Error al crear el contenedor: {{error}}",
"errorImportData": "No se pudieron importar los datos: {{error}}"
}
},
"contextMenu": {
"newContainer": "Nuevo {{containerName}}",
"restoreContainer": "Restaurar {{containerName}}",
"deleteDatabase": "Eliminar {{databaseName}}",
"deleteContainer": "Eliminar {{containerName}}",
"newSqlQuery": "Nueva consulta de SQL",
"newQuery": "Nueva consulta",
"openMongoShell": "Abrir Shell de Mongo",
"newShell": "Nuevo shell",
"openCassandraShell": "Abrir Shell de Cassandra",
"newStoredProcedure": "Nuevo procedimiento almacenado",
"newUdf": "Nueva UDF",
"newTrigger": "Nuevo desencadenador",
"deleteStoredProcedure": "Eliminar procedimiento almacenado",
"deleteTrigger": "Eliminar desencadenador",
"deleteUdf": "Eliminar función definida por el usuario"
},
"tabs": {
"documents": {
"newItem": "Nuevo elemento",
"newDocument": "Nuevo documento",
"uploadItem": "Cargar elemento",
"applyFilter": "Aplicar filtro",
"unsavedChanges": "Cambios sin guardar",
"unsavedChangesMessage": "Se perderán los cambios no guardados. ¿Quiere continuar?",
"createDocumentFailed": "Error al crear el documento",
"updateDocumentFailed": "Error al actualizar el documento",
"documentDeleted": "El documento se eliminó correctamente.",
"deleteDocumentDialogTitle": "Eliminar documento",
"deleteDocumentsDialogTitle": "Eliminar documentos",
"throttlingError": "Algunos documentos no se pudieron eliminar debido a un error de limitación de velocidad. Inténtelo de nuevo más tarde. Para evitar esto en el futuro, considere la posibilidad de aumentar el rendimiento en el contenedor o la base de datos.",
"deleteFailed": "Error al eliminar documentos ({{error}})",
"missingShardProperty": "El documento carece de la propiedad de partición: {{partitionKeyProperty}}",
"refreshGridFailed": "Error al actualizar la cuadrícula de documentos",
"confirmDelete": "¿Seguro que desea eliminar {{documentName}}?",
"confirmDeleteTitle": "Confirmar eliminación",
"selectedItems": "los elementos seleccionados {{count}}",
"selectedItem": "el elemento seleccionado",
"selectedDocuments": "los documentos seleccionados {{count}} ",
"selectedDocument": "el documento seleccionado",
"deleteDocumentFailedLog": "No se pudo eliminar el documento {{documentId}} con código de estado {{statusCode}}",
"deleteSuccessLog": "Documentos eliminados {{count}} correctamente",
"deleteThrottledLog": "No se pudieron eliminar {{count}} documentos debido al error \"Solicitud demasiado grande\" (429). Reintentando...",
"missingShardKeyLog": "No se pudo guardar el nuevo documento: clave de partición de documento no definida",
"filterTooltip": "Escriba un predicado de consulta o elija uno de la lista.",
"loadMore": "Cargar más",
"documentEditor": "Editor de documentos",
"savedFilters": "Filtros guardados",
"defaultFilters": "Filtros predeterminados",
"abort": "Anular",
"deletingDocuments": "Eliminando {{count}} documentos",
"deletedDocumentsSuccess": "Los documentos se eliminaron {{count}} correctamente.",
"deleteAborted": "Se anuló la eliminación de documentos.",
"failedToDeleteDocuments": "No se pudieron eliminar {{count}} documentos.",
"requestTooLargeBase": "Error en algunas solicitudes de eliminación debido a una excepción \"Solicitud demasiado grande\" (429)",
"retriedSuccessfully": "pero se reintentaron correctamente.",
"retryingNow": "Reintentar ahora.",
"increaseThroughputTip": "Para evitar esto en el futuro, considere la posibilidad de aumentar el rendimiento en el contenedor o la base de datos.",
"numberOfSelectedDocuments": "Número de documentos seleccionados: {{count}}",
"mongoFilterPlaceholder": "Escriba un predicado de consulta (por ejemplo, {\"id\":\"foo\"}), elija uno de la lista desplegable o déjelo vacío para consultar todos los documentos.",
"sqlFilterPlaceholder": "Escriba un predicado de consulta (por ejemplo, WHERE c.id=\"1\"), elija uno de la lista desplegable o déjelo vacío para consultar todos los documentos.",
"error": "Error",
"warning": "Advertencia"
},
"query": {
"executeQuery": "Ejecutar la consulta",
"executeSelection": "Ejecutar selección",
"saveQuery": "Guardar consulta",
"downloadQuery": "Descargar consulta",
"cancelQuery": "Cancelar consulta",
"openSavedQueries": "Abrir consultas guardadas",
"vertical": "Vertical",
"horizontal": "Horizontal",
"view": "Vista",
"editingQuery": "Editar consulta"
},
"storedProcedure": {
"id": "Id. de procedimiento almacenado",
"idPlaceholder": "Escriba el nuevo identificador de procedimiento almacenado",
"idAriaLabel": "Id. de procedimiento almacenado",
"body": "Cuerpo del procedimiento almacenado",
"bodyAriaLabel": "Cuerpo del procedimiento almacenado",
"successfulExecution": "Ejecución correcta del procedimiento almacenado",
"resultAriaLabel": "Ejecutar resultado de procedimiento almacenado",
"logsAriaLabel": "Ejecución de registros de procedimientos almacenados",
"errors": "Errores:",
"errorDetailsAriaLabel": "Vínculo de detalles del error",
"moreDetails": "Más detalles",
"consoleLogTab": "console.log"
},
"trigger": {
"id": "Id. de desencadenador",
"idPlaceholder": "Escriba el nuevo identificador del desencadenador",
"type": "Tipo de desencadenador",
"operation": "Operación del desencadenador",
"body": "Cuerpo del desencadenador",
"bodyAriaLabel": "Cuerpo del desencadenador",
"pre": "Previo",
"post": "Publicar",
"all": "Todo",
"operationCreate": "Crear",
"operationDelete": "Eliminar",
"operationReplace": "Reemplazar"
},
"udf": {
"id": "Id. de función definida por el usuario",
"idPlaceholder": "Escriba el nuevo identificador de función definido por el usuario",
"body": "Cuerpo de la función definida por el usuario",
"bodyAriaLabel": "Cuerpo de la función definida por el usuario"
},
"conflicts": {
"unsavedChanges": "Cambios sin guardar",
"changesWillBeLost": "Se perderán los cambios. ¿Quiere continuar?",
"resolveConflictFailed": "Error al resolver el conflicto",
"deleteConflictFailed": "Error al eliminar el conflicto",
"refreshGridFailed": "Error al actualizar la cuadrícula de documentos"
},
"mongoShell": {
"title": "Mongo Shell"
}
},
"panes": {
"deleteDatabase": {
"panelTitle": "Eliminar {{databaseName}}",
"warningMessage": "¡Advertencia! La acción que va a realizar no se puede deshacer. Si continúa, se eliminará permanentemente este recurso y todos sus recursos secundarios.",
"confirmPrompt": "Confirme escribiendo el {{databaseName}} identificador (nombre)",
"inputMismatch": "El nombre de entrada {{databaseName}} \"{{input}}\" no coincide con el {{databaseName}} seleccionado \"{{selectedId}}\"",
"feedbackTitle": "Ayúdenos a mejorar Azure Cosmos DB.",
"feedbackReason": "¿Cuál es el motivo por el que está eliminando esto {{databaseName}}?"
},
"deleteCollection": {
"panelTitle": "Eliminar {{collectionName}}",
"confirmPrompt": "Confirme escribiendo el {{collectionName}} id.",
"inputMismatch": "El id de entrada {{input}} no coincide con el seleccionado {{selectedId}}",
"feedbackTitle": "Ayúdenos a mejorar Azure Cosmos DB.",
"feedbackReason": "¿Cuál es el motivo por el que está eliminando esto {{collectionName}}?"
},
"addDatabase": {
"databaseLabel": "Base de datos {{suffix}}",
"databaseIdLabel": "Id. de base de datos",
"keyspaceIdLabel": "Id. de espacio de claves",
"databaseIdPlaceholder": "Escriba un nuevo {{databaseLabel}} identificador",
"databaseTooltip": "Un {{databaseLabel}} es un contenedor lógico de uno o varios {{collectionsLabel}}",
"shareThroughput": "Compartir el rendimiento entre {{collectionsLabel}}",
"shareThroughputTooltip": "El rendimiento aprovisionado en el {{databaseLabel}} nivel se compartirá entre todos {{collectionsLabel}} dentro de {{databaseLabel}}.",
"greaterThanError": "Escriba un valor mayor que para el {{minValue}} rendimiento de Autopilot",
"acknowledgeSpendError": "Confirme el gasto estimado {{period}}.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "Crear nuevo",
"useExisting": "Usar existente",
"databaseTooltip": "Una base de datos es análoga a un espacio de nombres. Es la unidad de administración de un conjunto de {{collectionName}}.",
"shareThroughput": "Compartir el rendimiento entre {{collectionName}}",
"shareThroughputTooltip": "El rendimiento configurado en el nivel de base de datos se compartirá en toda {{collectionName}} la base de datos.",
"collectionIdLabel": "{{collectionName}} Id. ",
"collectionIdTooltip": "Identificador único de y usado para el {{collectionName}} enrutamiento basado en identificadores a través de REST y todos los SDK.",
"collectionIdPlaceholder": "por ejemplo, {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} id., ejemplo {{collectionName}}1",
"existingDatabaseAriaLabel": "Elegir id. existente {{databaseName}} ",
"existingDatabasePlaceholder": "Elegir id. existente {{databaseName}} ",
"indexing": "Indexación",
"turnOnIndexing": "Activar la indexación",
"automatic": "Automático",
"turnOffIndexing": "Desactivar la indexación",
"off": "Desactivado",
"sharding": "Particionamiento",
"shardingTooltip": "Las colecciones particionadas dividen sus datos entre varios conjuntos de réplicas (shards) para lograr una escalabilidad ilimitada. Las colecciones particionadas requieren elegir una clave de partición (campo) para distribuir uniformemente los datos.",
"unsharded": "Sin cambios",
"unshardedLabel": "Sin cambios (límite de 20 GB)",
"sharded": "Particionado",
"addPartitionKey": "Agregar clave de partición jerárquica",
"hierarchicalPartitionKeyInfo": "Esta característica permite particionar los datos con hasta tres niveles de claves para una mejor distribución de los datos. Requiere .NET V3, el SDK de Java V4, o la versión preliminar del SDK de JavaScript V3.",
"provisionDedicatedThroughput": "Aprovisionar rendimiento dedicado para esto {{collectionName}}",
"provisionDedicatedThroughputTooltip": "Opcionalmente, puede aprovisionar un rendimiento dedicado para una {{collectionName}} base de datos que tenga el rendimiento aprovisionado. Esta cantidad de rendimiento dedicado no se compartirá con otros {{collectionNamePlural}} usuarios de la base de datos y no se contabilizará para el rendimiento aprovisionado para la base de datos. Esta cantidad de rendimiento se facturará además de la cantidad de rendimiento que aprovisionó en el nivel de base de datos.",
"uniqueKeysPlaceholderMongo": "Rutas de acceso separadas por comas, por ejemplo, firstName, address.zipCode",
"uniqueKeysPlaceholderSql": "Rutas de acceso separadas por comas, por ejemplo, /firstName,/address/zipCode",
"addUniqueKey": "Agregar clave única",
"enableAnalyticalStore": "Habilitar almacén analítico",
"disableAnalyticalStore": "Deshabilitar almacén analítico",
"on": "Activado",
"analyticalStoreSynapseLinkRequired": "Azure Synapse Link es necesario para crear un almacén analítico {{collectionName}}. Habilite Azure Synapse Link para esta cuenta de Cosmos DB.",
"enable": "Habilitar",
"containerVectorPolicy": "Directiva de vector de contenedor",
"containerFullTextSearchPolicy": "Directiva de búsqueda de texto completo del contenedor",
"advanced": "Avanzado",
"mongoIndexingTooltip": "El campo _id está indexado de forma predeterminada. La creación de un índice de caracteres comodín para todos los campos optimizará las consultas y se recomienda para el desarrollo.",
"createWildcardIndex": "Crear un índice de caracteres comodín en todos los campos",
"legacySdkCheckbox": "Mi aplicación usa una versión anterior del SDK de .NET o Java de Cosmos (.NET V1 o Java V2)",
"legacySdkInfo": "Para garantizar la compatibilidad con los SDK anteriores, el contenedor creado usará un esquema de partición heredado que admite valores de clave de partición de hasta 101 bytes de tamaño. Si esta opción está habilitada, no podrá usar claves de partición jerárquicas.",
"indexingOnInfo": "Todas las propiedades de los documentos se indexarán de forma predeterminada para que las consultas sean flexibles y eficaces.",
"indexingOffInfo": "La indexación se desactivará. Se recomienda si no necesita ejecutar consultas o solo tiene operaciones de valor de clave.",
"indexingOffWarning": "Al crear este contenedor con la indexación desactivada, no podrá realizar ningún cambio en la directiva de indexación. Los cambios de indexación solo se permiten en un contenedor con una directiva de indexación.",
"acknowledgeSpendErrorMonthly": "Confirme el gasto mensual estimado.",
"acknowledgeSpendErrorDaily": "Confirme el gasto diario estimado.",
"unshardedMaxRuError": "Las colecciones sin cambios admiten hasta 10 000 RU",
"acknowledgeShareThroughputError": "Confirme el coste estimado de este rendimiento dedicado.",
"vectorPolicyError": "Corrija los errores en la directiva de vector de contenedor",
"fullTextSearchPolicyError": "Corrija los errores en la directiva de búsqueda de texto completo del contenedor",
"addingSampleDataSet": "Adición de un conjunto de datos de ejemplo",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "La clave de partición (campo) se usa para dividir los datos entre muchos conjuntos de réplicas (particiones) para lograr una escalabilidad ilimitada. Es fundamental elegir un campo que distribuya uniformemente los datos.",
"partitionKeyTooltip": "El {{partitionKeyName}} se usa para distribuir datos automáticamente entre particiones con fines de escalabilidad. Elija una propiedad en el documento JSON que tenga una amplia gama de valores y distribuya uniformemente el volumen de solicitudes.",
"partitionKeyTooltipSqlSuffix": " En el caso de las cargas de trabajo de lectura intensiva o de escritura intensiva de cualquier tamaño, el identificador suele ser una buena opción.",
"shardKeyLabel": "Clave de partición",
"partitionKeyLabel": "Clave de partición",
"shardKeyPlaceholder": "por ejemplo, categoryId",
"partitionKeyPlaceholderDefault": "por ejemplo, /address",
"partitionKeyPlaceholderFirst": "Requerido: primera clave de partición, por ejemplo, /TenantId",
"partitionKeyPlaceholderSecond": "segunda clave de partición, p. ej., /UserId",
"partitionKeyPlaceholderThird": "tercera clave de partición, por ejemplo, /SessionId",
"partitionKeyPlaceholderGraph": "por ejemplo, /address/zipCode",
"uniqueKeysTooltip": "Las claves únicas proporcionan a los desarrolladores la capacidad de agregar una capa de integridad de datos a su base de datos. Al crear una directiva de clave única cuando se crea un contenedor, se garantiza la unicidad de uno o varios valores por clave de partición.",
"uniqueKeysLabel": "Claves únicas",
"analyticalStoreLabel": "Almacén analítico",
"analyticalStoreTooltip": "Habilite la funcionalidad de almacén analítico para realizar análisis casi en tiempo real de los datos operativos, sin afectar al rendimiento de las cargas de trabajo transaccionales.",
"analyticalStoreDescription": "Habilite la funcionalidad de almacén analítico para realizar análisis casi en tiempo real de los datos operativos, sin afectar al rendimiento de las cargas de trabajo transaccionales.",
"vectorPolicyTooltip": "Describir las propiedades de los datos que contienen vectores, de modo que se puedan poner a disposición de las consultas de similitud."
},
"settings": {
"pageOptions": "Opciones de página",
"pageOptionsDescription": "Elija Personalizar para especificar una cantidad fija de resultados de consulta para mostrar o elija Ilimitado para mostrar tantos resultados de consulta por página.",
"queryResultsPerPage": "Resultados de la consulta por página",
"queryResultsPerPageTooltip": "Escriba el número de resultados de la consulta que se deben mostrar por página.",
"customQueryItemsPerPage": "Elementos de consulta personalizados por página",
"custom": "Personalizado",
"unlimited": "Sin límites",
"entraIdRbac": "Habilitar RBAC de Entra ID",
"entraIdRbacDescription": "Elija Automático para habilitar RBAC de Entra ID automáticamente. True/False para forzar la activación o desactivación de RBAC de Entra ID.",
"true": "Verdadero",
"false": "Falso",
"regionSelection": "Selección de región",
"regionSelectionDescription": "Cambia la región que usa el cliente de Cosmos para acceder a la cuenta.",
"selectRegion": "Seleccionar región",
"selectRegionTooltip": "Cambia el punto de conexión de cuenta usado para realizar operaciones de cliente.",
"globalDefault": "Global (predeterminado)",
"readWrite": "(Lectura y escritura)",
"read": "(Lectura)",
"queryTimeout": "Tiempo de espera de consulta",
"queryTimeoutDescription": "Cuando una consulta alcanza un límite de tiempo especificado, se mostrará un elemento emergente con una opción para cancelar la consulta, a menos que se haya habilitado la cancelación automática.",
"enableQueryTimeout": "Habilitar tiempo de espera de consulta",
"queryTimeoutMs": "Tiempo de espera de consulta (ms)",
"automaticallyCancelQuery": "Cancelar automáticamente la consulta después del tiempo de espera",
"ruLimit": "Límite de RU",
"ruLimitDescription": "Si una consulta supera un límite de RU configurado, se anulará la consulta.",
"enableRuLimit": "Habilitar límite de RU",
"ruLimitLabel": "Límite de RU (RU)",
"defaultQueryResults": "Vista de resultados de consulta predeterminada",
"defaultQueryResultsDescription": "Seleccione la vista predeterminada que se va a usar al mostrar los resultados de la consulta.",
"retrySettings": "Configuración de reintentos",
"retrySettingsDescription": "Directiva de reintentos asociada a solicitudes limitadas durante las consultas de CosmosDB.",
"maxRetryAttempts": "Número máximo de reintentos",
"maxRetryAttemptsTooltip": "Número máximo de reintentos que se van a realizar para una solicitud. Valor predeterminado 9.",
"fixedRetryInterval": "Intervalo de reintento fijo (ms)",
"fixedRetryIntervalTooltip": "Se ha corregido el intervalo de reintentos en milisegundos para esperar entre cada reintento omitiendo el retryAfter devuelto como parte de la respuesta. El valor predeterminado es 0 milisegundos.",
"maxWaitTime": "Tiempo de espera máximo (s)",
"maxWaitTimeTooltip": "Tiempo de espera máximo en segundos para esperar una solicitud mientras se producen los reintentos. Valor predeterminado de 30 segundos.",
"enableContainerPagination": "Habilitar paginación de contenedor",
"enableContainerPaginationDescription": "Cargue 50 contenedores a la vez. Actualmente, los contenedores no se extraen en orden alfanumérico.",
"enableCrossPartitionQuery": "Habilitar consulta entre particiones",
"enableCrossPartitionQueryDescription": "Enviar más de una solicitud mientras se ejecuta una consulta. Se necesita más de una solicitud si la consulta no tiene como ámbito un valor de clave de partición única.",
"maxDegreeOfParallelism": "Grado máximo de paralelismo",
"maxDegreeOfParallelismDescription": "Obtiene o establece el número de operaciones simultáneas que se ejecutan en el lado cliente durante la ejecución de consultas en paralelo. Un valor de propiedad positivo limita el número de operaciones simultáneas al valor establecido. Si se establece en menos de 0, el sistema decide automáticamente el número de operaciones simultáneas que se van a ejecutar.",
"maxDegreeOfParallelismQuery": "Consultar hasta el grado máximo de paralelismo.",
"priorityLevel": "Nivel de prioridad",
"priorityLevelDescription": "Establece el nivel de prioridad para las solicitudes de plano de Data Explorer al usar la ejecución basada en prioridad. Si se selecciona \"Ninguno\", Data Explorer no especificará nivel de prioridad y se usará el nivel predeterminado del servidor.",
"displayGremlinQueryResults": "Mostrar los resultados de la consulta de Gremlin como:",
"displayGremlinQueryResultsDescription": "Seleccione Graph para visualizar automáticamente los resultados de la consulta como un gráfico o JSON para mostrar los resultados como JSON.",
"graph": "Graph",
"json": "JSON",
"graphAutoVisualization": "Visualización automática de Graph",
"enableSampleDatabase": "Habilitar base de datos de ejemplo",
"enableSampleDatabaseDescription": "Se trata de una base de datos de ejemplo y una colección con datos de productos sintéticos que puede usar para explorar mediante consultas NoSQL. Aparecerá como otra base de datos en la interfaz de Data Explorer y es creada y mantenida por Microsoft sin coste para usted.",
"enableSampleDbAriaLabel": "Habilitación de la base de datos de ejemplo para la exploración de consultas",
"guidRepresentation": "Representación de GUID",
"guidRepresentationDescription": "GuidRepresentation en MongoDB hace referencia a cómo se serializan y deserializan los identificadores únicos globales (GUID) cuando se almacenan en documentos BSON. Esto se aplicará a todas las operaciones de documento.",
"advancedSettings": "Configuración avanzada",
"ignorePartitionKey": "Omitir clave de partición en la actualización del documento",
"ignorePartitionKeyTooltip": "Si se activa, el valor de clave de partición no se usará para buscar el documento durante las operaciones de actualización. Use esta opción solo si se producen errores en las actualizaciones del documento debido a una clave de partición anómala.",
"clearHistory": "Borrar historial",
"clearHistoryConfirm": "¿Seguro que quiere continuar?",
"clearHistoryDescription": "Esta acción borrará todas las personalizaciones de esta cuenta en este explorador, incluidas:",
"clearHistoryTabLayout": "Restablecer el diseño de pestaña personalizado, incluidas las posiciones divisora",
"clearHistoryTableColumns": "Borrar las preferencias de columna de la tabla, incluidas las columnas personalizadas",
"clearHistoryFilters": "Borrar el historial de filtros",
"clearHistoryRegion": "Restablecer selección de región a global",
"increaseValueBy1000": "Aumentar valor en 1 000",
"decreaseValueBy1000": "Disminuir valor en 1 000",
"none": "Ninguno",
"low": "Bajo",
"high": "Alto",
"automatic": "Automático",
"enhancedQueryControl": "Control de consulta mejorado",
"enableQueryControl": "Habilitar control de consulta",
"explorerVersion": "Versión del explorador",
"accountId": "Id. de cuenta",
"sessionId": "Id. de sesión",
"popupsDisabledError": "No se pudo establecer la autorización para esta cuenta debido a que los elementos emergentes se deshabilitaron en el explorador.\nHabilite los elementos emergentes para este sitio y haga clic en el botón \"Iniciar sesión para Entra ID\"",
"failedToAcquireTokenError": "No se pudo adquirir automáticamente el token de autorización. Haga clic en el botón \"Iniciar sesión para Entra ID\" para habilitar las operaciones RBAC de Entra ID"
},
"saveQuery": {
"panelTitle": "Guardar consulta",
"setupCostMessage": "Por motivos de cumplimiento, guardamos las consultas en un contenedor de la cuenta de Azure Cosmos, en una base de datos independiente denominada \"{{databaseName}}\". Para continuar, necesitamos crear un contenedor en su cuenta, el coste adicional estimado es de 0,77 USD al día.",
"completeSetup": "Completar instalación",
"noQueryNameError": "No se especificó ningún nombre de consulta",
"invalidQueryContentError": "Contenido de consulta especificado no válido",
"failedToSaveQueryError": "No se pudo guardar la consulta {{queryName}}",
"failedToSetupContainerError": "No se pudo configurar un contenedor para las consultas guardadas",
"accountNotSetupError": "No se pudo guardar la consulta: la cuenta no está configurada para guardar consultas",
"name": "Nombre"
},
"loadQuery": {
"noFileSpecifiedError": "No se especificó ningún archivo",
"failedToLoadQueryError": "No se pudo cargar la consulta.",
"failedToLoadQueryFromFileError": "No se pudo cargar la consulta desde el archivo {{fileName}}",
"selectFilesToOpen": "Seleccionar un documento de consulta",
"browseFiles": "Examinar"
},
"executeStoredProcedure": {
"enterInputParameters": "Escriba los parámetros de entrada (si los hay)",
"key": "Clave",
"param": "Param",
"partitionKeyValue": "Valor de la clave de partición",
"value": "Valor",
"addNewParam": "Agregar nuevo parámetro",
"addParam": "Agregar parámetro",
"deleteParam": "Eliminar parámetro",
"invalidParamError": "Parámetro especificado no válido: {{invalidParam}}",
"invalidParamConsoleError": "Parámetro especificado no válido: {{invalidParam}} no es un valor literal válido",
"stringType": "Cadena",
"customType": "Personalizado"
},
"uploadItems": {
"noFilesSpecifiedError": "No se especificó ningún archivo. Escriba al menos un archivo.",
"selectJsonFiles": "Seleccionar archivos JSON",
"selectJsonFilesTooltip": "Seleccione uno o varios archivos JSON para cargar. Cada archivo puede contener un único documento JSON o una matriz de documentos JSON. El tamaño combinado de todos los archivos de una operación de carga individual debe ser inferior a 2 MB. Puede realizar varias operaciones de carga para conjuntos de datos más grandes.",
"fileNameColumn": "NOMBRE DE ARCHIVO",
"statusColumn": "ESTADO",
"uploadStatus": "{{numSucceeded}} creado, {{numThrottled}} limitado, {{numFailed}} errores",
"uploadedFiles": "Archivos cargados"
},
"copyNotebook": {
"copyFailedError": "No se pudo copiar {{name}} en {{destination}}",
"uploadFailedError": "Error al cargar {{name}}.",
"location": "Ubicación",
"locationAriaLabel": "Ubicación",
"selectLocation": "Seleccionar una ubicación de bloc de notas para copiar",
"name": "Nombre"
},
"publishNotebook": {
"publishFailedError": "No se pudo publicar {{notebookName}} en la galería",
"publishDescription": "Cuando se publique, este bloc de notas aparecerá en la galería pública de blocs de notas de Azure Cosmos DB. Asegúrese de que ha quitado los datos confidenciales o la salida antes de la publicación.",
"publishPrompt": "¿Desea publicar y compartir \"{{name}}\" en la galería?",
"coverImage": "Imagen de portada",
"coverImageUrl": "Dirección URL de la imagen de portada",
"name": "Nombre",
"description": "Descripción",
"tags": "Etiquetas",
"tagsPlaceholder": "Etiqueta opcional 1, etiqueta opcional 2",
"preview": "Versión preliminar",
"urlType": "URL",
"customImage": "Imagen personalizada",
"takeScreenshot": "Obtener recorte de pantalla",
"useFirstDisplayOutput": "Usar la primera salida de pantalla",
"failedToCaptureOutput": "No se pudo capturar la primera salida",
"outputDoesNotExist": "La salida no existe para ninguna de las celdas.",
"failedToConvertError": "No se pudo convertir {{fileName}} al formato base64",
"failedToUploadError": "No se pudo cargar {{fileName}}"
},
"changePartitionKey": {
"failedToStartError": "No se pudo iniciar el trabajo de transferencia de datos",
"suboptimalPartitionKeyError": "Advertencia: el sistema ha detectado que la colección puede estar usando una clave de partición poco óptima",
"description": "Al cambiar la clave de partición de un contenedor, deberá crear un contenedor de destino con la clave de partición correcta. También puede seleccionar un contenedor de destino existente.",
"sourceContainerId": "Id. de origen {{collectionName}} ",
"destinationContainerId": "Id. de destino {{collectionName}}",
"collectionIdTooltip": "Identificador único de y usado para el {{collectionName}} enrutamiento basado en identificadores a través de REST y todos los SDK.",
"collectionIdPlaceholder": "por ejemplo, {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} id., ejemplo {{collectionName}}1",
"existingContainers": "Contenedores existentes",
"partitionKeyWarning": "El contenedor de destino no debe existir aún. Explorador de datos creará un nuevo contenedor de destino."
},
"cassandraAddCollection": {
"keyspaceLabel": "Nombre del espacio de claves",
"keyspaceTooltip": "Seleccione un espacio de claves existente o escriba un nuevo identificador de espacio de claves.",
"tableIdLabel": "Escriba el comando CQL para crear la tabla.",
"enterTableId": "Escriba el id. de tabla",
"tableSchemaAriaLabel": "Esquema de tabla",
"provisionDedicatedThroughput": "Aprovisionamiento del rendimiento dedicado para esta tabla",
"provisionDedicatedThroughputTooltip": "Opcionalmente, puede aprovisionar el rendimiento dedicado para una tabla dentro de un espacio de claves que tenga aprovisionado el rendimiento. Esta cantidad de rendimiento dedicado no se compartirá con otras tablas del espacio de claves y no cuenta para el rendimiento aprovisionado para el espacio de claves. Esta cantidad de rendimiento se facturará además de la cantidad de rendimiento que aprovisionó en el nivel de espacio de claves."
},
"tables": {
"addProperty": "Agregar propiedad",
"addRow": "Agregar fila",
"addEntity": "Agregar entidad",
"back": "atrás",
"nullFieldsWarning": "Advertencia: los campos nulos no se mostrarán para su edición.",
"propertyEmptyError": "{{property}} no puede estar vacío. Escriba un valor para {{property}}",
"whitespaceError": "{{property}} no puede tener espacios en blanco. Escriba un valor para {{property}} sin espacios en blanco",
"propertyTypeEmptyError": "El tipo de propiedad no puede estar vacío. Seleccione un tipo en la lista desplegable para la propiedad {{property}}"
},
"tableQuerySelect": {
"selectColumns": "Seleccione las columnas que quiere consultar.",
"availableColumns": "Columnas disponibles"
},
"tableColumnSelection": {
"selectColumns": "Seleccione las columnas que se mostrarán en la vista de elementos del contenedor.",
"searchFields": "Buscar campos",
"reset": "Restablecer",
"partitionKeySuffix": " (clave de partición)"
},
"newVertex": {
"addProperty": "Agregar propiedad"
},
"addGlobalSecondaryIndex": {
"globalSecondaryIndexId": "Id. de contenedor de índice secundario global",
"globalSecondaryIndexIdPlaceholder": "por ejemplo, indexbyEmailId",
"projectionQuery": "Consulta de proyección",
"projectionQueryPlaceholder": "SELECT c.email, c.accountId FROM c",
"projectionQueryTooltip": "Obtenga más información sobre cómo definir índices secundarios globales.",
"disabledTitle": "Ya se está creando un índice secundario global. Espere a que se complete antes de crear otra."
},
"stringInput": {
"inputMismatchError": "La entrada {{input}} no coincide con la seleccionada {{selectedId}}"
},
"panelInfo": {
"information": "Información",
"moreDetails": "Más detalles"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Escalar",
"conflictResolution": "Resolución de conflictos",
"settings": "Configuración",
"indexingPolicy": "Directiva de indexación",
"partitionKeys": "Claves de partición",
"partitionKeysPreview": "Claves de partición (versión preliminar)",
"computedProperties": "Propiedades calculadas",
"containerPolicies": "Directivas de contenedor",
"throughputBuckets": "Depósitos de rendimiento",
"globalSecondaryIndexPreview": "Índice secundario global (versión preliminar)",
"maskingPolicyPreview": "Directiva de enmascaramiento (versión preliminar)"
},
"mongoNotifications": {
"selectTypeWarning": "Seleccione un tipo para cada índice.",
"enterFieldNameError": "Introduzca un nombre de campo.",
"wildcardPathError": "La ruta de acceso con caracteres comodín no está presente en el nombre del campo. Usar un patrón como "
},
"partitionKey": {
"shardKey": "Clave de partición",
"partitionKey": "Clave de partición",
"shardKeyTooltip": "La clave de partición (campo) se usa para dividir los datos entre muchos conjuntos de réplicas (particiones) para lograr una escalabilidad ilimitada. Es fundamental elegir un campo que distribuya uniformemente los datos.",
"partitionKeyTooltip": "se usa para distribuir automáticamente los datos entre las particiones con fines de escalabilidad. Elija una propiedad en el documento JSON que tenga una amplia gama de valores y distribuya uniformemente el volumen de solicitudes.",
"sqlPartitionKeyTooltipSuffix": " En el caso de las cargas de trabajo de lectura intensiva o de escritura intensiva de cualquier tamaño, el identificador suele ser una buena opción.",
"partitionKeySubtext": "Para cargas de trabajo pequeñas, el identificador de elemento es una opción adecuada para la clave de partición.",
"mongoPlaceholder": "por ejemplo, categoryId",
"gremlinPlaceholder": "por ejemplo, /address",
"sqlFirstPartitionKey": "Requerido: primera clave de partición, por ejemplo, /TenantId",
"sqlSecondPartitionKey": "segunda clave de partición, p. ej., /UserId",
"sqlThirdPartitionKey": "tercera clave de partición, por ejemplo, /SessionId",
"defaultPlaceholder": "por ejemplo, /address/zipCode"
},
"costEstimate": {
"title": "Estimación de costes*",
"howWeCalculate": "Cómo calculamos esto",
"updatedCostPerMonth": "Coste actualizado al mes",
"currentCostPerMonth": "Coste actual al mes",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "El sistema determinará el número máximo de RU/s de escalabilidad automática inicial, en función de la configuración de rendimiento manual actual y del almacenamiento del recurso. Una vez habilitada la escalabilidad automática, puede cambiar el número máximo de RU/s.",
"ttlWarningText": "El sistema eliminará automáticamente los elementos en función del valor de TTL (en segundos) que proporcione, sin necesidad de una operación de eliminación emitida explícitamente por una aplicación cliente. Para obtener más información, consulte",
"ttlWarningLinkText": "Período de vida (TTL) en Azure Cosmos DB",
"unsavedIndexingPolicy": "directiva de indexación",
"unsavedDataMaskingPolicy": "directiva de enmascaramiento de datos",
"unsavedComputedProperties": "propiedades calculadas",
"unsavedEditorWarningPrefix": "No ha guardado los últimos cambios realizados en su",
"unsavedEditorWarningSuffix": ". Haga clic en Guardar para confirmar los cambios.",
"updateDelayedApplyWarning": "Va a solicitar un aumento del rendimiento más allá de la capacidad preasignada. Esta operación tardará algún tiempo en completarse.",
"scalingUpDelayMessage": "El escalado vertical tardará entre 4 y 6 horas, ya que supera lo que Azure Cosmos DB puede admitir al instante en función del número de particiones físicas. Puede aumentar el rendimiento al {{instantMaximumThroughput}} instante o continuar con este valor y esperar hasta que se complete el escalado vertical.",
"exceedPreAllocatedMessage": "La solicitud para aumentar el rendimiento supera la capacidad preasignada, que puede tardar más de lo esperado. Hay tres opciones entre las que puede elegir para continuar:",
"instantScaleOption": "Puede escalar verticalmente al instante hasta {{instantMaximumThroughput}} RU/s.",
"asyncScaleOption": "Puede escalar verticalmente de forma asincrónica hasta cualquier valor en {{maximumThroughput}} RU/s en 4-6 horas.",
"quotaMaxOption": "El máximo de cuota actual es {{maximumThroughput}} de RU/s. Para superar este límite, debe solicitar un aumento de cuota y el equipo de Azure Cosmos DB lo revisará.",
"belowMinimumMessage": "No puede reducir el rendimiento por debajo del mínimo actual de {{minimum}} RU/s. Para obtener más información sobre este límite, consulte la documentación de nuestra oferta de servicio.",
"saveThroughputWarning": "La factura se verá afectada a medida que actualice la configuración de rendimiento. Revise la estimación de costes actualizada a continuación antes de guardar los cambios",
"currentAutoscaleThroughput": "Rendimiento de escalabilidad automática actual:",
"targetAutoscaleThroughput": "Rendimiento de escalabilidad automática de destino:",
"currentManualThroughput": "Rendimiento manual actual:",
"targetManualThroughput": "Rendimiento manual de destino:",
"applyDelayedMessage": "La solicitud para aumentar el rendimiento se ha enviado correctamente. Esta operación tardará entre 1 y 3 días laborables en completarse. Vea el estado más reciente en Notificaciones.",
"databaseLabel": "Base de datos:",
"containerLabel": "Contenedor:",
"applyShortDelayMessage": "Actualmente hay una solicitud para aumentar el rendimiento. Esta operación tardará algún tiempo en completarse.",
"applyLongDelayMessage": "Actualmente hay una solicitud para aumentar el rendimiento. Esta operación tardará entre 1 y 3 días laborables en completarse. Vea el estado más reciente en Notificaciones.",
"throughputCapError": "Su cuenta está configurada actualmente con un límite de rendimiento total de {{throughputCap}} RU/s. Esta actualización no es posible porque aumentaría el rendimiento total para {{newTotalThroughput}} RU/s. Cambiar el límite de rendimiento total en la administración de costes.",
"throughputIncrementError": "El valor de rendimiento debe estar en incrementos de 1 000"
},
"conflictResolution": {
"lwwDefault": "Wins de última escritura (valor predeterminado)",
"customMergeProcedure": "Procedimiento de combinación (personalizado)",
"mode": "Modo",
"conflictResolverProperty": "Propiedad Solucionador de conflictos",
"storedProcedure": "Procedimiento almacenado",
"lwwTooltip": "Obtiene o establece el nombre de una propiedad de entero en los documentos que se usa para el esquema de resolución de conflictos basado en Last Write Wins (LWW). De forma predeterminada, el sistema usa la propiedad de marca de tiempo definida por el sistema, _ts para decidir el ganador de las versiones en conflicto del documento. Especifique su propia propiedad de entero si desea invalidar la resolución de conflictos basada en marca de tiempo predeterminada.",
"customTooltip": "Obtiene o establece el nombre de un procedimiento almacenado (también conocido como procedimiento de combinación) para resolver los conflictos. Puede escribir lógica definida por la aplicación para determinar el ganador de las versiones en conflicto de un documento. El procedimiento almacenado se ejecutará transaccionalmente, exactamente una vez, en el lado servidor. Si no proporciona un procedimiento almacenado, los conflictos se rellenarán en el",
"customTooltipConflictsFeed": " fuente de conflictos",
"customTooltipSuffix": ". Puede actualizar o volver a registrar el procedimiento almacenado en cualquier momento."
},
"changeFeed": {
"label": "Directiva de retención de registros de fuente de cambios",
"tooltip": "Habilite la directiva de retención de registros de fuente de cambios para conservar los últimos 10 minutos del historial de los elementos del contenedor de forma predeterminada. Para admitir esto, el cargo de unidad de solicitud (RU) para este contenedor se multiplicará por un factor de dos para las escrituras. Las lecturas no se ven afectadas."
},
"mongoIndexing": {
"disclaimer": "Para las consultas que filtran por varias propiedades, cree varios índices de campo único en lugar de un índice compuesto.",
"disclaimerCompoundIndexesLink": " Índices compuestos ",
"disclaimerSuffix": "solo se usan para ordenar los resultados de la consulta. Si necesita agregar un índice compuesto, puede crear uno mediante el shell de Mongo.",
"compoundNotSupported": "Las colecciones con índices compuestos aún no se admiten en el editor de indexación. Para modificar la directiva de indexación de esta colección, use el shell de Mongo.",
"aadError": "Para usar el editor de directivas de indexación, inicie sesión en el",
"aadErrorLink": "Azure Portal.",
"refreshingProgress": "Actualizando el progreso de transformación del índice",
"canMakeMoreChangesZero": "Puede realizar más cambios de indexación una vez completada la transformación del índice actual. ",
"refreshToCheck": "Actualice para comprobar si se ha completado.",
"canMakeMoreChangesProgress": "Puede realizar más cambios de indexación una vez completada la transformación del índice actual. Está completado al {{progress}}%. ",
"refreshToCheckProgress": "Actualice para comprobar el progreso.",
"definitionColumn": "Definición",
"typeColumn": "Tipo",
"dropIndexColumn": "Quitar índice",
"addIndexBackColumn": "Volver a agregar índice",
"deleteIndexButton": "Botón Eliminar índice",
"addBackIndexButton": "Botón Agregar nuevo índice",
"currentIndexes": "Índices actuales",
"indexesToBeDropped": "Índices que se van a quitar",
"indexFieldName": "Nombre del campo de índice",
"indexType": "Tipo de índice",
"selectIndexType": "Seleccionar un tipo de índice",
"undoButton": "Botón Deshacer"
},
"subSettings": {
"timeToLive": "Período de vida",
"ttlOff": "Desactivado",
"ttlOnNoDefault": "Activado (valor no predeterminado)",
"ttlOn": "Activado",
"seconds": "segundo(s)",
"timeToLiveInSeconds": "Período de vida en segundos",
"analyticalStorageTtl": "Período de vida del almacenamiento analítico",
"geospatialConfiguration": "Configuración geoespacial",
"geography": "Geografía",
"geometry": "Geometría",
"uniqueKeys": "Claves únicas",
"mongoTtlMessage": "Para habilitar el período de vida (TTL) para la colección o los documentos,",
"mongoTtlLinkText": "crear un índice TTL",
"partitionKeyTooltipTemplate": "Se {{partitionKeyName}} usa para distribuir datos entre varias particiones con fines de escalabilidad. El valor \"{{partitionKeyValue}}\" determina cómo se particionan los documentos.",
"largePartitionKeyEnabled": "Se ha habilitado el tamaño grande {{partitionKeyName}}.",
"hierarchicalPartitioned": "Contenedor con particiones jerárquicas.",
"nonHierarchicalPartitioned": "Contenedor con particiones no jerárquicas."
},
"scale": {
"freeTierInfo": "Con el nivel Gratis, obtendrá las primeras {{ru}} RU/s y {{storage}} GB de almacenamiento de esta cuenta de forma gratuita. Para mantener su cuenta libre, mantenga el total de RU/s en todos los recursos de la cuenta {{ru}} en RU/s.",
"freeTierLearnMore": "Más información.",
"throughputRuS": "Rendimiento (RU/s)",
"autoScaleCustomSettings": "La cuenta tiene una configuración personalizada que impide establecer el rendimiento en el nivel de contenedor. Trabaje con su Cosmos DB punto de contacto del equipo de ingeniería para realizar cambios.",
"keyspaceSharedThroughput": "Este rendimiento compartido de tabla se configura en el espacio de claves",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Cambiar {{partitionKeyName}}",
"currentPartitionKey": "Actual {{partitionKeyName}}",
"partitioning": "Creación de particiones",
"hierarchical": "Jerárquico",
"nonHierarchical": "No jerárquico",
"safeguardWarning": "Para proteger la integridad de los datos que se copian en el nuevo contenedor, asegúrese de que no se realiza ninguna actualización en el contenedor de origen durante todo el proceso de cambio de clave de partición.",
"changeDescription": "Para cambiar la clave de partición, se debe crear un nuevo contenedor de destino o seleccionar un contenedor de destino existente. Después, los datos se copiarán en el contenedor de destino.",
"changeButton": "Cambiar",
"changeJob": "{{partitionKeyName}} trabajo de cambio",
"cancelButton": "Cancelar",
"documentsProcessed": "({{processedCount}} de {{totalCount}} documentos procesados)"
},
"computedProperties": {
"ariaLabel": "Propiedades calculadas",
"learnMorePrefix": "sobre cómo definir propiedades calculadas y cómo usarlas."
},
"indexingPolicy": {
"ariaLabel": "Directiva de indexación"
},
"dataMasking": {
"ariaLabel": "Directiva de enmascaramiento de datos",
"validationFailed": "Error en la validación:",
"includedPathsRequired": "se requiere includedPaths",
"includedPathsMustBeArray": "includedPaths debe ser una matriz",
"excludedPathsMustBeArray": "excludedPaths debe ser una matriz si se proporciona"
},
"containerPolicy": {
"vectorPolicy": "Directiva de vectores",
"fullTextPolicy": "Directiva de texto completo",
"createFullTextPolicy": "Crear nueva directiva de búsqueda de texto completo"
},
"globalSecondaryIndex": {
"indexesDefined": "Este contenedor tiene definidos los siguientes índices.",
"learnMoreSuffix": "sobre cómo definir índices secundarios globales y cómo usarlos.",
"jsonAriaLabel": "JSON de índice secundario global",
"addIndex": "Agregar índice",
"settingsTitle": "Configuración del índice secundario global",
"sourceContainer": "Contenedor de origen",
"indexDefinition": "Definición de índice secundario global"
},
"indexingPolicyRefresh": {
"refreshFailed": "Error al actualizar el progreso de transformación del índice"
},
"throughputInput": {
"autoscale": "Escalabilidad automática",
"manual": "Manual",
"minimumRuS": "Mínimo de RU/s",
"maximumRuS": "Máximo de RU/s",
"x10Equals": "x 10 =",
"storageCapacity": "Capacidad de almacenamiento",
"fixed": "Corregido",
"unlimited": "Sin límites",
"instant": "Instantánea",
"fourToSixHrs": "4-6 horas",
"autoscaleDescription": "En función del uso, el {{resourceType}} rendimiento se escalará desde",
"freeTierWarning": "La facturación se aplicará si aprovisiona más {{ru}} de RU/s de rendimiento manual o si el recurso se escala más allá {{ru}} de RU/s con escalabilidad automática.",
"capacityCalculator": "Calcule las RU/s necesarias con",
"capacityCalculatorLink": " calculadora de capacidad",
"fixedStorageNote": "Al usar una colección con capacidad de almacenamiento fija, puede configurar hasta 10 000 RU/s.",
"min": "min",
"max": "máx"
},
"throughputBuckets": {
"label": "Depósitos de rendimiento",
"bucketLabel": "Depósito {{id}}",
"dataExplorerQueryBucket": " (Depósito de consultas de Data Explorer)",
"active": "Activo",
"inactive": "Inactivo"
}
}
}
}

View File

@@ -29,6 +29,9 @@
"upload": "Charger",
"connect": "Connexion",
"remove": "Supprimer",
"load": "Charger",
"publish": "Publier",
"browse": "Parcourir",
"increaseValueBy1": "Augmenter la valeur de 1",
"decreaseValueBy1": "Diminuer la valeur de 1"
},
@@ -291,5 +294,675 @@
"errorCreateContainer": "Nous navons pas pu créer le conteneur : {{error}}",
"errorImportData": "Nous navons pas pu importer les données : {{error}}"
}
},
"contextMenu": {
"newContainer": "Nouveau {{containerName}}",
"restoreContainer": "Restaurer {{containerName}}",
"deleteDatabase": "Supprimer {{databaseName}}",
"deleteContainer": "Supprimer {{containerName}}",
"newSqlQuery": "Nouvelle requête SQL",
"newQuery": "Nouvelle requête",
"openMongoShell": "Ouvrir linterpréteur de commandes Mongo",
"newShell": "Nouvel interpréteur de commandes",
"openCassandraShell": "Ouvrir linterpréteur de commandes Cassandra",
"newStoredProcedure": "Nouvelle procédure stockée",
"newUdf": "Nouvelle UDF",
"newTrigger": "Nouveau déclencheur",
"deleteStoredProcedure": "Supprimer la procédure stockée",
"deleteTrigger": "Supprimer le déclencheur",
"deleteUdf": "Supprimer une fonction définie par lutilisateur"
},
"tabs": {
"documents": {
"newItem": "Nouvel élément",
"newDocument": "Nouveau document",
"uploadItem": "Charger lélément",
"applyFilter": "Appliquer le filtre",
"unsavedChanges": "Modifications non enregistrées",
"unsavedChangesMessage": "Vos modifications non enregistrées seront perdues. Voulez-vous continuer ?",
"createDocumentFailed": "Nous navons pas pu créer le document",
"updateDocumentFailed": "Nous navons pas pu mettre à jour le document",
"documentDeleted": "Nous avons bien supprimé le document.",
"deleteDocumentDialogTitle": "Supprimer le document",
"deleteDocumentsDialogTitle": "Supprimer des documents",
"throttlingError": "Nous navons pas pu supprimer certains documents en raison dune erreur de limitation de débit. Réessayez plus tard. Pour éviter ce cas de figure à lavenir, envisagez daugmenter le débit de votre conteneur ou de votre base de données.",
"deleteFailed": "Nous navons pas pu supprimer le ou les documents ({{error}})",
"missingShardProperty": "Le document ne contient pas la propriété de partition : {{partitionKeyProperty}}",
"refreshGridFailed": "Nous navons pas pu actualiser la grille des documents",
"confirmDelete": "Voulez-vous vraiment supprimer {{documentName}} ?",
"confirmDeleteTitle": "Confirmer la suppression",
"selectedItems": "les {{count}} éléments sélectionnés",
"selectedItem": "lélément sélectionné",
"selectedDocuments": "les {{count}} documents sélectionnés",
"selectedDocument": "le document sélectionné",
"deleteDocumentFailedLog": "Nous navons pas pu supprimer le document {{documentId}} avec le code détat {{statusCode}}",
"deleteSuccessLog": "Nous avons bien supprimé {{count}} document(s)",
"deleteThrottledLog": "Nous navons pas pu supprimer {{count}} document(s) en raison de lerreur « Requête trop volumineuse » (429). Nouvelle tentative...",
"missingShardKeyLog": "Nous navons pas pu enregistrer le nouveau document : clé de partition du document non définie",
"filterTooltip": "Tapez un prédicat de requête ou choisissez-en un dans la liste.",
"loadMore": "Charger plus",
"documentEditor": "Éditeur de document",
"savedFilters": "Filtres enregistrés",
"defaultFilters": "Filtres par défaut",
"abort": "Abandonner",
"deletingDocuments": "Suppression en cours de {{count}} document(s)",
"deletedDocumentsSuccess": "Nous avons bien supprimé {{count}} document(s).",
"deleteAborted": "La suppression du ou des documents a été abandonnée.",
"failedToDeleteDocuments": "Nous navons pas pu supprimer {{count}} document(s).",
"requestTooLargeBase": "Certaines requêtes de suppression ont échoué en raison dune exception « Demande trop volumineuse » (429)",
"retriedSuccessfully": "mais ont bien été réessayés.",
"retryingNow": "Nouvelle tentative en cours.",
"increaseThroughputTip": "Pour éviter ce cas de figure à lavenir, envisagez daugmenter le débit de votre conteneur ou de votre base de données.",
"numberOfSelectedDocuments": "Nombre de documents sélectionnés : {{count}}",
"mongoFilterPlaceholder": "Tapez un prédicat de requête (p. ex. {\"id\":\"foo\"}), choisissez-en un dans la liste déroulante, ou laissez le champ vide pour interroger tous les documents.",
"sqlFilterPlaceholder": "Tapez un prédicat de requête (p. ex. WHERE c.id=\"1\"), choisissez-en un dans la liste déroulante, ou laissez le champ vide pour interroger tous les documents.",
"error": "Erreur",
"warning": "Avertissement"
},
"query": {
"executeQuery": "Exécuter la requête",
"executeSelection": "Exécuter la sélection",
"saveQuery": "Enregistrer la requête",
"downloadQuery": "Télécharger la requête",
"cancelQuery": "Annuler la requête",
"openSavedQueries": "Ouvrir les requêtes enregistrées",
"vertical": "Verticale",
"horizontal": "Horizontale",
"view": "Afficher",
"editingQuery": "Modification en cours de la requête"
},
"storedProcedure": {
"id": "ID de procédure stockée",
"idPlaceholder": "Entrer le nouvel ID de procédure stockée",
"idAriaLabel": "ID de procédure stockée",
"body": "Corps de procédure stockée",
"bodyAriaLabel": "Corps de procédure stockée",
"successfulExecution": "Nous avons réussi lexécution de la procédure stockée",
"resultAriaLabel": "Exécuter le résultat de la procédure stockée",
"logsAriaLabel": "Exécuter les journaux dactivité de la procédure stockée",
"errors": "Erreurs :",
"errorDetailsAriaLabel": "Lien vers les détails derreur",
"moreDetails": "Plus de détails",
"consoleLogTab": "console.log"
},
"trigger": {
"id": "ID de déclencheur",
"idPlaceholder": "Entrer le nouvel ID de déclencheur",
"type": "Type de déclencheur",
"operation": "Déclencher lopération",
"body": "Corps de déclencheur",
"bodyAriaLabel": "Corps de déclencheur",
"pre": "Avant",
"post": "Publier",
"all": "Tous",
"operationCreate": "Créer",
"operationDelete": "Supprimer",
"operationReplace": "Remplacer"
},
"udf": {
"id": "ID de fonction définie par lutilisateur",
"idPlaceholder": "Entrer le nouvel ID de fonction définie par lutilisateur",
"body": "Corps de fonction défini par lutilisateur",
"bodyAriaLabel": "Corps de fonction définie par lutilisateur"
},
"conflicts": {
"unsavedChanges": "Modifications non enregistrées",
"changesWillBeLost": "Les modifications seront perdues. Voulez-vous continuer ?",
"resolveConflictFailed": "Échec de la résolution de conflit",
"deleteConflictFailed": "Nous navons pas pu résoudre le conflit",
"refreshGridFailed": "Nous navons pas pu actualiser la grille des documents"
},
"mongoShell": {
"title": "Interpréteur de commandes Mongo"
}
},
"panes": {
"deleteDatabase": {
"panelTitle": "Supprimer {{databaseName}}",
"warningMessage": "Attention ! Il ne sera pas possible dannuler cette action. Si vous continuez, cette ressource et toutes ses ressources enfants seront définitivement supprimées.",
"confirmPrompt": "Confirmer en tapant lID de {{databaseName}} (nom)",
"inputMismatch": "Le nom « {{input}} » de lentrée {{databaseName}} ne correspond pas au {{databaseName}} « {{selectedId}} » sélectionné",
"feedbackTitle": "Aidez-nous à améliorer Azure Cosmos DB !",
"feedbackReason": "Pourquoi supprimez-vous {{databaseName}} ?"
},
"deleteCollection": {
"panelTitle": "Supprimer {{collectionName}}",
"confirmPrompt": "Confirmer en tapant lID de {{collectionName}}",
"inputMismatch": "LID dentrée {{input}} ne correspond pas à lID {{selectedId}} sélectionné",
"feedbackTitle": "Aidez-nous à améliorer Azure Cosmos DB !",
"feedbackReason": "Pourquoi supprimez-vous {{collectionName}} ?"
},
"addDatabase": {
"databaseLabel": "Base de données {{suffix}}",
"databaseIdLabel": "ID de base de données",
"keyspaceIdLabel": "ID despace clé",
"databaseIdPlaceholder": "Entrer un nouvel ID de {{databaseLabel}}",
"databaseTooltip": "Une {{databaseLabel}} est un conteneur logique dun ou plusieurs {{collectionsLabel}}",
"shareThroughput": "Partager le débit sur {{collectionsLabel}}",
"shareThroughputTooltip": "Le débit approvisionné au niveau {{databaseLabel}} est partagé entre tous les {{collectionsLabel}} du {{databaseLabel}}.",
"greaterThanError": "Entrer une valeur supérieure à {{minValue}} pour le débit Autopilot",
"acknowledgeSpendError": "Prenez en compte lestimation des dépenses {{period}}.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "Créer",
"useExisting": "Utiliser lélément existant",
"databaseTooltip": "Une base de données est comparable à un espace de noms. Il sagit de lunité de gestion dun ensemble de {{collectionName}}.",
"shareThroughput": "Partager le débit sur {{collectionName}}",
"shareThroughputTooltip": "Le débit configuré au niveau de la base de données sera partagé entre tous les {{collectionName}} de la base de données.",
"collectionIdLabel": "ID de {{collectionName}}",
"collectionIdTooltip": "Lidentificateur unique du {{collectionName}}, également utilisé pour le routage basé sur lID dans REST et tous les SDK.",
"collectionIdPlaceholder": "p. ex. {{collectionName}}1",
"collectionIdAriaLabel": "ID {{collectionName}}, Exemple {{collectionName}}1",
"existingDatabaseAriaLabel": "Choisir un id existant de {{databaseName}}",
"existingDatabasePlaceholder": "Choisir un id existant de {{databaseName}}",
"indexing": "Indexation",
"turnOnIndexing": "Activer lindexation",
"automatic": "Automatique",
"turnOffIndexing": "Désactiver lindexation",
"off": "Désactivé",
"sharding": "Partitionnement",
"shardingTooltip": "Les collections partitionnées fractionnent vos données entre de nombreux jeux de réplicas (partitions) pour atteindre une scalabilité illimitée. Les collections partitionnées vous obligent à choisir une clé de partition (champ) pour distribuer uniformément vos données.",
"unsharded": "Non partitionné",
"unshardedLabel": "Non partitionné (limite de 20 Go)",
"sharded": "Partitionné",
"addPartitionKey": "Ajouter une clé de partition hiérarchique",
"hierarchicalPartitionKeyInfo": "Cette fonctionnalité vous permet de partitionner vos données avec jusquà trois niveaux de clés pour une meilleure distribution des données. Nécessite .NET V3, le SDK Java V4 ou la préversion du SDK JavaScript V3.",
"provisionDedicatedThroughput": "Approvisionner le débit dédié pour {{collectionName}}",
"provisionDedicatedThroughputTooltip": "Vous pouvez éventuellement approvisionner un débit dédié pour un {{collectionName}} dans un espace de clés dont le débit est approvisionné. Ce débit dédié ne sera pas partagé avec les autres {{collectionNamePlural}} de la base de données et ne sera pas pris en compte dans le débit que vous approvisionnez pour la base de données. Cette quantité de débit sera facturée en plus du débit que vous approvisionnez au niveau de la base de données.",
"uniqueKeysPlaceholderMongo": "Chemins séparés par des virgules, p. ex. firstName,address.zipCode",
"uniqueKeysPlaceholderSql": "Chemins séparés par des virgules, p. ex. /firstName,/address/zipCode",
"addUniqueKey": "Ajouter une clé unique",
"enableAnalyticalStore": "Activer le magasin analytique",
"disableAnalyticalStore": "Désactiver le magasin analytique",
"on": "Activé",
"analyticalStoreSynapseLinkRequired": "Azure Synapse Link est obligatoire pour créer un magasin analytique de {{collectionName}}. Activez Synapse Link pour ce compte Cosmos DB.",
"enable": "Activer",
"containerVectorPolicy": "Stratégie de vecteur de conteneur",
"containerFullTextSearchPolicy": "Stratégie de recherche en texte intégral du conteneur",
"advanced": "Avancé",
"mongoIndexingTooltip": "Le champ _id est indexé par défaut. La création dun index générique pour tous les champs optimise les requêtes. Elle est recommandée pour le développement.",
"createWildcardIndex": "Créer un index générique sur tous les champs",
"legacySdkCheckbox": "Mon application utilise une version antérieure de Cosmos .NET ou du SDK Java (.NET V1 ou Java V2)",
"legacySdkInfo": "Pour garantir la compatibilité avec les anciens Kits de développement logiciels (SDK), le conteneur créé utilise un schéma de partitionnement hérité qui prend en charge des valeurs de clés de partition dune taille maximale de 101 octets. Si cette option est activée, vous ne pouvez pas utiliser de clés de partition hiérarchiques.",
"indexingOnInfo": "Toutes les propriétés de vos documents seront indexées par défaut pour permettre des requêtes flexibles et efficaces.",
"indexingOffInfo": "Lindexation sera désactivée. Nous recommandons cette option si vous navez pas besoin dexécuter des requêtes ou si vous neffectuez que des opérations clé-valeur.",
"indexingOffWarning": "En créant ce conteneur avec lindexation désactivée, vous ne pouvez pas modifier la stratégie dindexation. Les modifications dindexation ne sont autorisées que sur un conteneur disposant dune stratégie dindexation.",
"acknowledgeSpendErrorMonthly": "Prenez en compte lestimation des dépenses mensuelles.",
"acknowledgeSpendErrorDaily": "Prenez en compte lestimation des dépenses quotidiennes.",
"unshardedMaxRuError": "Les collections non partitionnées prennent en charge un maximum de 10 000 RU",
"acknowledgeShareThroughputError": "Noubliez pas de prendre en compte le coût estimé de ce débit dédié.",
"vectorPolicyError": "Corriger les erreurs dans la stratégie de vecteur du conteneur",
"fullTextSearchPolicyError": "Corrigez les erreurs dans la stratégie de recherche en texte intégral du conteneur",
"addingSampleDataSet": "Ajout en cours dun exemple de jeu de données",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "Utilisez les clés de partition (champ) pour fractionner vos données entre de nombreux jeux de réplicas (partitions) pour atteindre une scalabilité illimitée. Il est essentiel de choisir un champ qui répartit uniformément vos données.",
"partitionKeyTooltip": "La {{partitionKeyName}} est utilisée pour distribuer automatiquement les données entre les partitions à des fins de scalabilité. Choisissez une propriété dans votre document JSON qui propose un grand éventail de valeurs et distribue uniformément le volume des requêtes.",
"partitionKeyTooltipSqlSuffix": " Pour les charges de travail de petite taille à lecture intensive ou les charges de travail à écriture intensive de toute taille, lID est souvent un choix judicieux.",
"shardKeyLabel": "Clé de partition",
"partitionKeyLabel": "Clé de partition",
"shardKeyPlaceholder": "p. ex. categoryId",
"partitionKeyPlaceholderDefault": "p. ex. /address",
"partitionKeyPlaceholderFirst": "Obligatoire : première clé de partition, p. ex. /TenantId",
"partitionKeyPlaceholderSecond": "deuxième clé de partition, par exemple, /UserId",
"partitionKeyPlaceholderThird": "troisième clé de partition, p. ex. /SessionId",
"partitionKeyPlaceholderGraph": "p. ex. /address/zipCode",
"uniqueKeysTooltip": "Les clés uniques permettent aux développeurs dajouter une couche dintégrité des données à leur base de données. En créant une stratégie de clé unique lors de la création dun conteneur, vous garantissez lunicité dune ou plusieurs valeurs par clé de partition.",
"uniqueKeysLabel": "Clés uniques",
"analyticalStoreLabel": "Magasin analytique",
"analyticalStoreTooltip": "Activez la fonctionnalité de magasin analytique pour effectuer des analyses en quasi-temps réel sur vos données opérationnelles, sans impacter les performances des charges de travail transactionnelles.",
"analyticalStoreDescription": "Activez la fonctionnalité de magasin analytique pour effectuer des analyses en quasi-temps réel sur vos données opérationnelles, sans impacter les performances des charges de travail transactionnelles.",
"vectorPolicyTooltip": "Décrivez nimporte quelle propriété de vos données qui contient des vecteurs afin quelles puissent être utilisées pour des requêtes de similarité."
},
"settings": {
"pageOptions": "Options de page",
"pageOptionsDescription": "Choisissez Personnalisé pour spécifier un nombre fixe de résultats de requête à afficher, ou Illimité pour afficher autant de résultats que possible par page.",
"queryResultsPerPage": "Résultats de requête par page",
"queryResultsPerPageTooltip": "Entrez le nombre de résultats de requête à afficher par page.",
"customQueryItemsPerPage": "Le nombre déléments de requête personnalisés par page",
"custom": "Personnalisé",
"unlimited": "Illimité",
"entraIdRbac": "Activer le RBAC dEntra ID",
"entraIdRbacDescription": "Choisissez Automatique pour activer automatiquement le RBAC dEntra ID. True/False pour forcer lactivation ou la désactivation du RBAC dEntra ID.",
"true": "True",
"false": "Faux",
"regionSelection": "Sélection de zone",
"regionSelectionDescription": "Modifie la région utilisée par le client Cosmos pour accéder au compte.",
"selectRegion": "Sélectionner une région",
"selectRegionTooltip": "Modifie le point de terminaison du compte utilisé pour effectuer des opérations client.",
"globalDefault": "Global (par défaut)",
"readWrite": "(En lecture et en écriture)",
"read": "(Lecture)",
"queryTimeout": "Expiration de la requête",
"queryTimeoutDescription": "Lorsquune requête atteint une limite de temps spécifiée, une fenêtre contextuelle proposant dannuler la requête saffiche, sauf si lannulation automatique est activée.",
"enableQueryTimeout": "Activer le délai dexpiration de requête",
"queryTimeoutMs": "Délai dexpiration de la requête (ms)",
"automaticallyCancelQuery": "Annuler automatiquement la requête après expiration du délai dattente",
"ruLimit": "Limite de RU",
"ruLimitDescription": "Si une requête dépasse une limite de RU configurée, elle sera annulée.",
"enableRuLimit": "Activer la limite de RU",
"ruLimitLabel": "Limite de RU (RU)",
"defaultQueryResults": "Affichage par défaut des résultats de la requête",
"defaultQueryResultsDescription": "Sélectionnez laffichage par défaut à utiliser pour montrer les résultats de la requête.",
"retrySettings": "Paramètres de nouvelle tentative",
"retrySettingsDescription": "La stratégie de nouvelles tentatives associée aux requêtes limitées lors des requêtes CosmosDB.",
"maxRetryAttempts": "Maximum de nouvelles tentatives",
"maxRetryAttemptsTooltip": "Nombre maximal de tentatives à effectuer pour une requête. Valeur par défaut 9.",
"fixedRetryInterval": "Intervalle fixe avant nouvelle tentative (ms)",
"fixedRetryIntervalTooltip": "Intervalle fixe avant nouvelle tentative, en millisecondes, en ignorant la valeur retryAfter retournée dans la réponse. La valeur par défaut est de 0 milliseconde.",
"maxWaitTime": "Temps dattente maximal (s)",
"maxWaitTimeTooltip": "Le temps dattente maximal en secondes pour une requête pendant les nouvelles tentatives. La valeur par défaut est de 30 secondes.",
"enableContainerPagination": "Activer la pagination du conteneur",
"enableContainerPaginationDescription": "Chargez 50 conteneurs à la fois. Actuellement, les conteneurs ne sont pas tirés (pulled) dans lordre alphanumérique.",
"enableCrossPartitionQuery": "Activer les requêtes entre les partitions",
"enableCrossPartitionQueryDescription": "Envoyez plusieurs requêtes lors de lexécution dune requête. Plusieurs requêtes sont nécessaires si la requête ne cible pas une seule valeur de clé de partition.",
"maxDegreeOfParallelism": "Degré maximal de parallélisme",
"maxDegreeOfParallelismDescription": "Récupère ou définit le nombre dopérations simultanées exécutées côté client lors de lexécution parallèle dune requête. Une valeur positive limite le nombre dopérations simultanées à cette valeur. Si elle est inférieure à 0, le système détermine automatiquement le nombre dopérations simultanées à exécuter.",
"maxDegreeOfParallelismQuery": "Interrogez jusquau degré maximal de parallélisme.",
"priorityLevel": "Niveau de priorité",
"priorityLevelDescription": "Définit le niveau de priorité des requêtes du plan de données provenant de lExplorateur de données lors de lutilisation de lexécution basée sur la priorité. Si « Aucun » est sélectionné, lExplorateur de données ne spécifie pas de niveau de priorité et le niveau de priorité par défaut côté serveur est utilisé.",
"displayGremlinQueryResults": "Afficher les résultats de la requête Gremlin sous forme de :",
"displayGremlinQueryResultsDescription": "Sélectionnez Graphique pour visualiser automatiquement les résultats de la requête sous forme de graphique ou JSON pour afficher les résultats au format JSON.",
"graph": "Graphique",
"json": "JSON",
"graphAutoVisualization": "Visualisation automatique du graphique",
"enableSampleDatabase": "Activer lexemple de données",
"enableSampleDatabaseDescription": "Il sagit dun exemple de base de données et de collection avec des données de produit synthétiques que vous pouvez utiliser pour découvrir les requêtes NoSQL. Elle apparaîtra comme toute autre base de données dans lIU dExplorateur de données. Elle est gratuitement créée et maintenue par Microsoft.",
"enableSampleDbAriaLabel": "Activer lexemple de base de données pour explorer les requêtes",
"guidRepresentation": "Représentation de GUID",
"guidRepresentationDescription": "GuidRepresentation dans MongoDB désigne la manière dont les identifiants uniques globaux (GUID) sont sérialisés et désérialisés lorsquils sont stockés dans des documents BSON. Cela sapplique à toutes les opérations de documents.",
"advancedSettings": "Paramètres avancés",
"ignorePartitionKey": "Ignorer la clé de partition lors de la mise à jour du document",
"ignorePartitionKeyTooltip": "Si cette option est cochée, la valeur de la clé de partition nest pas utilisée pour localiser le document lors des opérations de mise à jour. Utilisez cette option uniquement si les mises à jour de document échouent à cause dune clé de partition anormale.",
"clearHistory": "Effacer lhistorique",
"clearHistoryConfirm": "Voulez-vous vraiment continuer ?",
"clearHistoryDescription": "Cette action efface toutes les personnalisations pour ce compte dans ce navigateur, notamment :",
"clearHistoryTabLayout": "Réinitialiser votre disposition donglets personnalisée, y compris les positions de séparateurs",
"clearHistoryTableColumns": "Effacez les préférences de colonnes de votre tableau, y compris les colonnes personnalisées",
"clearHistoryFilters": "Effacer votre historique de filtres",
"clearHistoryRegion": "Réinitialiser la sélection de région à globale",
"increaseValueBy1000": "Augmenter la valeur de 1 000",
"decreaseValueBy1000": "Diminuer la valeur de 1 000",
"none": "Aucun",
"low": "Faible",
"high": "Élevé",
"automatic": "Automatique",
"enhancedQueryControl": "Contrôle de requête amélioré",
"enableQueryControl": "Activer le contrôle de requête",
"explorerVersion": "Version dExplorer",
"accountId": "ID de compte",
"sessionId": "ID de session",
"popupsDisabledError": "Nous navons pas pu établir lautorisation pour ce compte, car les fenêtres contextuelles sont désactivées dans le navigateur.\nActiver les fenêtres contextuelles pour ce site et cliquer sur le bouton « Connexion avec Entra ID »",
"failedToAcquireTokenError": "Nous navons pas pu obtenir automatiquement le jeton dautorisation. Cliquer sur le bouton « Connexion à Entra ID » pour activer les opérations de RBAC dEntra ID"
},
"saveQuery": {
"panelTitle": "Enregistrer la requête",
"setupCostMessage": "Pour des raisons de conformité, nous enregistrons les requêtes dans un conteneur de votre compte Azure Cosmos, au sein dune base de données distincte appelée « {{databaseName}} ». Pour continuer, nous devons créer un conteneur dans votre compte. Le coût supplémentaire estimé est de 0,77 $ par jour.",
"completeSetup": "Terminer la configuration",
"noQueryNameError": "Aucun nom de requête nest spécifié",
"invalidQueryContentError": "Le contenu de requête spécifié nest pas valide",
"failedToSaveQueryError": "Nous navons pas pu enregistrer la requête {{queryName}}",
"failedToSetupContainerError": "Nous navons pas pu configurer un conteneur pour les requêtes enregistrées",
"accountNotSetupError": "Nous navons pas pu enregistrer la requête : le compte nest pas configuré pour enregistrer les requêtes",
"name": "Nom"
},
"loadQuery": {
"noFileSpecifiedError": "Aucun fichier nest spécifié",
"failedToLoadQueryError": "Impossible de charger la requête",
"failedToLoadQueryFromFileError": "Nous navons pas pu charger la requête à partir du fichier {{fileName}}",
"selectFilesToOpen": "Sélectionner un document de requête",
"browseFiles": "Parcourir"
},
"executeStoredProcedure": {
"enterInputParameters": "Saisir les paramètres dentrée (le cas échéant)",
"key": "Clé",
"param": "Paramètre",
"partitionKeyValue": "Valeur de la clé de partition",
"value": "Valeur",
"addNewParam": "Ajouter un nouveau paramètre",
"addParam": "Ajouter un paramètre",
"deleteParam": "Supprimer le paramètre",
"invalidParamError": "Paramètre non valide spécifié : {{invalidParam}}",
"invalidParamConsoleError": "Paramètre non valide spécifié : {{invalidParam}} nest pas une valeur littérale valide",
"stringType": "Chaîne",
"customType": "Personnalisé"
},
"uploadItems": {
"noFilesSpecifiedError": "Aucun fichier nest spécifié. Indiquez au moins un fichier.",
"selectJsonFiles": "Sélectionner des fichiers JSON",
"selectJsonFilesTooltip": "Sélectionnez un ou plusieurs fichiers JSON à charger. Chaque fichier peut contenir un document JSON unique ou un groupe de documents JSON. La taille combinée de tous les fichiers lors dune opération de chargement individuelle doit être inférieure à 2 Mo. Vous pouvez effectuer plusieurs opérations de chargement pour des ensembles de données plus volumineux.",
"fileNameColumn": "NOM DE FICHIER",
"statusColumn": "ÉTAT",
"uploadStatus": "{{numSucceeded}} créé(s), {{numThrottled}} limité(s), {{numFailed}} erreur(s)",
"uploadedFiles": "Fichiers chargés"
},
"copyNotebook": {
"copyFailedError": "Nous navons pas pu copier {{name}} vers {{destination}}",
"uploadFailedError": "Nous navons pas pu charger {{name}}",
"location": "Emplacement",
"locationAriaLabel": "Emplacement",
"selectLocation": "Sélectionner un emplacement de bloc-notes vers lequel effectuer une copie",
"name": "Nom"
},
"publishNotebook": {
"publishFailedError": "Nous navons pas pu publier {{notebookName}} dans la galerie",
"publishDescription": "Une fois publié, ce bloc-notes apparaîtra dans la galerie publique de bloc-notes dAzure Cosmos DB. Veillez à bien supprimer toutes les données sensibles et tout résultat avant la publication.",
"publishPrompt": "Voulez-vous publier et partager « {{name}} » dans la galerie ?",
"coverImage": "Image de couverture",
"coverImageUrl": "URL dimage de couverture",
"name": "Nom",
"description": "Description",
"tags": "Balises",
"tagsPlaceholder": "Balise facultative 1, Balise facultative 2",
"preview": "Aperçu",
"urlType": "URL",
"customImage": "Image personnalisée",
"takeScreenshot": "Prendre une capture décran",
"useFirstDisplayOutput": "Utiliser le résultat du premier affichage",
"failedToCaptureOutput": "Nous navons pas pu capturer le premier résultat",
"outputDoesNotExist": "Aucune des cellules ne présente de résultats.",
"failedToConvertError": "Nous navons pas pu convertir {{fileName}} au format base64",
"failedToUploadError": "Nous navons pas pu charger {{fileName}}"
},
"changePartitionKey": {
"failedToStartError": "Nous navons pas pu démarrer la tâche de transfert de données",
"suboptimalPartitionKeyError": "Avertissement : Le système a détecté que votre collection utilise peut-être une clé de partition sous-optimale",
"description": "Lorsque vous modifiez la clé de partition dun conteneur, vous devez créer un conteneur de destination avec la bonne clé de partition. Vous pouvez également sélectionner un conteneur de destination existant.",
"sourceContainerId": "ID de source de {{collectionName}}",
"destinationContainerId": "ID de destination de {{collectionName}}",
"collectionIdTooltip": "Lidentificateur unique du {{collectionName}}, également utilisé pour le routage basé sur lID dans REST et tous les SDK.",
"collectionIdPlaceholder": "p. ex. {{collectionName}}1",
"collectionIdAriaLabel": "ID {{collectionName}}, Exemple {{collectionName}}1",
"existingContainers": "Conteneurs existants",
"partitionKeyWarning": "Le conteneur de destination ne doit pas déjà exister. LExplorateur de données vous crée un nouveau conteneur de destination."
},
"cassandraAddCollection": {
"keyspaceLabel": "Nom de lespace de clés",
"keyspaceTooltip": "Sélectionnez un espace de clés existant ou saisissez un nouvel ID despace de clés.",
"tableIdLabel": "Entrez la commande CQL pour créer le tableau.",
"enterTableId": "Entrer lID de tableau",
"tableSchemaAriaLabel": "Schéma de tableau",
"provisionDedicatedThroughput": "Approvisionner le débit dédié pour ce tableau",
"provisionDedicatedThroughputTooltip": "Vous pouvez éventuellement approvisionner un débit dédié pour un tableau dans un espace de clés dont le débit est approvisionné. Ce débit dédié ne sera pas partagé avec les autres tableaux de lespace de clés et ne sera pas pris en compte dans le débit que vous approvisionnez pour lespace de clés. Cette quantité de débit sera facturée en plus du débit que vous approvisionnez au niveau de lespace de clés."
},
"tables": {
"addProperty": "Ajouter une propriété",
"addRow": "Ajouter une ligne",
"addEntity": "Ajouter une entité",
"back": "retour",
"nullFieldsWarning": "Avertissement : Les champs nuls ne sont pas affichés pour la modification.",
"propertyEmptyError": "{{property}} ne peut pas être vide. Entrer une valeur pour {{property}}",
"whitespaceError": "{{property}} ne peut pas contenir despace. Saisir une valeur pour {{property}}, sans espaces",
"propertyTypeEmptyError": "Le type de propriété ne peut pas être vide. Sélectionner un type dans la liste déroulante pour la propriété {{property}}"
},
"tableQuerySelect": {
"selectColumns": "Sélectionnez les colonnes à interroger.",
"availableColumns": "Colonnes disponibles"
},
"tableColumnSelection": {
"selectColumns": "Sélectionnez les colonnes à afficher dans la vue des éléments de votre conteneur.",
"searchFields": "Champs de recherche",
"reset": "Réinitialiser",
"partitionKeySuffix": " (clé de partition)"
},
"newVertex": {
"addProperty": "Ajouter une propriété"
},
"addGlobalSecondaryIndex": {
"globalSecondaryIndexId": "ID de conteneur dindex secondaire global",
"globalSecondaryIndexIdPlaceholder": "p. ex. indexbyEmailId",
"projectionQuery": "Requête de projection",
"projectionQueryPlaceholder": "SÉLECTIONNER c.email, c.accountId DE c",
"projectionQueryTooltip": "En savoir plus sur la définition des index secondaires globaux.",
"disabledTitle": "Un index secondaire global est déjà en cours de création. Attendez quil soit terminé avant den créer un nouveau."
},
"stringInput": {
"inputMismatchError": "Lentrée {{input}} ne correspond pas à lID {{selectedId}} sélectionné"
},
"panelInfo": {
"information": "Informations",
"moreDetails": "Plus de détails"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Scale",
"conflictResolution": "Conflict Resolution",
"settings": "Settings",
"indexingPolicy": "Indexing Policy",
"partitionKeys": "Partition Keys",
"partitionKeysPreview": "Partition Keys (preview)",
"computedProperties": "Computed Properties",
"containerPolicies": "Container Policies",
"throughputBuckets": "Throughput Buckets",
"globalSecondaryIndexPreview": "Global Secondary Index (Preview)",
"maskingPolicyPreview": "Masking Policy (preview)"
},
"mongoNotifications": {
"selectTypeWarning": "Please select a type for each index.",
"enterFieldNameError": "Entrez un nom de champ.",
"wildcardPathError": "Wildcard path is not present in the field name. Use a pattern like "
},
"partitionKey": {
"shardKey": "Shard key",
"partitionKey": "Partition key",
"shardKeyTooltip": "Utilisez les clés de partition (champ) pour fractionner vos données entre de nombreux jeux de réplicas (partitions) pour atteindre une scalabilité illimitée. Il est essentiel de choisir un champ qui répartit uniformément vos données.",
"partitionKeyTooltip": "is used to automatically distribute data across partitions for scalability. Choose a property in your JSON document that has a wide range of values and evenly distributes request volume.",
"sqlPartitionKeyTooltipSuffix": " Pour les charges de travail de petite taille à lecture intensive ou les charges de travail à écriture intensive de toute taille, lID est souvent un choix judicieux.",
"partitionKeySubtext": "For small workloads, the item ID is a suitable choice for the partition key.",
"mongoPlaceholder": "e.g., categoryId",
"gremlinPlaceholder": "e.g., /address",
"sqlFirstPartitionKey": "Obligatoire : première clé de partition, p. ex. /TenantId",
"sqlSecondPartitionKey": "deuxième clé de partition, par exemple, /UserId",
"sqlThirdPartitionKey": "troisième clé de partition, p. ex. /SessionId",
"defaultPlaceholder": "e.g., /address/zipCode"
},
"costEstimate": {
"title": "Cost estimate*",
"howWeCalculate": "How we calculate this",
"updatedCostPerMonth": "Updated cost per month",
"currentCostPerMonth": "Current cost per month",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "The starting autoscale max RU/s will be determined by the system, based on the current manual throughput settings and storage of your resource. After autoscale has been enabled, you can change the max RU/s.",
"ttlWarningText": "The system will automatically delete items based on the TTL value (in seconds) you provide, without needing a delete operation explicitly issued by a client application. For more information see,",
"ttlWarningLinkText": "Time to Live (TTL) in Azure Cosmos DB",
"unsavedIndexingPolicy": "indexing policy",
"unsavedDataMaskingPolicy": "data masking policy",
"unsavedComputedProperties": "computed properties",
"unsavedEditorWarningPrefix": "You have not saved the latest changes made to your",
"unsavedEditorWarningSuffix": ". Please click save to confirm the changes.",
"updateDelayedApplyWarning": "You are about to request an increase in throughput beyond the pre-allocated capacity. This operation will take some time to complete.",
"scalingUpDelayMessage": "Scaling up will take 4-6 hours as it exceeds what Azure Cosmos DB can instantly support currently based on your number of physical partitions. You can increase your throughput to {{instantMaximumThroughput}} instantly or proceed with this value and wait until the scale-up is completed.",
"exceedPreAllocatedMessage": "Your request to increase throughput exceeds the pre-allocated capacity which may take longer than expected. There are three options you can choose from to proceed:",
"instantScaleOption": "You can instantly scale up to {{instantMaximumThroughput}} RU/s.",
"asyncScaleOption": "You can asynchronously scale up to any value under {{maximumThroughput}} RU/s in 4-6 hours.",
"quotaMaxOption": "Your current quota max is {{maximumThroughput}} RU/s. To go over this limit, you must request a quota increase and the Azure Cosmos DB team will review.",
"belowMinimumMessage": "You are not able to lower throughput below your current minimum of {{minimum}} RU/s. For more information on this limit, please refer to our service quote documentation.",
"saveThroughputWarning": "Your bill will be affected as you update your throughput settings. Please review the updated cost estimate below before saving your changes",
"currentAutoscaleThroughput": "Current autoscale throughput:",
"targetAutoscaleThroughput": "Target autoscale throughput:",
"currentManualThroughput": "Current manual throughput:",
"targetManualThroughput": "Target manual throughput:",
"applyDelayedMessage": "The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"databaseLabel": "Database:",
"containerLabel": "Container:",
"applyShortDelayMessage": "A request to increase the throughput is currently in progress. This operation will take some time to complete.",
"applyLongDelayMessage": "A request to increase the throughput is currently in progress. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"throughputCapError": "Your account is currently configured with a total throughput limit of {{throughputCap}} RU/s. This update isn't possible because it would increase the total throughput to {{newTotalThroughput}} RU/s. Change total throughput limit in cost management.",
"throughputIncrementError": "Throughput value must be in increments of 1000"
},
"conflictResolution": {
"lwwDefault": "Last Write Wins (default)",
"customMergeProcedure": "Merge Procedure (custom)",
"mode": "Mode",
"conflictResolverProperty": "Conflict Resolver Property",
"storedProcedure": "Stored procedure",
"lwwTooltip": "Gets or sets the name of a integer property in your documents which is used for the Last Write Wins (LWW) based conflict resolution scheme. By default, the system uses the system defined timestamp property, _ts to decide the winner for the conflicting versions of the document. Specify your own integer property if you want to override the default timestamp based conflict resolution.",
"customTooltip": "Gets or sets the name of a stored procedure (aka merge procedure) for resolving the conflicts. You can write application defined logic to determine the winner of the conflicting versions of a document. The stored procedure will get executed transactionally, exactly once, on the server side. If you do not provide a stored procedure, the conflicts will be populated in the",
"customTooltipConflictsFeed": " conflicts feed",
"customTooltipSuffix": ". You can update/re-register the stored procedure at any time."
},
"changeFeed": {
"label": "Change feed log retention policy",
"tooltip": "Enable change feed log retention policy to retain last 10 minutes of history for items in the container by default. To support this, the request unit (RU) charge for this container will be multiplied by a factor of two for writes. Reads are unaffected."
},
"mongoIndexing": {
"disclaimer": "For queries that filter on multiple properties, create multiple single field indexes instead of a compound index.",
"disclaimerCompoundIndexesLink": " Compound indexes ",
"disclaimerSuffix": "are only used for sorting query results. If you need to add a compound index, you can create one using the Mongo shell.",
"compoundNotSupported": "Collections with compound indexes are not yet supported in the indexing editor. To modify indexing policy for this collection, use the Mongo Shell.",
"aadError": "To use the indexing policy editor, please login to the",
"aadErrorLink": "azure portal.",
"refreshingProgress": "Refreshing index transformation progress",
"canMakeMoreChangesZero": "You can make more indexing changes once the current index transformation is complete. ",
"refreshToCheck": "Refresh to check if it has completed.",
"canMakeMoreChangesProgress": "You can make more indexing changes once the current index transformation has completed. It is {{progress}}% complete. ",
"refreshToCheckProgress": "Refresh to check the progress.",
"definitionColumn": "Definition",
"typeColumn": "Type",
"dropIndexColumn": "Drop Index",
"addIndexBackColumn": "Add index back",
"deleteIndexButton": "Delete index Button",
"addBackIndexButton": "Add back Index Button",
"currentIndexes": "Current index(es)",
"indexesToBeDropped": "Index(es) to be dropped",
"indexFieldName": "Index Field Name",
"indexType": "Index Type",
"selectIndexType": "Select an index type",
"undoButton": "Undo Button"
},
"subSettings": {
"timeToLive": "Time to Live",
"ttlOff": "Off",
"ttlOnNoDefault": "On (no default)",
"ttlOn": "On",
"seconds": "second(s)",
"timeToLiveInSeconds": "Time to live in seconds",
"analyticalStorageTtl": "Analytical Storage Time to Live",
"geospatialConfiguration": "Geospatial Configuration",
"geography": "Geography",
"geometry": "Geometry",
"uniqueKeys": "Unique keys",
"mongoTtlMessage": "To enable time-to-live (TTL) for your collection/documents,",
"mongoTtlLinkText": "create a TTL index",
"partitionKeyTooltipTemplate": "This {{partitionKeyName}} is used to distribute data across multiple partitions for scalability. The value \"{{partitionKeyValue}}\" determines how documents are partitioned.",
"largePartitionKeyEnabled": "Large {{partitionKeyName}} has been enabled.",
"hierarchicalPartitioned": "Hierarchically partitioned container.",
"nonHierarchicalPartitioned": "Non-hierarchically partitioned container."
},
"scale": {
"freeTierInfo": "With free tier, you will get the first {{ru}} RU/s and {{storage}} GB of storage in this account for free. To keep your account free, keep the total RU/s across all resources in the account to {{ru}} RU/s.",
"freeTierLearnMore": "Learn more.",
"throughputRuS": "Throughput (RU/s)",
"autoScaleCustomSettings": "Your account has custom settings that prevents setting throughput at the container level. Please work with your Cosmos DB engineering team point of contact to make changes.",
"keyspaceSharedThroughput": "This table shared throughput is configured at the keyspace",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Change {{partitionKeyName}}",
"currentPartitionKey": "Current {{partitionKeyName}}",
"partitioning": "Partitioning",
"hierarchical": "Hierarchical",
"nonHierarchical": "Non-hierarchical",
"safeguardWarning": "To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to the source container for the entire duration of the partition key change process.",
"changeDescription": "To change the partition key, a new destination container must be created or an existing destination container selected. Data will then be copied to the destination container.",
"changeButton": "Change",
"changeJob": "{{partitionKeyName}} change job",
"cancelButton": "Cancel",
"documentsProcessed": "({{processedCount}} of {{totalCount}} documents processed)"
},
"computedProperties": {
"ariaLabel": "Computed properties",
"learnMorePrefix": "about how to define computed properties and how to use them."
},
"indexingPolicy": {
"ariaLabel": "Indexing Policy"
},
"dataMasking": {
"ariaLabel": "Data Masking Policy",
"validationFailed": "Validation failed:",
"includedPathsRequired": "includedPaths is required",
"includedPathsMustBeArray": "includedPaths must be an array",
"excludedPathsMustBeArray": "excludedPaths must be an array if provided"
},
"containerPolicy": {
"vectorPolicy": "Vector Policy",
"fullTextPolicy": "Full Text Policy",
"createFullTextPolicy": "Create new full text search policy"
},
"globalSecondaryIndex": {
"indexesDefined": "This container has the following indexes defined for it.",
"learnMoreSuffix": "about how to define global secondary indexes and how to use them.",
"jsonAriaLabel": "Global Secondary Index JSON",
"addIndex": "Add index",
"settingsTitle": "Global Secondary Index Settings",
"sourceContainer": "Source container",
"indexDefinition": "Global secondary index definition"
},
"indexingPolicyRefresh": {
"refreshFailed": "Refreshing index transformation progress failed"
},
"throughputInput": {
"autoscale": "Autoscale",
"manual": "Manual",
"minimumRuS": "Minimum RU/s",
"maximumRuS": "Maximum RU/s",
"x10Equals": "x 10 =",
"storageCapacity": "Storage capacity",
"fixed": "Fixed",
"unlimited": "Unlimited",
"instant": "Instant",
"fourToSixHrs": "4-6 hrs",
"autoscaleDescription": "Based on usage, your {{resourceType}} throughput will scale from",
"freeTierWarning": "Billing will apply if you provision more than {{ru}} RU/s of manual throughput, or if the resource scales beyond {{ru}} RU/s with autoscale.",
"capacityCalculator": "Estimate your required RU/s with",
"capacityCalculatorLink": " capacity calculator",
"fixedStorageNote": "When using a collection with fixed storage capacity, you can set up to 10,000 RU/s.",
"min": "min",
"max": "max"
},
"throughputBuckets": {
"label": "Throughput Buckets",
"bucketLabel": "Bucket {{id}}",
"dataExplorerQueryBucket": " (Data Explorer Query Bucket)",
"active": "Active",
"inactive": "Inactive"
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,9 @@
"upload": "Unggah",
"connect": "Sambungkan",
"remove": "Hapus",
"load": "Muat",
"publish": "Terbitkan",
"browse": "Telusuri",
"increaseValueBy1": "Tambah nilai sebesar 1",
"decreaseValueBy1": "Kurangi nilai sebesar 1"
},
@@ -291,5 +294,675 @@
"errorCreateContainer": "Gagal membuat kontainer: {{error}}",
"errorImportData": "Gagal mengimpor data: {{error}}"
}
},
"contextMenu": {
"newContainer": "{{containerName}} baru",
"restoreContainer": "Pulihkan {{containerName}}",
"deleteDatabase": "Hapus {{databaseName}}",
"deleteContainer": "Hapus {{containerName}}",
"newSqlQuery": "Kueri SQL Baru",
"newQuery": "Kueri Baru",
"openMongoShell": "Buka Mongo Shell",
"newShell": "Shell Baru",
"openCassandraShell": "Buka Cassandra Shell",
"newStoredProcedure": "Prosedur Tersimpan Baru",
"newUdf": "UDF baru",
"newTrigger": "Pemicu Baru",
"deleteStoredProcedure": "Hapus Prosedur tersimpan",
"deleteTrigger": "Hapus Pemicu",
"deleteUdf": "Hapus Fungsi yang Ditentukan Pengguna"
},
"tabs": {
"documents": {
"newItem": "Item Baru",
"newDocument": "Dokumen Baru",
"uploadItem": "Unggah Item",
"applyFilter": "Terapkan Filter",
"unsavedChanges": "Perubahan yang belum disimpan",
"unsavedChangesMessage": "Perubahan yang belum disimpan akan hilang. Lanjutkan?",
"createDocumentFailed": "Gagal membuat dokumen",
"updateDocumentFailed": "Gagal memperbarui dokumen",
"documentDeleted": "Dokumen berhasil dihapus.",
"deleteDocumentDialogTitle": "Hapus dokumen",
"deleteDocumentsDialogTitle": "Hapus dokumen",
"throttlingError": "Beberapa dokumen gagal dihapus karena kesalahan pembatasan laju. Coba lagi nanti. Untuk mencegah hal ini terjadi lagi, coba tambah throughput di kontainer atau database Anda.",
"deleteFailed": "Gagal menghapus dokumen ({{error}})",
"missingShardProperty": "Dokumen tidak memiliki properti shard: {{partitionKeyProperty}}",
"refreshGridFailed": "Gagal me-refresh kisi dokumen",
"confirmDelete": "Yakin ingin menghapus {{documentName}}?",
"confirmDeleteTitle": "Konfirmasikan penghapusan",
"selectedItems": "{{count}} item yang dipilih",
"selectedItem": "item yang dipilih",
"selectedDocuments": "{{count}} dokumen yang dipilih",
"selectedDocument": "dokumen yang dipilih",
"deleteDocumentFailedLog": "Gagal menghapus dokumen {{documentId}} dengan kode status {{statusCode}}",
"deleteSuccessLog": "{{count}} dokumen berhasil dihapus",
"deleteThrottledLog": "Gagal menghapus {{count}} dokumen karena kesalahan \"Permintaan terlalu besar\" (429). Mencoba lagi...",
"missingShardKeyLog": "Gagal menyimpan dokumen baru: Kunci shard dokumen tidak ditentukan",
"filterTooltip": "Ketik predikat kueri atau pilih salah satu dari daftar.",
"loadMore": "Muat lainnya",
"documentEditor": "Editor dokumen",
"savedFilters": "Filter tersimpan",
"defaultFilters": "Filter default",
"abort": "Batalkan",
"deletingDocuments": "Menghapus {{count}} dokumen",
"deletedDocumentsSuccess": "Berhasil menghapus {{count}} dokumen.",
"deleteAborted": "Penghapusan dokumen dibatalkan.",
"failedToDeleteDocuments": "Gagal menghapus {{count}} dokumen.",
"requestTooLargeBase": "Beberapa permintaan penghapusan gagal karena pengecualian \"Permintaan terlalu besar\" (429)",
"retriedSuccessfully": "tetapi berhasil dicoba ulang.",
"retryingNow": "Mencoba lagi sekarang.",
"increaseThroughputTip": "Untuk mencegah hal ini terjadi lagi, coba tambah throughput di kontainer atau database Anda.",
"numberOfSelectedDocuments": "Jumlah dokumen yang dipilih: {{count}}",
"mongoFilterPlaceholder": "Ketik predikat kueri (misalnya, {\"id\":\"foo\"}), atau pilih salah satu dari daftar menurun, atau biarkan kosong untuk mengkueri semua dokumen.",
"sqlFilterPlaceholder": "Ketik predikat kueri (misalnya, WHERE c.id=\"1\"), atau pilih salah satu dari daftar menurun, atau kosongkan untuk mengkueri semua dokumen.",
"error": "Kesalahan",
"warning": "Peringatan"
},
"query": {
"executeQuery": "Jalankan Kueri",
"executeSelection": "Jalankan Pilihan",
"saveQuery": "Simpan Kueri",
"downloadQuery": "Unduh Kueri",
"cancelQuery": "Batalkan kueri",
"openSavedQueries": "Buka Kueri Tersimpan",
"vertical": "Vertikal",
"horizontal": "Horizontal",
"view": "Tampilkan",
"editingQuery": "Mengedit Kueri"
},
"storedProcedure": {
"id": "ID Prosedur Tersimpan",
"idPlaceholder": "Masukkan ID prosedur baru yang disimpan",
"idAriaLabel": "ID prosedur tersimpan",
"body": "Isi Prosedur Tersimpan",
"bodyAriaLabel": "Isi prosedur tersimpan",
"successfulExecution": "Eksekusi prosedur tersimpan berhasil",
"resultAriaLabel": "Jalankan hasil prosedur tersimpan",
"logsAriaLabel": "Jalankan log prosedur tersimpan",
"errors": "Kesalahan:",
"errorDetailsAriaLabel": "Tautan detail kesalahan",
"moreDetails": "Detail selengkapnya",
"consoleLogTab": "console.log"
},
"trigger": {
"id": "ID Pemicu",
"idPlaceholder": "Masukkan ID pemicu baru",
"type": "Tipe Pemicu",
"operation": "Operasi Pemicu",
"body": "Isi Pemicu",
"bodyAriaLabel": "Isi pemicu",
"pre": "Pra",
"post": "Posting",
"all": "Semua",
"operationCreate": "Buat",
"operationDelete": "Hapus",
"operationReplace": "Ganti"
},
"udf": {
"id": "ID Fungsi yang Ditentukan Pengguna",
"idPlaceholder": "Masukkan ID fungsi yang ditentukan pengguna baru",
"body": "Isi Fungsi yang Ditentukan Pengguna",
"bodyAriaLabel": "Isi fungsi yang ditentukan pengguna"
},
"conflicts": {
"unsavedChanges": "Perubahan yang belum disimpan",
"changesWillBeLost": "Perubahan akan hilang. Lanjutkan?",
"resolveConflictFailed": "Gagal mengatasi konflik",
"deleteConflictFailed": "Gagal menghapus konflik",
"refreshGridFailed": "Gagal me-refresh kisi dokumen"
},
"mongoShell": {
"title": "Mongo Shell"
}
},
"panes": {
"deleteDatabase": {
"panelTitle": "Hapus {{databaseName}}",
"warningMessage": "Peringatan! Tindakan yang akan Anda lakukan tidak dapat dibatalkan. Melanjutkan akan menghapus sumber daya dan semua sumber daya anaknya secara permanen.",
"confirmPrompt": "Konfirmasikan dengan mengetik id {{databaseName}} (nama)",
"inputMismatch": "Nama {{databaseName}} input \"{{input}}\" tidak cocok dengan {{databaseName}} \"{{selectedId}}\" yang dipilih",
"feedbackTitle": "Bantuan kami meningkatkan Azure Cosmos DB!",
"feedbackReason": "Apa alasan menghapus {{databaseName}} ini?"
},
"deleteCollection": {
"panelTitle": "Hapus {{collectionName}}",
"confirmPrompt": "Konfirmasikan dengan mengetik id {{collectionName}}",
"inputMismatch": "Id input {{input}} tidak cocok dengan {{selectedId}} yang dipilih",
"feedbackTitle": "Bantuan kami meningkatkan Azure Cosmos DB!",
"feedbackReason": "Apa alasan menghapus {{collectionName}} ini?"
},
"addDatabase": {
"databaseLabel": "Database {{suffix}}",
"databaseIdLabel": "Id database",
"keyspaceIdLabel": "Id ruang kunci",
"databaseIdPlaceholder": "Ketik id {{databaseLabel}} baru",
"databaseTooltip": "{{databaseLabel}} adalah kontainer logis dari satu atau beberapa {{collectionsLabel}}",
"shareThroughput": "Bagikan throughput di {{collectionsLabel}}",
"shareThroughputTooltip": "Throughput yang diprovisi di tingkat {{databaseLabel}} akan dibagikan ke semua {{collectionsLabel}} dalam {{databaseLabel}}.",
"greaterThanError": "Masukkan nilai yang lebih besar dari {{minValue}} untuk throughput autopilot",
"acknowledgeSpendError": "Setujui perkiraan pengeluaran {{period}}.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "Buat baru",
"useExisting": "Gunakan yang sudah ada",
"databaseTooltip": "Database serupa dengan namespace. Ini adalah unit manajemen untuk serangkaian {{collectionName}}.",
"shareThroughput": "Bagikan throughput di {{collectionName}}",
"shareThroughputTooltip": "Throughput yang dikonfigurasi di tingkat database akan dibagikan ke semua {{collectionName}} dalam database.",
"collectionIdLabel": "{{collectionName}} id",
"collectionIdTooltip": "Pengidentifikasi unik untuk {{collectionName}} dan digunakan untuk perutean berbasis id melalui REST dan semua SDK.",
"collectionIdPlaceholder": "misalnya, {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} id, Contoh {{collectionName}}1",
"existingDatabaseAriaLabel": "Pilih id {{databaseName}} yang sudah ada",
"existingDatabasePlaceholder": "Pilih id {{databaseName}} yang sudah ada",
"indexing": "Mengindeks",
"turnOnIndexing": "Aktifkan pengindeksan",
"automatic": "Otomatis",
"turnOffIndexing": "Nonaktifkan pengindeksan",
"off": "Nonaktif",
"sharding": "Pecahan",
"shardingTooltip": "Koleksi yang dipecah membagi data Anda ke banyak set replika (shard) untuk mencapai skalabilitas tanpa batas. Koleksi yang dipecah mengharuskan pemilihan kunci shard (bidang) untuk mendistribusikan data secara merata.",
"unsharded": "Tidak dipecah",
"unshardedLabel": "Tidak dipecah (batas 20GB)",
"sharded": "Dipecah",
"addPartitionKey": "Tambahkan kunci partisi hierarkis",
"hierarchicalPartitionKeyInfo": "Fitur ini memungkinkan partisi data dengan maksimal tiga tingkat kunci untuk distribusi data yang lebih baik. Memerlukan .NET V3, Java V4 SDK, atau pratinjau JavaScript V3 SDK.",
"provisionDedicatedThroughput": "Provisikan throughput khusus untuk {{collectionName}} ini",
"provisionDedicatedThroughputTooltip": "Anda juga dapat memprovisikan throughput khusus untuk {{collectionName}} dalam ruang kunci yang sudah memiliki provisi throughput. Jumlah throughput khusus ini tidak akan dibagikan dengan {{collectionNamePlural}} lain dalam ruang kunci dan tidak dihitung ke dalam throughput yang Anda provisikan untuk ruang kunci tersebut. Jumlah throughput ini akan ditagih di luar throughput yang Anda provisikan di tingkat database.",
"uniqueKeysPlaceholderMongo": "Jalur yang dipisahkan koma, misalnya firstName,address.zipCode",
"uniqueKeysPlaceholderSql": "Jalur yang dipisahkan koma, misalnya /firstName,/address/zipCode",
"addUniqueKey": "Tambahkan kunci unik",
"enableAnalyticalStore": "Aktifkan penyimpanan analitik",
"disableAnalyticalStore": "Nonaktifkan penyimpanan analitik",
"on": "Aktif",
"analyticalStoreSynapseLinkRequired": "Azure Synapse Link diperlukan untuk membuat penyimpanan analitik {{collectionName}}. Aktifkan Azure Synapse Link untuk akun Cosmos DB ini.",
"enable": "Aktifkan",
"containerVectorPolicy": "Kebijakan Vektor Kontainer",
"containerFullTextSearchPolicy": "Kebijakan Pencarian Teks Lengkap Kontainer",
"advanced": "Tingkat lanjut",
"mongoIndexingTooltip": "Field _id diindeks secara default. Membuat indeks wildcard untuk semua bidang akan mengoptimalkan kueri dan disarankan untuk pengembangan.",
"createWildcardIndex": "Buat Indeks Wildcard di semua bidang",
"legacySdkCheckbox": "Aplikasi saya menggunakan versi Cosmos .NET atau Java SDK lama (.NET V1 atau Java V2)",
"legacySdkInfo": "Untuk memastikan kompatibilitas dengan SDK lama, kontainer yang dibuat akan menggunakan skema partisi lama yang mendukung nilai kunci partisi dengan ukuran maksimal 101 byte. Jika diaktifkan, Anda tidak dapat menggunakan kunci partisi hierarkis.",
"indexingOnInfo": "Semua properti dalam dokumen akan diindeks secara default untuk kueri yang fleksibel dan efisien.",
"indexingOffInfo": "Pengindeksan akan dinonaktifkan. Disarankan jika Anda tidak perlu menjalankan kueri atau hanya melakukan operasi nilai kunci.",
"indexingOffWarning": "Dengan membuat kontainer ini dengan pengindeksan dinonaktifkan, Anda tidak dapat mengubah kebijakan pengindeksan. Perubahan pengindeksan hanya diperbolehkan terhadap kontainer dengan kebijakan pengindeksan.",
"acknowledgeSpendErrorMonthly": "Setujui perkiraan pengeluaran bulanan.",
"acknowledgeSpendErrorDaily": "Setujui perkiraan pengeluaran harian.",
"unshardedMaxRuError": "Koleksi yang tidak dipecah mendukung hingga 10.000 RU",
"acknowledgeShareThroughputError": "Setujui perkiraan biaya throughput khusus ini.",
"vectorPolicyError": "Perbaiki kesalahan dalam kebijakan vektor kontainer",
"fullTextSearchPolicyError": "Perbaiki kesalahan dalam kebijakan pencarian teks lengkap kontainer",
"addingSampleDataSet": "Menambahkan sampel himpunan data",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "Kunci shard (bidang) digunakan untuk membagi data Anda ke banyak set replika (shard) untuk mencapai skalabilitas tanpa batas. Penting memilih bidang yang mendistribusikan data secara merata.",
"partitionKeyTooltip": "{{partitionKeyName}} digunakan untuk mendistribusikan data secara otomatis di seluruh partisi untuk skalabilitas. Pilih properti dalam dokumen JSON Anda yang memiliki berbagai nilai dan mendistribusikan volume permintaan secara merata.",
"partitionKeyTooltipSqlSuffix": " Untuk beban kerja baca berat atau beban kerja tulis berat yang kecil dengan ukuran apa pun, id sering menjadi pilihan yang baik.",
"shardKeyLabel": "Tombol shard",
"partitionKeyLabel": "Kunci partisi",
"shardKeyPlaceholder": "misalnya, categoryId",
"partitionKeyPlaceholderDefault": "misalnya, /address",
"partitionKeyPlaceholderFirst": "Wajib - kunci partisi pertama misalnya, /TenantId",
"partitionKeyPlaceholderSecond": "kunci partisi kedua misalnya, /UserId",
"partitionKeyPlaceholderThird": "kunci partisi ketiga misalnya, /SessionId",
"partitionKeyPlaceholderGraph": "misalnya /address/zipCode",
"uniqueKeysTooltip": "Kunci unik memberi pengembang kemampuan menambahkan lapisan integritas data ke database. Dengan membuat kebijakan kunci unik saat kontainer dibuat, Anda memastikan keunikan satu atau beberapa nilai per kunci partisi.",
"uniqueKeysLabel": "Kunci unik",
"analyticalStoreLabel": "Penyimpanan Analitik",
"analyticalStoreTooltip": "Aktifkan kemampuan penyimpanan analitik untuk melakukan analitik mendekati real-time terhadap data operasional tanpa memengaruhi performa beban kerja transaksional.",
"analyticalStoreDescription": "Aktifkan kemampuan penyimpanan analitik untuk melakukan analitik mendekati real-time terhadap data operasional tanpa memengaruhi performa beban kerja transaksional.",
"vectorPolicyTooltip": "Jelaskan properti dalam data Anda yang berisi vektor agar dapat disediakan untuk kueri kemiripan."
},
"settings": {
"pageOptions": "Opsi Halaman",
"pageOptionsDescription": "Pilih Kustom untuk menentukan jumlah hasil kueri tetap yang akan ditampilkan, atau pilih Tak Terbatas untuk menampilkan sebanyak mungkin hasil kueri per halaman.",
"queryResultsPerPage": "Hasil kueri per halaman",
"queryResultsPerPageTooltip": "Masukkan jumlah hasil kueri yang harus ditampilkan per halaman.",
"customQueryItemsPerPage": "Item kueri kustom per halaman",
"custom": "Kustom",
"unlimited": "Tidak terbatas",
"entraIdRbac": "Aktifkan RBAC Entra ID",
"entraIdRbacDescription": "Pilih Otomatis untuk mengaktifkan RBAC Entra ID secara otomatis. True/False untuk mengaktifkan atau menonaktifkan RBAC Entra ID secara paksa.",
"true": "True",
"false": "False",
"regionSelection": "Pemilihan Wilayah",
"regionSelectionDescription": "Mengubah wilayah yang digunakan Klien Cosmos untuk mengakses akun.",
"selectRegion": "Pilih Wilayah",
"selectRegionTooltip": "Mengubah titik akhir akun yang digunakan untuk melakukan operasi klien.",
"globalDefault": "Global (Default)",
"readWrite": "(Baca/Tulis)",
"read": "(Baca)",
"queryTimeout": "Batas Waktu Kueri",
"queryTimeoutDescription": "Saat kueri mencapai batas waktu yang ditentukan, popup dengan opsi untuk membatalkan kueri akan muncul kecuali pembatalan otomatis telah diaktifkan.",
"enableQueryTimeout": "Aktifkan batas waktu kueri",
"queryTimeoutMs": "Batas waktu kueri (mdtk)",
"automaticallyCancelQuery": "Batalkan kueri secara otomatis setelah batas waktu",
"ruLimit": "RU Limit",
"ruLimitDescription": "Jika kueri melebihi batas RU yang dikonfigurasi, kueri akan dibatalkan.",
"enableRuLimit": "Aktifkan batas RU",
"ruLimitLabel": "RU Limit (RU)",
"defaultQueryResults": "Tampilan Hasil Kueri Default",
"defaultQueryResultsDescription": "Pilih tampilan default untuk digunakan saat menampilkan hasil kueri.",
"retrySettings": "Pengaturan Coba Lagi",
"retrySettingsDescription": "Kebijakan percobaan kembali yang terkait dengan permintaan yang dibatasi selama kueri CosmosDB.",
"maxRetryAttempts": "Upaya percobaan kembali maks",
"maxRetryAttemptsTooltip": "Jumlah maks percobaan kembali yang akan dilakukan untuk sebuah permintaan. Nilai default 9.",
"fixedRetryInterval": "Interval percobaan kembali tetap (mdtk)",
"fixedRetryIntervalTooltip": "Interval percobaan kembali tetap dalam milidetik untuk menunggu di antara setiap percobaan kembali, mengabaikan retryAfter yang dihasilkan sebagai bagian dari respons. Nilai default-nya adalah 0 milidetik.",
"maxWaitTime": "Waktu tunggu maks (dtk)",
"maxWaitTimeTooltip": "Waktu tunggu maks dalam detik untuk menunggu permintaan selama percobaan kembali berlangsung. Nilai default 30 detik.",
"enableContainerPagination": "Aktifkan penomoran halaman kontainer",
"enableContainerPaginationDescription": "Muat 50 kontainer sekaligus. Saat ini, kontainer tidak dimuat dalam urutan alfanumerik.",
"enableCrossPartitionQuery": "Aktifkan kueri partisi silang",
"enableCrossPartitionQueryDescription": "Kirim lebih dari satu permintaan saat menjalankan kueri. Lebih dari satu permintaan diperlukan jika kueri tidak dibatasi pada satu nilai kunci partisi.",
"maxDegreeOfParallelism": "Tingkat paralelisme maksimum",
"maxDegreeOfParallelismDescription": "Mengambil atau mengatur jumlah operasi serentak yang dijalankan di sisi klien selama eksekusi kueri paralel. Nilai properti positif membatasi jumlah operasi serentak sesuai nilai yang ditetapkan. Jika diatur kurang dari 0, sistem menentukan secara otomatis jumlah operasi serentak yang dijalankan.",
"maxDegreeOfParallelismQuery": "Kueri hingga tingkat paralelisme maks.",
"priorityLevel": "Tingkat Prioritas",
"priorityLevelDescription": "Menetapkan tingkat prioritas untuk permintaan data-plane dari Data Explorer saat menggunakan Eksekusi Berbasis Prioritas. Jika dipilih \"Tidak ada\", Data Explorer tidak akan menentukan tingkat prioritas dan tingkat prioritas default sisi server akan digunakan.",
"displayGremlinQueryResults": "Tampilkan hasil kueri Gremlin sebagai:",
"displayGremlinQueryResultsDescription": "Pilih Grafik untuk memvisualisasikan hasil kueri secara otomatis sebagai Grafik atau JSON untuk menampilkan hasil sebagai JSON.",
"graph": "Grafik",
"json": "JSON",
"graphAutoVisualization": "Visualisasi Otomatis Grafik",
"enableSampleDatabase": "Aktifkan sampel database",
"enableSampleDatabaseDescription": "Ini adalah database dan koleksi sampel dengan data produk sintetis yang dapat digunakan untuk menjelajahi kueri NoSQL. Ini akan muncul sebagai database lain di UI Data Explorer, dibuat dan dikelola oleh Microsoft tanpa biaya untuk Anda.",
"enableSampleDbAriaLabel": "Aktifkan db sampel untuk penjelajahan kueri",
"guidRepresentation": "Representasi Guid",
"guidRepresentationDescription": "GuidRepresentation di MongoDB mengacu pada cara Pengidentifikasi Unik Global (GUID) diserialisasi dan dideserialisasi saat disimpan dalam dokumen BSON. Ini berlaku untuk semua operasi dokumen.",
"advancedSettings": "Pengaturan Tingkat Lanjut",
"ignorePartitionKey": "Abaikan kunci partisi saat memperbarui dokumen",
"ignorePartitionKeyTooltip": "Jika dicentang, nilai kunci partisi tidak akan digunakan untuk menemukan dokumen selama operasi pembaruan. Gunakan hanya jika pembaruan dokumen gagal karena kunci partisi yang tidak normal.",
"clearHistory": "Hapus Riwayat",
"clearHistoryConfirm": "Yakin ingin melanjutkan?",
"clearHistoryDescription": "Tindakan ini akan menghapus semua kustomisasi untuk akun ini di browser ini, termasuk:",
"clearHistoryTabLayout": "Atur ulang tata letak tab yang dikustomisasi, termasuk posisi pemisah",
"clearHistoryTableColumns": "Hapus preferensi kolom tabel Anda, termasuk kolom kustom apa pun",
"clearHistoryFilters": "Hapus riwayat filter Anda",
"clearHistoryRegion": "Atur ulang pilihan wilayah ke global",
"increaseValueBy1000": "Naikkan nilai sebesar 1000",
"decreaseValueBy1000": "Kurangi nilai sebesar 1000",
"none": "Tidak ada",
"low": "Rendah",
"high": "Tinggi",
"automatic": "Otomatis",
"enhancedQueryControl": "Kontrol kueri yang disempurnakan",
"enableQueryControl": "Aktifkan kontrol kueri",
"explorerVersion": "Versi Explorer",
"accountId": "ID Akun",
"sessionId": "ID Sesi",
"popupsDisabledError": "Kami tidak dapat melakukan otorisasi untuk akun ini karena pop-up dinonaktifkan di browser.\nAktifkan pop-up untuk situs ini dan klik tombol \"Masuk untuk ID Entra\"",
"failedToAcquireTokenError": "Gagal memperoleh token otorisasi secara otomatis. Klik tombol \"Masuk untuk Entra ID\" untuk mengaktifkan operasi RBAC Entra ID"
},
"saveQuery": {
"panelTitle": "Simpan Kueri",
"setupCostMessage": "Untuk alasan kepatuhan, kami menyimpan kueri dalam kontainer di akun Azure Cosmos Anda, di database terpisah bernama \"{{databaseName}}\". Untuk melanjutkan, kami perlu membuat kontainer di akun Anda, dengan perkiraan biaya tambahan $0,77 per hari.",
"completeSetup": "Selesaikan penyiapan",
"noQueryNameError": "Tidak ada nama kueri yang ditentukan",
"invalidQueryContentError": "Konten kueri yang ditentukan tidak valid",
"failedToSaveQueryError": "Gagal menyimpan kueri {{queryName}}",
"failedToSetupContainerError": "Gagal menyiapkan kontainer untuk kueri tersimpan",
"accountNotSetupError": "Gagal menyimpan kueri: akun tidak disiapkan untuk menyimpan kueri",
"name": "Nama"
},
"loadQuery": {
"noFileSpecifiedError": "Tidak ada file yang ditentukan",
"failedToLoadQueryError": "Gagal memuat kueri.",
"failedToLoadQueryFromFileError": "Gagal memuat kueri dari file {{fileName}}",
"selectFilesToOpen": "Pilih dokumen kueri",
"browseFiles": "Telusuri"
},
"executeStoredProcedure": {
"enterInputParameters": "Masukkan parameter input (jika ada)",
"key": "Kunci",
"param": "Param",
"partitionKeyValue": "Nilai kunci partisi",
"value": "Nilai",
"addNewParam": "Tambahkan Parameter Baru",
"addParam": "Tambahkan parameter",
"deleteParam": "Hapus parameter",
"invalidParamError": "Parameter yang ditentukan tidak valid: {{invalidParam}}",
"invalidParamConsoleError": "Parameter yang ditentukan tidak valid: {{invalidParam}} bukan nilai literal yang valid",
"stringType": "String",
"customType": "Kustom"
},
"uploadItems": {
"noFilesSpecifiedError": "Tidak ada file yang ditentukan. Masukkan setidaknya satu file.",
"selectJsonFiles": "Pilih Files JSON",
"selectJsonFilesTooltip": "Pilih satu atau beberapa file JSON untuk diunggah. Setiap file dapat berisi satu dokumen JSON atau susunan dokumen JSON. Ukuran gabungan semua file dalam satu operasi pengunggahan harus kurang dari 2 MB. Anda dapat melakukan beberapa operasi pengunggahan untuk himpunan data yang lebih besar.",
"fileNameColumn": "NAMA FILE",
"statusColumn": "STATUS",
"uploadStatus": "{{numSucceeded}} dibuat, {{numThrottled}} dibatasi, {{numFailed}} kesalahan",
"uploadedFiles": "File yang diunggah"
},
"copyNotebook": {
"copyFailedError": "Gagal menyalin {{name}} ke {{destination}}",
"uploadFailedError": "Gagal mengunggah {{name}}",
"location": "Lokasi",
"locationAriaLabel": "Lokasi",
"selectLocation": "Pilih lokasi buku catatan untuk disalin",
"name": "Nama"
},
"publishNotebook": {
"publishFailedError": "Gagal menerbitkan {{notebookName}} ke galeri",
"publishDescription": "Saat diterbitkan, buku catatan ini akan muncul di galeri publik buku catatan Azure Cosmos DB. Pastikan Anda telah menghapus data atau output sensitif sebelum menerbitkan.",
"publishPrompt": "Apakah Anda ingin menerbitkan dan membagikan \"{{name}}\" ke galeri?",
"coverImage": "Gambar sampul",
"coverImageUrl": "Url gambar sampul",
"name": "Nama",
"description": "Deskripsi",
"tags": "Tag",
"tagsPlaceholder": "Tag opsional 1, Tag opsional 2",
"preview": "Pratinjau",
"urlType": "URL",
"customImage": "Gambar Kustom",
"takeScreenshot": "Ambil Cuplikan Layar",
"useFirstDisplayOutput": "Gunakan Output Tampilan Pertama",
"failedToCaptureOutput": "Gagal mengambil output pertama",
"outputDoesNotExist": "Output tidak ada untuk sel mana pun.",
"failedToConvertError": "Gagal mengonversi {{fileName}} ke format base64",
"failedToUploadError": "Gagal mengunggah {{fileName}}"
},
"changePartitionKey": {
"failedToStartError": "Gagal memulai tugas transfer data",
"suboptimalPartitionKeyError": "Peringatan: Sistem mendeteksi bahwa koleksi Anda mungkin menggunakan kunci partisi yang kurang optimal",
"description": "Saat mengubah kunci partisi kontainer, Anda harus membuat kontainer tujuan dengan kunci partisi yang benar. Anda juga dapat memilih kontainer tujuan yang sudah ada.",
"sourceContainerId": "ID {{collectionName}} sumber",
"destinationContainerId": "Id {{collectionName}} tujuan",
"collectionIdTooltip": "Pengidentifikasi unik untuk {{collectionName}} dan digunakan untuk perutean berbasis id melalui REST dan semua SDK.",
"collectionIdPlaceholder": "misalnya, {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} id, Contoh {{collectionName}}1",
"existingContainers": "Kontainer yang Sudah Ada",
"partitionKeyWarning": "Kontainer tujuan tidak boleh sudah ada. Data Explorer akan membuat kontainer tujuan baru untuk Anda."
},
"cassandraAddCollection": {
"keyspaceLabel": "Nama ruang kunci",
"keyspaceTooltip": "Pilih ruang kunci yang sudah ada atau masukkan ID ruang kunci baru.",
"tableIdLabel": "Masukkan perintah CQL untuk membuat tabel.",
"enterTableId": "Masukkan id tabel",
"tableSchemaAriaLabel": "Skema tabel",
"provisionDedicatedThroughput": "Provisikan throughput khusus untuk tabel ini",
"provisionDedicatedThroughputTooltip": "Anda juga dapat memprovisikan throughput khusus untuk tabel dalam ruang kunci yang sudah memiliki provisi throughput. Jumlah throughput khusus ini tidak akan dibagikan dengan tabel lain dalam ruang kunci dan tidak dihitung ke dalam throughput yang Anda provisikan untuk ruang kunci tersebut. Jumlah throughput ini akan ditagih di luar throughput yang Anda provisikan di tingkat ruang kunci."
},
"tables": {
"addProperty": "Tambahkan Properti",
"addRow": "Tambahkan Baris",
"addEntity": "Tambahkan Entitas",
"back": "kembali",
"nullFieldsWarning": "Peringatan: Field null tidak akan ditampilkan untuk pengeditan.",
"propertyEmptyError": "{{property}} tidak boleh kosong. Masukkan nilai untuk {{property}}",
"whitespaceError": "{{property}} tidak boleh berisi spasi. Masukkan nilai untuk {{property}} tanpa spasi",
"propertyTypeEmptyError": "Jenis properti tidak boleh kosong. Pilih tipe dari dropdown untuk properti {{property}}"
},
"tableQuerySelect": {
"selectColumns": "Pilih kolom yang ingin dikueri.",
"availableColumns": "Kolom yang Tersedia"
},
"tableColumnSelection": {
"selectColumns": "Pilih kolom yang akan ditampilkan dalam tampilan item di kontainer Anda.",
"searchFields": "Bidang pencarian",
"reset": "Atur ulang",
"partitionKeySuffix": " (kunci partisi)"
},
"newVertex": {
"addProperty": "Tambahkan Properti"
},
"addGlobalSecondaryIndex": {
"globalSecondaryIndexId": "Id kontainer indeks sekunder global",
"globalSecondaryIndexIdPlaceholder": "misalnya, indexbyEmailId",
"projectionQuery": "Kueri proyeksi",
"projectionQueryPlaceholder": "SELECT c.email, c.accountId FROM c",
"projectionQueryTooltip": "Pelajari lebih lanjut tentang mendefinisikan indeks sekunder global.",
"disabledTitle": "Indeks sekunder global sedang dibuat. Tunggu hingga selesai sebelum memulai yang lain."
},
"stringInput": {
"inputMismatchError": "Input {{input}} tidak cocok dengan {{selectedId}} yang dipilih"
},
"panelInfo": {
"information": "Informasi",
"moreDetails": "Detail selengkapnya"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Skalakan",
"conflictResolution": "Resolusi Konflik",
"settings": "Pengaturan",
"indexingPolicy": "Kebijakan Pengindeksan",
"partitionKeys": "Kunci Partisi",
"partitionKeysPreview": "Kunci Partisi (pratinjau)",
"computedProperties": "Properti Terkomputasi",
"containerPolicies": "Kebijakan Kontainer",
"throughputBuckets": "Wadah Throughput",
"globalSecondaryIndexPreview": "Indeks Sekunder Global (Pratinjau)",
"maskingPolicyPreview": "Kebijakan Penyembunyian (pratinjau)"
},
"mongoNotifications": {
"selectTypeWarning": "Pilih tipe untuk setiap indeks.",
"enterFieldNameError": "Masukkan nama bidang.",
"wildcardPathError": "Jalur wildcard tidak ada dalam nama bidang. Gunakan pola seperti "
},
"partitionKey": {
"shardKey": "Tombol shard",
"partitionKey": "Kunci partisi",
"shardKeyTooltip": "Kunci shard (bidang) digunakan untuk membagi data Anda ke banyak set replika (shard) untuk mencapai skalabilitas tanpa batas. Penting memilih bidang yang mendistribusikan data secara merata.",
"partitionKeyTooltip": "digunakan untuk mendistribusikan data secara otomatis di seluruh partisi untuk skalabilitas. Pilih properti dalam dokumen JSON Anda yang memiliki berbagai nilai dan mendistribusikan volume permintaan secara merata.",
"sqlPartitionKeyTooltipSuffix": " Untuk beban kerja baca berat atau beban kerja tulis berat yang kecil dengan ukuran apa pun, id sering menjadi pilihan yang baik.",
"partitionKeySubtext": "Untuk beban kerja kecil, ID item adalah pilihan yang cocok untuk kunci partisi.",
"mongoPlaceholder": "misalnya, categoryId",
"gremlinPlaceholder": "misalnya, /address",
"sqlFirstPartitionKey": "Wajib - kunci partisi pertama misalnya, /TenantId",
"sqlSecondPartitionKey": "kunci partisi kedua misalnya, /UserId",
"sqlThirdPartitionKey": "kunci partisi ketiga misalnya, /SessionId",
"defaultPlaceholder": "misalnya /address/zipCode"
},
"costEstimate": {
"title": "Perkiraan biaya*",
"howWeCalculate": "Cara menghitung",
"updatedCostPerMonth": "Biaya per bulan yang baru",
"currentCostPerMonth": "Biaya per bulan saat ini",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "RU/dtk maks skala otomatis awal akan ditentukan oleh sistem, berdasarkan pengaturan throughput manual saat ini dan penyimpanan sumber daya Anda. Setelah skala otomatis diaktifkan, Anda dapat mengubah maksimum RU/dtk.",
"ttlWarningText": "Sistem akan secara otomatis menghapus item berdasarkan nilai TTL (dalam detik) yang Anda berikan, tanpa perlu operasi penghapusan yang dikeluarkan secara eksplisit oleh aplikasi klien. Untuk informasi selengkapnya, lihat,",
"ttlWarningLinkText": "Masa Pakai (TTL) di Azure Cosmos DB",
"unsavedIndexingPolicy": "kebijakan pengindeksan",
"unsavedDataMaskingPolicy": "kebijakan penyembunyian data",
"unsavedComputedProperties": "properti terkomputasi",
"unsavedEditorWarningPrefix": "Anda belum menyimpan perubahan terbaru yang dibuat di",
"unsavedEditorWarningSuffix": ". Klik simpan untuk mengonfirmasi perubahan.",
"updateDelayedApplyWarning": "Anda akan meminta penambahan throughput di atas kapasitas yang dialokasikan sebelumnya. Operasi ini akan memakan waktu beberapa saat.",
"scalingUpDelayMessage": "Penskalaan akan memakan waktu 4-6 jam karena melebihi apa yang dapat langsung didukung Azure Cosmos DB berdasarkan jumlah partisi fisik Anda. Anda dapat menaikkan throughput untuk {{instantMaximumThroughput}} langsung atau melanjutkan dengan nilai ini dan menunggu hingga peningkatan skala selesai.",
"exceedPreAllocatedMessage": "Permintaan Anda untuk menambah throughput melebihi kapasitas yang dialokasikan sebelumnya yang mungkin memerlukan waktu lebih lama dari yang diharapkan. Ada tiga opsi yang dapat Anda pilih untuk melanjutkan:",
"instantScaleOption": "Anda dapat langsung menaikkan skala hingga {{instantMaximumThroughput}} RU/dtk.",
"asyncScaleOption": "Anda dapat menaikkan skala secara asinkron ke nilai apa pun di bawah {{maximumThroughput}} RU/dtk dalam 4-6 jam.",
"quotaMaxOption": "Maksimum kuota Anda saat ini adalah {{maximumThroughput}} RU/dtk. Untuk menambah di atas batas ini, Anda harus mengajukan permintaan penambahan kuota dan tim Azure Cosmos DB akan meninjaunya.",
"belowMinimumMessage": "Anda tidak dapat menurunkan throughput di bawah minimum {{minimum}} RU/dtk saat ini. Untuk informasi selengkapnya tentang batas ini, lihat dokumentasi kutipan layanan kami.",
"saveThroughputWarning": "Tagihan Anda akan terpengaruh jika Anda memperbarui pengaturan throughput. Periksa perkiraan biaya yang baru di bawah ini sebelum menyimpan perubahan Anda",
"currentAutoscaleThroughput": "Throughput skala otomatis saat ini:",
"targetAutoscaleThroughput": "Throughput skala otomatis target:",
"currentManualThroughput": "Throughput manual saat ini:",
"targetManualThroughput": "Throughput manual target:",
"applyDelayedMessage": "Permintaan untuk menambah throughput berhasil dikirimkan. Operasi ini akan memakan waktu 1-3 hari kerja. Tampilkan status terbaru di Pemberitahuan.",
"databaseLabel": "Database:",
"containerLabel": "Kontainer:",
"applyShortDelayMessage": "Permintaan untuk menambah throughput saat ini sedang berlangsung. Operasi ini akan memakan waktu beberapa saat.",
"applyLongDelayMessage": "Permintaan untuk menambah throughput saat ini sedang berlangsung. Operasi ini akan memakan waktu 1-3 hari kerja. Tampilkan status terbaru di Pemberitahuan.",
"throughputCapError": "Akun Anda saat ini dikonfigurasi dengan total batas throughput {{throughputCap}} RU/dtk. Pembaruan ini tidak dapat dilakukan karena akan menaikkan total throughput menjadi {{newTotalThroughput}} RU/dtk. Ubah total batas throughput di manajemen biaya.",
"throughputIncrementError": "Kenaikan nilai throughput harus dalam kelipatan 1000"
},
"conflictResolution": {
"lwwDefault": "Last Write Wins (default)",
"customMergeProcedure": "Prosedur Penggabungan (kustom)",
"mode": "Mode",
"conflictResolverProperty": "Properti Pemecah Konflik",
"storedProcedure": "Prosedur tersimpan",
"lwwTooltip": "Mengambil atau mengatur nama properti bilangan bulat dalam dokumen Anda yang digunakan untuk skema resolusi konflik berbasis Last Write Wins (LWW). Secara default, sistem menggunakan properti stempel waktu yang ditentukan sistem, _ts untuk memutuskan pemenang untuk versi dokumen yang berkonflik. Tentukan properti bilangan bulat Anda sendiri jika Anda ingin menimpa resolusi konflik berbasis stempel waktu default.",
"customTooltip": "Mengambil atau mengatur nama prosedur tersimpan (alias prosedur penggabungan) untuk mengatasi konflik. Anda dapat menulis logika yang ditentukan aplikasi untuk menentukan pemenang versi dokumen yang berkonflik. Prosedur tersimpan akan dijalankan secara transaksi, tepat satu kali, di sisi server. Jika Anda tidak memberikan prosedur tersimpan, konflik akan diisi di",
"customTooltipConflictsFeed": " umpan konflik",
"customTooltipSuffix": ". Anda dapat memperbarui/mendaftarkan ulang prosedur tersimpan kapan saja."
},
"changeFeed": {
"label": "Ubah kebijakan penyimpanan log umpan",
"tooltip": "Memungkinkan kebijakan retensi log umpan perubahan untuk menyimpan riwayat item dalam kontainer hingga 10 menit terakhir secara default. Untuk mendukung hal ini, biaya unit permintaan (RU) untuk kontainer ini akan dikalikan dua untuk penulisan. Pembacaan tidak terpengaruh."
},
"mongoIndexing": {
"disclaimer": "Untuk kueri yang memfilter beberapa properti, buat beberapa indeks bidang tunggal, daripada indeks gabungan.",
"disclaimerCompoundIndexesLink": " Indeks gabungan ",
"disclaimerSuffix": "hanya digunakan untuk mengurutkan hasil kueri. Jika perlu menambahkan indeks gabungan, Anda dapat membuatnya menggunakan shell Mongo.",
"compoundNotSupported": "Koleksi dengan indeks gabungan belum didukung di editor pengindeksan. Untuk mengubah kebijakan pengindeksan untuk koleksi ini, gunakan Mongo Shell.",
"aadError": "Untuk menggunakan editor kebijakan pengindeksan, masuk ke",
"aadErrorLink": "portal azure.",
"refreshingProgress": "Menyegarkan kemajuan transformasi indeks",
"canMakeMoreChangesZero": "Anda dapat membuat perubahan pengindeksan lainnya setelah transformasi indeks saat ini selesai. ",
"refreshToCheck": "Refresh untuk memeriksa apakah telah selesai.",
"canMakeMoreChangesProgress": "Anda dapat membuat perubahan pengindeksan lainnya setelah transformasi indeks saat ini selesai. Proses telah selesai {{progress}}%. ",
"refreshToCheckProgress": "Refresh untuk memeriksa kemajuan.",
"definitionColumn": "Definisi",
"typeColumn": "Tipe",
"dropIndexColumn": "Drop indeks",
"addIndexBackColumn": "Tambahkan indeks kembali",
"deleteIndexButton": "Tombol Hapus Indeks",
"addBackIndexButton": "Tombol Tambahkan Kembali Indeks",
"currentIndexes": "Indeks saat ini",
"indexesToBeDropped": "Indeks yang akan didrop",
"indexFieldName": "Nama Bidang Indeks",
"indexType": "Tipe Indeks",
"selectIndexType": "Pilih tipe indeks",
"undoButton": "Tombol Batalkan"
},
"subSettings": {
"timeToLive": "Masa Pakai",
"ttlOff": "Nonaktif",
"ttlOnNoDefault": "Aktif (tidak ada default)",
"ttlOn": "Pada",
"seconds": "detik",
"timeToLiveInSeconds": "Masa pakai dalam detik",
"analyticalStorageTtl": "Masa Pakai Penyimpanan Analitik",
"geospatialConfiguration": "Konfigurasi Geospasial",
"geography": "Geografi",
"geometry": "Geometri",
"uniqueKeys": "Kunci unik",
"mongoTtlMessage": "Untuk mengaktifkan masa pakai (TTL) untuk koleksi/dokumen Anda,",
"mongoTtlLinkText": "buat indeks TTL",
"partitionKeyTooltipTemplate": "{{partitionKeyName}} ini digunakan untuk mendistribusikan data ke beberapa partisi untuk skalabilitas. Nilai \"{{partitionKeyValue}}\" menentukan bagaimana dokumen dipartisi.",
"largePartitionKeyEnabled": "{{partitionKeyName}} besar telah diaktifkan.",
"hierarchicalPartitioned": "Kontainer yang dipartisi secara hierarkis.",
"nonHierarchicalPartitioned": "Kontainer yang tidak dipartisi secara hierarki."
},
"scale": {
"freeTierInfo": "Dengan tingkat gratis, Anda akan mendapatkan {{ru}} RU/dtk pertama dan penyimpanan {{storage}} GB di akun ini secara gratis. Agar akun Anda tetap gratis, simpan total RU di semua sumber daya di akun ke {{ru}} RU.",
"freeTierLearnMore": "Pelajari selengkapnya.",
"throughputRuS": "Throughput (RU/dtk)",
"autoScaleCustomSettings": "Akun Anda memiliki pengaturan kustom yang mencegah pengaturan throughput pada tingkat kontainer. Diskusikan dengan titik kontak tim rekayasawan Cosmos DB Anda untuk membuat perubahan.",
"keyspaceSharedThroughput": "Throughput bersama tabel ini dikonfigurasi di keyspace",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Ubah {{partitionKeyName}}",
"currentPartitionKey": "{{partitionKeyName}} saat Ini",
"partitioning": "Pemartisian",
"hierarchical": "Hierarkis",
"nonHierarchical": "Non-hierarkis",
"safeguardWarning": "Untuk melindungi integritas data yang disalin ke kontainer baru, pastikan tidak ada pembaruan yang dibuat ke kontainer sumber selama seluruh durasi proses perubahan kunci partisi.",
"changeDescription": "Untuk mengubah kunci partisi, kontainer tujuan baru harus dibuat atau kontainer tujuan yang sudah ada dipilih. Data kemudian akan disalin ke kontainer tujuan.",
"changeButton": "Ubah",
"changeJob": "{{partitionKeyName}} mengubah tugas",
"cancelButton": "Batal",
"documentsProcessed": "({{processedCount}} dari {{totalCount}} dokumen diproses)"
},
"computedProperties": {
"ariaLabel": "Properti terkomputasi",
"learnMorePrefix": "tentang cara menentukan properti terkomputasi dan cara menggunakannya."
},
"indexingPolicy": {
"ariaLabel": "Kebijakan Pengindeksan"
},
"dataMasking": {
"ariaLabel": "Kebijakan Penyembunyian Data",
"validationFailed": "Validasi gagal:",
"includedPathsRequired": "includedPaths diperlukan",
"includedPathsMustBeArray": "includedPaths harus berupa array",
"excludedPathsMustBeArray": "excludedPaths harus berupa array jika diberikan"
},
"containerPolicy": {
"vectorPolicy": "Kebijakan Vektor",
"fullTextPolicy": "Kebijakan Teks Lengkap",
"createFullTextPolicy": "Buat kebijakan pencarian teks lengkap baru"
},
"globalSecondaryIndex": {
"indexesDefined": "Kontainer ini memiliki indeks yang ditentukan untuknya sebagai berikut.",
"learnMoreSuffix": "tentang cara menentukan indeks sekunder global dan cara menggunakannya.",
"jsonAriaLabel": "JSON Indeks Sekunder Global",
"addIndex": "Tambahkan indeks",
"settingsTitle": "Pengaturan Indeks Sekunder Global",
"sourceContainer": "Kontainer sumber",
"indexDefinition": "Definisi indeks sekunder global"
},
"indexingPolicyRefresh": {
"refreshFailed": "Penyegaran kemajuan transformasi indeks gagal"
},
"throughputInput": {
"autoscale": "Penskalaan otomatis",
"manual": "Manual",
"minimumRuS": "RU/dtk minimum",
"maximumRuS": "RU/dtk maksimum",
"x10Equals": "x 10 =",
"storageCapacity": "Kapasitas penyimpanan",
"fixed": "Tetap",
"unlimited": "Tidak terbatas",
"instant": "Instan",
"fourToSixHrs": "4-6 jam",
"autoscaleDescription": "Berdasarkan penggunaan, throughput {{resourceType}} Anda akan diskalakan dari",
"freeTierWarning": "Tagihan akan berlaku jika Anda menyediakan lebih dari {{ru}} RU/dtk throughput manual, atau jika sumber daya menaikkan skala melebihi {{ru}} RU/dtk dengan penskalaan otomatis.",
"capacityCalculator": "Perkirakan RU/dtk yang Anda perlukan dengan",
"capacityCalculatorLink": " kalkulator kapasitas",
"fixedStorageNote": "Jika menggunakan koleksi dengan kapasitas penyimpanan tetap, Anda dapat menyiapkan hingga 10.000 RU/dtk.",
"min": "min",
"max": "maks"
},
"throughputBuckets": {
"label": "Wadah Throughput",
"bucketLabel": "Wadah {{id}}",
"dataExplorerQueryBucket": " (Wadah Kueri Data Explorer)",
"active": "Aktif",
"inactive": "Tidak aktif"
}
}
}
}

View File

@@ -0,0 +1,2 @@
export { Keys } from "./Keys.generated";
export { t } from "./t";

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,9 @@
"upload": "업로드",
"connect": "연결",
"remove": "제거",
"load": "로드",
"publish": "게시",
"browse": "찾아보기",
"increaseValueBy1": "값을 1만큼 늘리기",
"decreaseValueBy1": "값을 1만큼 줄이기"
},
@@ -291,5 +294,675 @@
"errorCreateContainer": "컨테이너를 만들지 못했습니다. {{error}}",
"errorImportData": "데이터를 가져오지 못했습니다. {{error}}"
}
},
"contextMenu": {
"newContainer": "새 {{containerName}}",
"restoreContainer": "{{containerName}} 복원",
"deleteDatabase": "{{databaseName}} 삭제",
"deleteContainer": "{{containerName}} 삭제",
"newSqlQuery": "새 SQL 쿼리",
"newQuery": "새 쿼리",
"openMongoShell": "Mongo Shell 열기",
"newShell": "새 셸",
"openCassandraShell": "Cassandra Shell 열기",
"newStoredProcedure": "새 저장 프로시저",
"newUdf": "새 UDF",
"newTrigger": "새 트리거",
"deleteStoredProcedure": "저장 프로시저 삭제",
"deleteTrigger": "트리거 삭제",
"deleteUdf": "사용자 정의 함수 삭제"
},
"tabs": {
"documents": {
"newItem": "새 항목",
"newDocument": "새 문서",
"uploadItem": "항목 업로드",
"applyFilter": "필터 적용",
"unsavedChanges": "저장되지 않은 변경 내용",
"unsavedChangesMessage": "저장하지 않은 변경 내용이 손실됩니다. 계속하시겠습니까?",
"createDocumentFailed": "문서 만들기 실패",
"updateDocumentFailed": "문서 업데이트 실패",
"documentDeleted": "문서를 삭제했습니다.",
"deleteDocumentDialogTitle": "문서 삭제",
"deleteDocumentsDialogTitle": "문서 삭제",
"throttlingError": "트래픽률 제한 오류로 인해 일부 문서 삭제에 실패했습니다. 나중에 다시 시도하세요. 앞으로 이런 일이 없도록 컨테이너나 데이터베이스의 처리량을 늘려 보세요.",
"deleteFailed": "문서 삭제 실패({{error}})",
"missingShardProperty": "문서에 분할 속성이 없습니다. {{partitionKeyProperty}}",
"refreshGridFailed": "문서 그리드 새로 고침 실패",
"confirmDelete": "{{documentName}}을(를) 삭제하시겠습니까?",
"confirmDeleteTitle": "삭제 확인",
"selectedItems": "선택한 항목 {{count}}개",
"selectedItem": "선택한 항목",
"selectedDocuments": "선택한 문서 {{count}}개",
"selectedDocument": "선택한 문서",
"deleteDocumentFailedLog": "문서 {{documentId}}개 삭제 실패(상태 코드 {{statusCode}})",
"deleteSuccessLog": "문서 {{count}}개를 삭제함",
"deleteThrottledLog": "\"요청이 너무 큽니다\"(429) 오류로 인해 문서 {{count}}개를 삭제하지 못했습니다. 다시 시도하는 중...",
"missingShardKeyLog": "새 문서 저장에 실패했습니다. 문서 분할 키가 정의되어 있지 않습니다.",
"filterTooltip": "쿼리 조건을 입력하거나 목록에서 하나를 선택하세요.",
"loadMore": "더 많이 로드",
"documentEditor": "문서 편집기",
"savedFilters": "저장된 필터",
"defaultFilters": "기본 필터",
"abort": "중단",
"deletingDocuments": "문서 {{count}}개를 삭제하는 중",
"deletedDocumentsSuccess": "문서 {{count}}개를 삭제했습니다.",
"deleteAborted": "문서 삭제를 중단했습니다.",
"failedToDeleteDocuments": "문서 {{count}}개를 삭제하지 못했습니다.",
"requestTooLargeBase": "\"요청이 너무 큼\" 예외(429)로 인해 일부 삭제 요청이 실패했습니다.",
"retriedSuccessfully": "하지만 다시 시도하여 성공했습니다.",
"retryingNow": "지금 다시 시도 중입니다.",
"increaseThroughputTip": "앞으로 이런 일이 없도록 컨테이너나 데이터베이스의 처리량을 늘려 보세요.",
"numberOfSelectedDocuments": "선택한 문서 수: {{count}}개",
"mongoFilterPlaceholder": "쿼리 조건자(예: {\"id\":\"foo\"})를 입력하거나 드롭다운 목록에서 하나를 선택하거나, 모든 문서를 쿼리하려면 비워두세요.",
"sqlFilterPlaceholder": "쿼리 조건자(예: WHERE c.id=\"1\")를 입력하거나 드롭다운 목록에서 하나를 선택하거나, 모든 문서를 쿼리하려면 비워두세요.",
"error": "오류",
"warning": "경고"
},
"query": {
"executeQuery": "쿼리 실행",
"executeSelection": "선택 영역 실행",
"saveQuery": "쿼리 저장",
"downloadQuery": "쿼리 다운로드",
"cancelQuery": "쿼리 취소",
"openSavedQueries": "저장된 쿼리 열기",
"vertical": "수직",
"horizontal": "수평",
"view": "보기",
"editingQuery": "쿼리를 편집하는 증"
},
"storedProcedure": {
"id": "저장 프로시저 ID",
"idPlaceholder": "새 저장 프로시저 ID 입력",
"idAriaLabel": "저장 프로시저 ID",
"body": "저장 프로시저 본문",
"bodyAriaLabel": "저장 프로시저 본문",
"successfulExecution": "저장 프로시저 실행 성공",
"resultAriaLabel": "저장 프로시저 결과 실행",
"logsAriaLabel": "저장 프로시저 로그 실행",
"errors": "오류:",
"errorDetailsAriaLabel": "오류 세부 정보 링크",
"moreDetails": "추가 세부 정보",
"consoleLogTab": "console.log"
},
"trigger": {
"id": "트리거 ID",
"idPlaceholder": "새 트리거 ID 입력",
"type": "트리거 유형",
"operation": "트리거 작업",
"body": "트리거 본문",
"bodyAriaLabel": "트리거 본문",
"pre": "사전",
"post": "게시",
"all": "모두",
"operationCreate": "만들기",
"operationDelete": "삭제",
"operationReplace": "바꾸기"
},
"udf": {
"id": "사용자 정의 함수 ID",
"idPlaceholder": "새 사용자 정의 함수 ID 입력",
"body": "사용자 정의 함수 본문",
"bodyAriaLabel": "사용자 정의 함수 본문"
},
"conflicts": {
"unsavedChanges": "저장되지 않은 변경 내용",
"changesWillBeLost": "모든 변경 내용이 손실됩니다. 계속하시겠습니까?",
"resolveConflictFailed": "충돌 확인에 실패했습니다.",
"deleteConflictFailed": "충돌 삭제 실패",
"refreshGridFailed": "문서 그리드 새로 고침 실패"
},
"mongoShell": {
"title": "Mongo Shell"
}
},
"panes": {
"deleteDatabase": {
"panelTitle": "{{databaseName}} 삭제",
"warningMessage": "경고! 수행하려는 작업은 실행 취소할 수 없습니다. 계속하면 이 리소스와 모든 자식 리소스가 영구적으로 삭제됩니다.",
"confirmPrompt": "{{databaseName}} ID(이름)를 입력하여 확인",
"inputMismatch": "입력한 {{databaseName}} 이름 \"{{input}}\"이(가) 선택한 {{databaseName}} \"{{selectedId}}\"와(과) 일치하지 않습니다.",
"feedbackTitle": "Azure Cosmos DB 개선에 도움을 주세요!",
"feedbackReason": "이 {{databaseName}}을(를) 삭제하는 이유는 무엇인가요?"
},
"deleteCollection": {
"panelTitle": "{{collectionName}} 삭제",
"confirmPrompt": "{{collectionName}} ID를 입력하여 확인하세요",
"inputMismatch": "입력한 ID {{input}}이(가) 선택한 {{selectedId}}와(과) 일치하지 않습니다.",
"feedbackTitle": "Azure Cosmos DB 개선에 도움을 주세요!",
"feedbackReason": "이 {{collectionName}}을(를) 삭제하는 이유가 무엇인가요?"
},
"addDatabase": {
"databaseLabel": "데이터베이스 {{suffix}}",
"databaseIdLabel": "데이터베이스 ID",
"keyspaceIdLabel": "키스페이스 ID",
"databaseIdPlaceholder": "새 {{databaseLabel}} ID 입력",
"databaseTooltip": "{{databaseLabel}}은(는) 하나 이상의 {{collectionsLabel}} 논리 컨테이너입니다.",
"shareThroughput": "{{collectionsLabel}} 전체에서 처리량 공유",
"shareThroughputTooltip": "{{databaseLabel}} 수준에서 프로비전된 처리량은 {{databaseLabel}} 내의 모든 {{collectionsLabel}}에서 공유됩니다.",
"greaterThanError": "autopilot 처리량에 대해 {{minValue}} 보다 큰 값을 입력하세요.",
"acknowledgeSpendError": "예상 {{period}} 지출을 확인하세요.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "새로 만들기",
"useExisting": "기존 항목 사용",
"databaseTooltip": "데이터베이스는 네임스페이스와 유사합니다. 데이터베이스는 {{collectionName}} 집합을 관리하는 단위입니다.",
"shareThroughput": "{{collectionName}}의 처리량 공유",
"shareThroughputTooltip": "데이터베이스 수준에서 구성된 처리량은 데이터베이스 내 모든 {{collectionName}}에서 공유됩니다.",
"collectionIdLabel": "{{collectionName}} ID",
"collectionIdTooltip": "{{collectionName}}의 고유 식별자이며 REST 및 모든 SDK를 통해 ID 기반 라우팅에 사용됩니다.",
"collectionIdPlaceholder": "e.g., {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} ID, 예제 {{collectionName}}1",
"existingDatabaseAriaLabel": "기존 {{databaseName}} ID 선택",
"existingDatabasePlaceholder": "기존 {{databaseName}} ID 선택",
"indexing": "인덱싱",
"turnOnIndexing": "인덱싱 켜기",
"automatic": "자동",
"turnOffIndexing": "인덱싱 끄기",
"off": "끄기",
"sharding": "분할",
"shardingTooltip": "분할된 컬렉션은 데이터를 여러 복제본 집합(샤드)에 분산하여 무제한 확장성을 제공합니다. 분할된 컬렉션을 사용하려면 데이터를 고르게 분산할 샤드 키(필드)를 선택해야 합니다.",
"unsharded": "분할되지 않음",
"unshardedLabel": "분할되지 않음(20GB 제한)",
"sharded": "분할됨",
"addPartitionKey": "계층형 파티션 키 추가",
"hierarchicalPartitionKeyInfo": "이 기능을 사용하면 최대 3단계 키로 데이터를 분할해 데이터 분포를 개선할 수 있습니다. .NET V3, Java V4 SDK 또는 미리 보기 JavaScript V3 SDK가 필요합니다.",
"provisionDedicatedThroughput": "이 {{collectionName}}에 대한 전용 처리량 프로비전",
"provisionDedicatedThroughputTooltip": "필요에 따라 처리량이 프로비전된 데이터베이스 내의 {{collectionName}}에 대한 전용 처리량을 프로비전할 수 있습니다. 이 전용 처리량은 데이터베이스의 다른 {{collectionNamePlural}} 공유되지 않으며 데이터베이스에 대해 프로비전한 처리량에 포함되지 않습니다. 이 처리량은 데이터베이스 수준에서 프로비전한 처리량 외에도 요금이 청구됩니다.",
"uniqueKeysPlaceholderMongo": "쉼표로 구분된 경로(예: firstName,address.zipCode)",
"uniqueKeysPlaceholderSql": "쉼표로 구분된 경로 예: /firstName,/address/zipCode",
"addUniqueKey": "고유 키 추가",
"enableAnalyticalStore": "분석 저장소 사용",
"disableAnalyticalStore": "분석 저장소 사용 안 함",
"on": "켜기",
"analyticalStoreSynapseLinkRequired": "분석 저장소 {{collectionName}}을(를) 만들려면 Azure Synapse Link가 필요합니다. 이 Cosmos DB 계정에서 Synapse Link를 사용하도록 설정하세요.",
"enable": "활성화",
"containerVectorPolicy": "컨테이너 벡터 정책",
"containerFullTextSearchPolicy": "컨테이너 전체 텍스트 검색 정책",
"advanced": "고급",
"mongoIndexingTooltip": "_id 필드는 기본적으로 인덱싱됩니다. 모든 필드에 와일드카드 인덱스를 생성하면 쿼리가 최적화되어 개발에 권장됩니다.",
"createWildcardIndex": "모든 필드에 와일드카드 인덱스 만들기",
"legacySdkCheckbox": "내 애플리케이션은 이전 Cosmos .NET 또는 Java SDK 버전(.NET V1 또는 Java V2)을 사용합니다.",
"legacySdkInfo": "이전 SDK와 호환되도록 생성된 컨테이너는 최대 101바이트 크기의 파티션 키 값을 지원하는 레거시 분할 방식을 사용합니다. 이 옵션을 사용하면 계층형 파티션 키를 사용할 수 없습니다.",
"indexingOnInfo": "문서의 모든 속성은 유연하고 효율적인 쿼리를 위해 기본적으로 인덱싱됩니다.",
"indexingOffInfo": "인덱싱이 꺼집니다. 쿼리를 실행하지 않거나 키 값 작업만 하는 경우 권장합니다.",
"indexingOffWarning": "인덱싱이 꺼진 상태로 컨테이너를 만들면 인덱싱 정책을 변경할 수 없습니다. 인덱싱 정책이 있는 컨테이너에서만 인덱싱 변경이 허용됩니다.",
"acknowledgeSpendErrorMonthly": "월별 예상 지출을 확인하세요.",
"acknowledgeSpendErrorDaily": "예상 일별 지출을 확인하세요.",
"unshardedMaxRuError": "분할되지 않은 컬렉션은 최대 10,000RU를 지원합니다.",
"acknowledgeShareThroughputError": "이 전용 처리량의 예상 비용을 확인해 주세요.",
"vectorPolicyError": "컨테이너 벡터 정책의 오류를 수정하세요.",
"fullTextSearchPolicyError": "컨테이너 전체 텍스트 검색 정책의 오류를 수정해 주세요.",
"addingSampleDataSet": "샘플 데이터 세트 추가",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "샤드 키(필드)는 데이터를 여러 복제본 집합(샤드)에 분산해 무제한 확장성을 제공합니다. 데이터를 고르게 분산할 필드를 신중히 선택하는 것이 중요합니다.",
"partitionKeyTooltip": "{{partitionKeyName}} 확장성을 위해 파티션 간에 데이터를 자동으로 분산하는 데 사용됩니다. 다양한 값을 갖고 요청 볼륨을 고르게 분산하는 JSON 문서의 속성을 선택하세요.",
"partitionKeyTooltipSqlSuffix": " 읽기 작업이 적거나 쓰기 작업이 많은 모든 크기의 워크로드에는 id가 좋은 선택입니다.",
"shardKeyLabel": "분할 키",
"partitionKeyLabel": "파티션 키",
"shardKeyPlaceholder": "e.g., categoryId",
"partitionKeyPlaceholderDefault": "예: /address",
"partitionKeyPlaceholderFirst": "필수 - 첫 번째 파티션 키(예: /TenantId)",
"partitionKeyPlaceholderSecond": "두 번째 파티션 키(예: /UserId)",
"partitionKeyPlaceholderThird": "세 번째 파티션 키(예: /SessionId)",
"partitionKeyPlaceholderGraph": "e.g., /address/zipCode",
"uniqueKeysTooltip": "고유 키는 개발자가 데이터베이스에 데이터 무결성 계층을 추가할 수 있게 합니다. 컨테이너 생성 시 고유 키 정책을 설정하면 파티션 키별로 하나 이상의 값이 고유함을 보장합니다.",
"uniqueKeysLabel": "고유 키",
"analyticalStoreLabel": "분석 저장소",
"analyticalStoreTooltip": "트랜잭션 워크로드 성능에 영향을 주지 않고 운영 데이터에 대해 거의 실시간 분석을 수행할 수 있도록 분석 저장소 기능을 사용하도록 설정하세요.",
"analyticalStoreDescription": "트랜잭션 워크로드 성능에 영향을 주지 않고 운영 데이터에 대해 거의 실시간 분석을 수행할 수 있도록 분석 저장소 기능을 사용하도록 설정하세요.",
"vectorPolicyTooltip": "유사성 쿼리에 사용할 수 있도록 벡터가 포함된 데이터 속성을 설명하세요."
},
"settings": {
"pageOptions": "페이지 옵션",
"pageOptionsDescription": "고정된 쿼리 결과 수를 지정하려면 [사용자 지정]을 선택하고, 페이지당 최대 쿼리 결과를 표시하려면 [제한 없음]을 선택하세요.",
"queryResultsPerPage": "페이지당 쿼리 결과",
"queryResultsPerPageTooltip": "페이지당 표시할 쿼리 결과 수를 입력하세요.",
"customQueryItemsPerPage": "페이지당 사용자 지정 쿼리 항목 수",
"custom": "사용자 지정",
"unlimited": "무제한",
"entraIdRbac": "Entra ID RBAC 사용 설정",
"entraIdRbacDescription": "Entra ID RBAC를 자동으로 사용하려면 [자동]을 선택하세요. 강제로 사용하거나 사용하지 않으려면 True/False를 선택하세요.",
"true": "True",
"false": "False",
"regionSelection": "영역 선택",
"regionSelectionDescription": "Cosmos 클라이언트가 계정에 액세스할 때 사용하는 지역을 변경합니다.",
"selectRegion": "지역 선택",
"selectRegionTooltip": "클라이언트 작업에 사용할 계정 끝점을 변경합니다.",
"globalDefault": "전역(기본값)",
"readWrite": "(읽기/쓰기)",
"read": "(읽기)",
"queryTimeout": "쿼리 시간 초과",
"queryTimeoutDescription": "쿼리가 지정된 시간 제한에 도달하면 자동 취소가 설정되어 있지 않은 경우 쿼리를 취소할 수 있는 팝업이 표시됩니다.",
"enableQueryTimeout": "쿼리 제한 시간 사용",
"queryTimeoutMs": "쿼리 시간 제한(밀리초)",
"automaticallyCancelQuery": "시간 초과 시 쿼리 자동 취소",
"ruLimit": "RU 제한",
"ruLimitDescription": "쿼리가 설정된 RU 제한을 초과하면 쿼리가 중단됩니다.",
"enableRuLimit": "RU 제한 사용",
"ruLimitLabel": "RU 제한(RU)",
"defaultQueryResults": "기본 쿼리 결과 보기",
"defaultQueryResultsDescription": "쿼리 결과를 표시할 때 사용할 기본 보기를 선택하세요.",
"retrySettings": "설정 다시 시도",
"retrySettingsDescription": "CosmosDB 쿼리 중 제한된 요청에 적용되는 재시도 정책입니다.",
"maxRetryAttempts": "최대 재시도 횟수",
"maxRetryAttemptsTooltip": "요청에 대해 수행할 최대 재시도 횟수입니다. 기본값 9.",
"fixedRetryInterval": "수정된 재시도 간격(밀리초)",
"fixedRetryIntervalTooltip": "응답에 포함된 retryAfter를 무시하고 각 재시도 사이에 대기하는 고정 재시도 간격(밀리초)입니다. 기본값은 0밀리초입니다.",
"maxWaitTime": "최대 대기 시간(초)",
"maxWaitTimeTooltip": "재시도 중 요청을 대기하는 최대 대기 시간(초)입니다. 기본값은 30초입니다.",
"enableContainerPagination": "컨테이너 페이지 매김 사용 설정",
"enableContainerPaginationDescription": "한 번에 50개의 컨테이너를 로드합니다. 현재 컨테이너는 영숫자 순서로 불러오지 않습니다.",
"enableCrossPartitionQuery": "파티션 간 쿼리 사용 설정",
"enableCrossPartitionQueryDescription": "쿼리를 실행하는 동안 두 개 이상의 요청을 보냅니다. 쿼리가 단일 파티션 키 값으로 제한되지 않은 경우 여러 요청이 필요합니다.",
"maxDegreeOfParallelism": "최대 병렬 처리 수준",
"maxDegreeOfParallelismDescription": "병렬 쿼리 실행 시 클라이언트 쪽에서 동시에 실행되는 작업 수를 가져오거나 설정합니다. 양수 값으로 설정하면 동시 작업 수가 해당 값으로 제한됩니다. 0보다 작게 설정하면 시스템이 자동으로 실행할 동시 작업 수를 결정합니다.",
"maxDegreeOfParallelismQuery": "최대 병렬 처리 수준까지 쿼리",
"priorityLevel": "우선 순위 수준",
"priorityLevelDescription": "Priority-Based 실행 시 Data Explorer의 데이터 평면 요청 우선순위 수준을 설정합니다. \"없음\"을 선택하면 Data Explorer가 우선순위를 지정하지 않고 서버 기본 우선순위가 적용됩니다.",
"displayGremlinQueryResults": "Gremlin 쿼리 결과 표시 방식:",
"displayGremlinQueryResultsDescription": "쿼리 결과를 그래프로 자동 시각화하거나 JSON으로 표시하려면 Graph를 선택하세요.",
"graph": "Graph",
"json": "JSON",
"graphAutoVisualization": "그래프 자동 시각화",
"enableSampleDatabase": "샘플 데이터베이스 사용 설정",
"enableSampleDatabaseDescription": "이 샘플 데이터베이스와 컬렉션은 NoSQL 쿼리를 탐색하는 데 사용할 수 있는 가상 제품 데이터를 포함합니다. Data Explorer UI에 별도의 데이터베이스로 표시되며, Microsoft가 비용 없이 생성하고 유지 관리합니다.",
"enableSampleDbAriaLabel": "쿼리 탐색용 샘플 DB 사용 설정",
"guidRepresentation": "GUID 표현",
"guidRepresentationDescription": "MongoDB의 GuidRepresentation은 BSON 문서에 저장할 때 GUID(전역 고유 식별자)가 직렬화되고 역직렬화되는 방식을 나타냅니다. 모든 문서 작업에 적용됩니다.",
"advancedSettings": "고급 설정",
"ignorePartitionKey": "문서 업데이트 시 파티션 키 무시",
"ignorePartitionKeyTooltip": "선택하면 업데이트 작업 시 파티션 키 값을 사용해 문서를 찾지 않습니다. 비정상적인 파티션 키로 인해 문서 업데이트가 실패할 때만 사용하세요.",
"clearHistory": "기록 지우기",
"clearHistoryConfirm": "계속 진행하시겠습니까?",
"clearHistoryDescription": "이 작업을 수행하면 이 브라우저에서 이 계정에 대한 모든 사용자 지정이 다음을 포함해 지워집니다.",
"clearHistoryTabLayout": "분할기 위치를 포함해 사용자 지정한 탭 레이아웃을 초기화합니다.",
"clearHistoryTableColumns": "사용자 지정 열을 포함해 테이블 열 기본 설정을 지웁니다.",
"clearHistoryFilters": "필터 기록 지우기",
"clearHistoryRegion": "영역 선택을 전역으로 재설정",
"increaseValueBy1000": "1000씩 값 늘리기",
"decreaseValueBy1000": "값을 1000으로 줄입니다.",
"none": "없음",
"low": "낮음",
"high": "높음",
"automatic": "자동",
"enhancedQueryControl": "향상된 쿼리 제어",
"enableQueryControl": "쿼리 제어 사용 설정",
"explorerVersion": "Explorer 버전",
"accountId": "계정 ID",
"sessionId": "세션 ID",
"popupsDisabledError": "브라우저에서 팝업이 차단되어 이 계정에 대한 권한 부여를 설정할 수 없습니다.\n이 사이트에 대해 팝업을 허용한 후 \"Entra ID에 로그인\" 버튼을 클릭하세요.",
"failedToAcquireTokenError": "권한 부여 토큰을 자동으로 가져오지 못했습니다. Entra ID RBAC 작업을 사용하려면 \"Entra ID 로그인\" 버튼을 클릭하세요."
},
"saveQuery": {
"panelTitle": "쿼리 저장",
"setupCostMessage": "규정 준수를 위해 쿼리를 \"{{databaseName}}\"이라는 별도의 데이터베이스 내 Azure Cosmos 계정의 컨테이너에 저장합니다. 계속하려면 계정에 컨테이너를 생성해야 하며, 예상 추가 비용은 하루 $0.77입니다.",
"completeSetup": "설정 완료",
"noQueryNameError": "쿼리 이름이 지정되지 않았습니다.",
"invalidQueryContentError": "잘못된 쿼리 내용이 지정되었습니다.",
"failedToSaveQueryError": "쿼리 {{queryName}}을(를) 저장하지 못했습니다.",
"failedToSetupContainerError": "저장된 쿼리용 컨테이너 설정에 실패했습니다.",
"accountNotSetupError": "쿼리를 저장하지 못했습니다. 계정이 쿼리 저장을 설정하지 않았습니다.",
"name": "이름"
},
"loadQuery": {
"noFileSpecifiedError": "지정된 파일이 없습니다.",
"failedToLoadQueryError": "쿼리를 로드하지 못했습니다.",
"failedToLoadQueryFromFileError": "{{fileName}} 파일에서 쿼리를 불러오지 못했습니다.",
"selectFilesToOpen": "쿼리 문서 선택",
"browseFiles": "찾아보기"
},
"executeStoredProcedure": {
"enterInputParameters": "입력 매개변수 입력(있는 경우)",
"key": "키",
"param": "Param",
"partitionKeyValue": "파티션 키 값",
"value": "값",
"addNewParam": "새 매개변수 추가",
"addParam": "매개 변수 추가",
"deleteParam": "매개변수 삭제",
"invalidParamError": "잘못된 매개 변수를 지정했습니다. {{invalidParam}}",
"invalidParamConsoleError": "잘못된 매개변수가 지정되었습니다. {{invalidParam}}은(는) 올바른 리터럴 값이 아닙니다.",
"stringType": "문자열",
"customType": "사용자 지정"
},
"uploadItems": {
"noFilesSpecifiedError": "파일을 지정하지 않았습니다. 파일을 하나 이상 입력하세요.",
"selectJsonFiles": "JSON Files 선택",
"selectJsonFilesTooltip": "업로드할 JSON 파일을 하나 이상 선택하세요. 각 파일에는 단일 JSON 문서 또는 JSON 문서 배열이 포함될 수 있습니다. 한 번의 업로드 작업에서 모든 파일의 총 크기는 2MB 미만이어야 합니다. 더 큰 데이터 세트는 여러 번에 나누어 업로드할 수 있습니다.",
"fileNameColumn": "파일 이름",
"statusColumn": "상태",
"uploadStatus": "{{numSucceeded}} 생성됨, {{numThrottled}} 제한됨, {{numFailed}} 오류 발생",
"uploadedFiles": "업로드된 파일"
},
"copyNotebook": {
"copyFailedError": "{{name}}을(를) {{destination}}(으)로 복사 실패",
"uploadFailedError": "'{{name}}' 업로드 실패",
"location": "위치",
"locationAriaLabel": "위치",
"selectLocation": "복사할 노트북 위치 선택",
"name": "이름"
},
"publishNotebook": {
"publishFailedError": "{{notebookName}}을(를) 갤러리에 게시하지 못했습니다.",
"publishDescription": "게시하면 이 노트북이 Azure Cosmos DB 노트북 공개 갤러리에 표시됩니다. 게시 전에 민감한 데이터나 출력이 제거되었는지 확인하세요.",
"publishPrompt": "\"{{name}}\"을(를) 게시하고 갤러리에 공유하시겠습니까?",
"coverImage": "커버 이미지",
"coverImageUrl": "표지 이미지 URL",
"name": "이름",
"description": "설명",
"tags": "태그",
"tagsPlaceholder": "선택 태그 1, 선택 태그 2",
"preview": "미리 보기",
"urlType": "URL",
"customImage": "사용자 지정 이미지",
"takeScreenshot": "화면 캡처",
"useFirstDisplayOutput": "첫 번째 디스플레이 출력 사용",
"failedToCaptureOutput": "첫 번째 출력을 캡처하지 못했습니다.",
"outputDoesNotExist": "셀에 대한 출력이 없습니다.",
"failedToConvertError": "{{fileName}}을(를) base64 형식으로 변환하지 못했습니다.",
"failedToUploadError": "{{fileName}} 업로드 실패"
},
"changePartitionKey": {
"failedToStartError": "데이터 전송 작업을 시작하지 못했습니다.",
"suboptimalPartitionKeyError": "경고: 컬렉션이 최적이 아닌 파티션 키를 사용하고 있을 수 있습니다.",
"description": "컨테이너의 파티션 키를 변경하려면 올바른 파티션 키를 가진 대상 컨테이너를 새로 만들어야 합니다. 기존 대상 컨테이너를 선택할 수도 있습니다.",
"sourceContainerId": "원본 {{collectionName}} ID",
"destinationContainerId": "대상 {{collectionName}} ID",
"collectionIdTooltip": "{{collectionName}}의 고유 식별자이며 REST 및 모든 SDK를 통해 ID 기반 라우팅에 사용됩니다.",
"collectionIdPlaceholder": "e.g., {{collectionName}}1",
"collectionIdAriaLabel": "{{collectionName}} ID, 예제 {{collectionName}}1",
"existingContainers": "기존 컨테이너",
"partitionKeyWarning": "대상 컨테이너가 이미 존재하면 안 됩니다. Explorer가 새 대상 컨테이너를 생성합니다."
},
"cassandraAddCollection": {
"keyspaceLabel": "키스페이스 이름",
"keyspaceTooltip": "기존 키스페이스를 선택하거나 새 키스페이스 ID를 입력하세요.",
"tableIdLabel": "테이블을 만들려면 CQL 명령을 입력하세요.",
"enterTableId": "테이블 ID 입력",
"tableSchemaAriaLabel": "테이블 스키마",
"provisionDedicatedThroughput": "이 테이블에 대한 전용 처리량 프로비전",
"provisionDedicatedThroughputTooltip": "키스페이스에 처리량이 프로비전된 경우, 테이블에 전용 처리량을 선택적으로 프로비전할 수 있습니다. 이 전용 처리량은 키스페이스 내 다른 테이블과 공유되지 않으며, 키스페이스에 프로비전한 처리량에 포함되지 않습니다. 이 전용 처리량은 키스페이스 수준에서 프로비전한 처리량과 별도로 청구됩니다."
},
"tables": {
"addProperty": "속성 추가",
"addRow": "행 추가",
"addEntity": "엔터티 추가",
"back": "뒤로",
"nullFieldsWarning": "경고: Null 필드는 편집용으로 표시되지 않습니다.",
"propertyEmptyError": "{{property}}을(를) 비워 둘 수 없습니다. {{property}} 값을 입력하세요.",
"whitespaceError": "{{property}}에 공백을 포함할 수 없습니다. {{property}}에 공백 없이 값을 입력하세요.",
"propertyTypeEmptyError": "속성 형식은 비워 둘 수 없습니다. 속성 {{property}}에 대한 드롭다운에서 형식을 선택하세요."
},
"tableQuerySelect": {
"selectColumns": "쿼리할 열을 선택하세요.",
"availableColumns": "사용 가능한 열"
},
"tableColumnSelection": {
"selectColumns": "컨테이너 항목 보기에서 표시할 열을 선택하세요.",
"searchFields": "검색 필드",
"reset": "다시 설정",
"partitionKeySuffix": " (파티션 키)"
},
"newVertex": {
"addProperty": "속성 추가"
},
"addGlobalSecondaryIndex": {
"globalSecondaryIndexId": "전역 보조 인덱스 컨테이너 ID",
"globalSecondaryIndexIdPlaceholder": "e.g., indexbyEmailId",
"projectionQuery": "프로젝션 쿼리",
"projectionQueryPlaceholder": "SELECT c.email, c.accountId FROM c",
"projectionQueryTooltip": "전역 보조 인덱스 정의에 대해 자세히 알아보세요.",
"disabledTitle": "전역 보조 인덱스가 이미 생성 중입니다. 다른 항목을 만들기 전에 완료되기를 기다려 주세요."
},
"stringInput": {
"inputMismatchError": "입력한 {{input}}이(가) 선택한 {{selectedId}}와(과) 일치하지 않습니다."
},
"panelInfo": {
"information": "정보",
"moreDetails": "추가 세부 정보"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Scale",
"conflictResolution": "Conflict Resolution",
"settings": "Settings",
"indexingPolicy": "Indexing Policy",
"partitionKeys": "Partition Keys",
"partitionKeysPreview": "Partition Keys (preview)",
"computedProperties": "Computed Properties",
"containerPolicies": "Container Policies",
"throughputBuckets": "Throughput Buckets",
"globalSecondaryIndexPreview": "Global Secondary Index (Preview)",
"maskingPolicyPreview": "Masking Policy (preview)"
},
"mongoNotifications": {
"selectTypeWarning": "Please select a type for each index.",
"enterFieldNameError": "Please enter a field name.",
"wildcardPathError": "Wildcard path is not present in the field name. Use a pattern like "
},
"partitionKey": {
"shardKey": "Shard key",
"partitionKey": "Partition key",
"shardKeyTooltip": "샤드 키(필드)는 데이터를 여러 복제본 집합(샤드)에 분산해 무제한 확장성을 제공합니다. 데이터를 고르게 분산할 필드를 신중히 선택하는 것이 중요합니다.",
"partitionKeyTooltip": "is used to automatically distribute data across partitions for scalability. Choose a property in your JSON document that has a wide range of values and evenly distributes request volume.",
"sqlPartitionKeyTooltipSuffix": " 읽기 작업이 적거나 쓰기 작업이 많은 모든 크기의 워크로드에는 id가 좋은 선택입니다.",
"partitionKeySubtext": "For small workloads, the item ID is a suitable choice for the partition key.",
"mongoPlaceholder": "e.g., categoryId",
"gremlinPlaceholder": "e.g., /address",
"sqlFirstPartitionKey": "필수 - 첫 번째 파티션 키(예: /TenantId)",
"sqlSecondPartitionKey": "두 번째 파티션 키(예: /UserId)",
"sqlThirdPartitionKey": "세 번째 파티션 키(예: /SessionId)",
"defaultPlaceholder": "e.g., /address/zipCode"
},
"costEstimate": {
"title": "Cost estimate*",
"howWeCalculate": "How we calculate this",
"updatedCostPerMonth": "Updated cost per month",
"currentCostPerMonth": "Current cost per month",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "The starting autoscale max RU/s will be determined by the system, based on the current manual throughput settings and storage of your resource. After autoscale has been enabled, you can change the max RU/s.",
"ttlWarningText": "The system will automatically delete items based on the TTL value (in seconds) you provide, without needing a delete operation explicitly issued by a client application. For more information see,",
"ttlWarningLinkText": "Time to Live (TTL) in Azure Cosmos DB",
"unsavedIndexingPolicy": "indexing policy",
"unsavedDataMaskingPolicy": "data masking policy",
"unsavedComputedProperties": "computed properties",
"unsavedEditorWarningPrefix": "You have not saved the latest changes made to your",
"unsavedEditorWarningSuffix": ". Please click save to confirm the changes.",
"updateDelayedApplyWarning": "You are about to request an increase in throughput beyond the pre-allocated capacity. This operation will take some time to complete.",
"scalingUpDelayMessage": "Scaling up will take 4-6 hours as it exceeds what Azure Cosmos DB can instantly support currently based on your number of physical partitions. You can increase your throughput to {{instantMaximumThroughput}} instantly or proceed with this value and wait until the scale-up is completed.",
"exceedPreAllocatedMessage": "Your request to increase throughput exceeds the pre-allocated capacity which may take longer than expected. There are three options you can choose from to proceed:",
"instantScaleOption": "You can instantly scale up to {{instantMaximumThroughput}} RU/s.",
"asyncScaleOption": "You can asynchronously scale up to any value under {{maximumThroughput}} RU/s in 4-6 hours.",
"quotaMaxOption": "Your current quota max is {{maximumThroughput}} RU/s. To go over this limit, you must request a quota increase and the Azure Cosmos DB team will review.",
"belowMinimumMessage": "You are not able to lower throughput below your current minimum of {{minimum}} RU/s. For more information on this limit, please refer to our service quote documentation.",
"saveThroughputWarning": "Your bill will be affected as you update your throughput settings. Please review the updated cost estimate below before saving your changes",
"currentAutoscaleThroughput": "Current autoscale throughput:",
"targetAutoscaleThroughput": "Target autoscale throughput:",
"currentManualThroughput": "Current manual throughput:",
"targetManualThroughput": "Target manual throughput:",
"applyDelayedMessage": "The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"databaseLabel": "Database:",
"containerLabel": "Container:",
"applyShortDelayMessage": "A request to increase the throughput is currently in progress. This operation will take some time to complete.",
"applyLongDelayMessage": "A request to increase the throughput is currently in progress. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"throughputCapError": "Your account is currently configured with a total throughput limit of {{throughputCap}} RU/s. This update isn't possible because it would increase the total throughput to {{newTotalThroughput}} RU/s. Change total throughput limit in cost management.",
"throughputIncrementError": "Throughput value must be in increments of 1000"
},
"conflictResolution": {
"lwwDefault": "Last Write Wins (default)",
"customMergeProcedure": "Merge Procedure (custom)",
"mode": "Mode",
"conflictResolverProperty": "Conflict Resolver Property",
"storedProcedure": "Stored procedure",
"lwwTooltip": "Gets or sets the name of a integer property in your documents which is used for the Last Write Wins (LWW) based conflict resolution scheme. By default, the system uses the system defined timestamp property, _ts to decide the winner for the conflicting versions of the document. Specify your own integer property if you want to override the default timestamp based conflict resolution.",
"customTooltip": "Gets or sets the name of a stored procedure (aka merge procedure) for resolving the conflicts. You can write application defined logic to determine the winner of the conflicting versions of a document. The stored procedure will get executed transactionally, exactly once, on the server side. If you do not provide a stored procedure, the conflicts will be populated in the",
"customTooltipConflictsFeed": " conflicts feed",
"customTooltipSuffix": ". You can update/re-register the stored procedure at any time."
},
"changeFeed": {
"label": "Change feed log retention policy",
"tooltip": "Enable change feed log retention policy to retain last 10 minutes of history for items in the container by default. To support this, the request unit (RU) charge for this container will be multiplied by a factor of two for writes. Reads are unaffected."
},
"mongoIndexing": {
"disclaimer": "For queries that filter on multiple properties, create multiple single field indexes instead of a compound index.",
"disclaimerCompoundIndexesLink": " Compound indexes ",
"disclaimerSuffix": "are only used for sorting query results. If you need to add a compound index, you can create one using the Mongo shell.",
"compoundNotSupported": "Collections with compound indexes are not yet supported in the indexing editor. To modify indexing policy for this collection, use the Mongo Shell.",
"aadError": "To use the indexing policy editor, please login to the",
"aadErrorLink": "azure portal.",
"refreshingProgress": "Refreshing index transformation progress",
"canMakeMoreChangesZero": "You can make more indexing changes once the current index transformation is complete. ",
"refreshToCheck": "Refresh to check if it has completed.",
"canMakeMoreChangesProgress": "You can make more indexing changes once the current index transformation has completed. It is {{progress}}% complete. ",
"refreshToCheckProgress": "Refresh to check the progress.",
"definitionColumn": "Definition",
"typeColumn": "Type",
"dropIndexColumn": "Drop Index",
"addIndexBackColumn": "Add index back",
"deleteIndexButton": "Delete index Button",
"addBackIndexButton": "Add back Index Button",
"currentIndexes": "Current index(es)",
"indexesToBeDropped": "Index(es) to be dropped",
"indexFieldName": "Index Field Name",
"indexType": "Index Type",
"selectIndexType": "Select an index type",
"undoButton": "Undo Button"
},
"subSettings": {
"timeToLive": "Time to Live",
"ttlOff": "Off",
"ttlOnNoDefault": "On (no default)",
"ttlOn": "On",
"seconds": "second(s)",
"timeToLiveInSeconds": "Time to live in seconds",
"analyticalStorageTtl": "Analytical Storage Time to Live",
"geospatialConfiguration": "Geospatial Configuration",
"geography": "Geography",
"geometry": "Geometry",
"uniqueKeys": "Unique keys",
"mongoTtlMessage": "To enable time-to-live (TTL) for your collection/documents,",
"mongoTtlLinkText": "create a TTL index",
"partitionKeyTooltipTemplate": "This {{partitionKeyName}} is used to distribute data across multiple partitions for scalability. The value \"{{partitionKeyValue}}\" determines how documents are partitioned.",
"largePartitionKeyEnabled": "Large {{partitionKeyName}} has been enabled.",
"hierarchicalPartitioned": "Hierarchically partitioned container.",
"nonHierarchicalPartitioned": "Non-hierarchically partitioned container."
},
"scale": {
"freeTierInfo": "With free tier, you will get the first {{ru}} RU/s and {{storage}} GB of storage in this account for free. To keep your account free, keep the total RU/s across all resources in the account to {{ru}} RU/s.",
"freeTierLearnMore": "Learn more.",
"throughputRuS": "Throughput (RU/s)",
"autoScaleCustomSettings": "Your account has custom settings that prevents setting throughput at the container level. Please work with your Cosmos DB engineering team point of contact to make changes.",
"keyspaceSharedThroughput": "This table shared throughput is configured at the keyspace",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Change {{partitionKeyName}}",
"currentPartitionKey": "Current {{partitionKeyName}}",
"partitioning": "Partitioning",
"hierarchical": "Hierarchical",
"nonHierarchical": "Non-hierarchical",
"safeguardWarning": "To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to the source container for the entire duration of the partition key change process.",
"changeDescription": "To change the partition key, a new destination container must be created or an existing destination container selected. Data will then be copied to the destination container.",
"changeButton": "Change",
"changeJob": "{{partitionKeyName}} change job",
"cancelButton": "Cancel",
"documentsProcessed": "({{processedCount}} of {{totalCount}} documents processed)"
},
"computedProperties": {
"ariaLabel": "Computed properties",
"learnMorePrefix": "about how to define computed properties and how to use them."
},
"indexingPolicy": {
"ariaLabel": "Indexing Policy"
},
"dataMasking": {
"ariaLabel": "Data Masking Policy",
"validationFailed": "Validation failed:",
"includedPathsRequired": "includedPaths is required",
"includedPathsMustBeArray": "includedPaths must be an array",
"excludedPathsMustBeArray": "excludedPaths must be an array if provided"
},
"containerPolicy": {
"vectorPolicy": "Vector Policy",
"fullTextPolicy": "Full Text Policy",
"createFullTextPolicy": "Create new full text search policy"
},
"globalSecondaryIndex": {
"indexesDefined": "This container has the following indexes defined for it.",
"learnMoreSuffix": "about how to define global secondary indexes and how to use them.",
"jsonAriaLabel": "Global Secondary Index JSON",
"addIndex": "Add index",
"settingsTitle": "Global Secondary Index Settings",
"sourceContainer": "Source container",
"indexDefinition": "Global secondary index definition"
},
"indexingPolicyRefresh": {
"refreshFailed": "Refreshing index transformation progress failed"
},
"throughputInput": {
"autoscale": "Autoscale",
"manual": "Manual",
"minimumRuS": "Minimum RU/s",
"maximumRuS": "Maximum RU/s",
"x10Equals": "x 10 =",
"storageCapacity": "Storage capacity",
"fixed": "Fixed",
"unlimited": "Unlimited",
"instant": "Instant",
"fourToSixHrs": "4-6 hrs",
"autoscaleDescription": "Based on usage, your {{resourceType}} throughput will scale from",
"freeTierWarning": "Billing will apply if you provision more than {{ru}} RU/s of manual throughput, or if the resource scales beyond {{ru}} RU/s with autoscale.",
"capacityCalculator": "Estimate your required RU/s with",
"capacityCalculatorLink": " capacity calculator",
"fixedStorageNote": "When using a collection with fixed storage capacity, you can set up to 10,000 RU/s.",
"min": "min",
"max": "max"
},
"throughputBuckets": {
"label": "Throughput Buckets",
"bucketLabel": "Bucket {{id}}",
"dataExplorerQueryBucket": " (Data Explorer Query Bucket)",
"active": "Active",
"inactive": "Inactive"
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -29,6 +29,9 @@
"upload": "Przekaż",
"connect": "Połącz",
"remove": "Usuń",
"load": "Załaduj",
"publish": "Publikuj",
"browse": "Przeglądaj",
"increaseValueBy1": "Zwiększ wartość o 1",
"decreaseValueBy1": "Zmniejsz wartość o 1"
},
@@ -291,5 +294,675 @@
"errorCreateContainer": "Nie można utworzyć kontenera: {{error}}",
"errorImportData": "Nie można zaimportować danych: {{error}}"
}
},
"contextMenu": {
"newContainer": "Nowy element {{containerName}}",
"restoreContainer": "Przywróć {{containerName}}",
"deleteDatabase": "Usuń {{databaseName}}",
"deleteContainer": "Usuń {{containerName}}",
"newSqlQuery": "Nowe zapytanie SQL",
"newQuery": "Nowe zapytanie",
"openMongoShell": "Otwórz powłokę Mongo",
"newShell": "Nowa powłoka",
"openCassandraShell": "Otwórz powłokę Cassandra",
"newStoredProcedure": "Nowa procedura składowana",
"newUdf": "Nowa funkcja UDF",
"newTrigger": "Nowy wyzwalacz",
"deleteStoredProcedure": "Usuń procedurę składowaną",
"deleteTrigger": "Usuń wyzwalacz",
"deleteUdf": "Usuń funkcję zdefiniowaną przez użytkownika"
},
"tabs": {
"documents": {
"newItem": "Nowy element",
"newDocument": "Nowy dokument",
"uploadItem": "Przekaż element",
"applyFilter": "Zastosuj filtr",
"unsavedChanges": "Niezapisane zmiany",
"unsavedChangesMessage": "Wszystkie niezapisane zmiany zostaną utracone. Czy chcesz kontynuować?",
"createDocumentFailed": "Tworzenie dokumentu nie powiodło się",
"updateDocumentFailed": "Aktualizacja dokumentu nie powiodła się",
"documentDeleted": "Dokument został pomyślnie usunięty.",
"deleteDocumentDialogTitle": "Usuń dokument",
"deleteDocumentsDialogTitle": "Usuń dokumenty",
"throttlingError": "Nie można usunąć niektórych dokumentów z powodu błędu ograniczenia szybkości. Spróbuj ponownie później. Aby temu zapobiec w przyszłości, rozważ zwiększenie przepustowości kontenera lub bazy danych.",
"deleteFailed": "Usuwanie dokumentów nie powiodło się ({{error}})",
"missingShardProperty": "W dokumencie brakuje właściwości fragmentu: {{partitionKeyProperty}}",
"refreshGridFailed": "Nie udało się odświeżyć siatki dokumentów",
"confirmDelete": "Czy na pewno chcesz usunąć {{documentName}}?",
"confirmDeleteTitle": "Potwierdź usunięcie",
"selectedItems": "zaznaczone elementy ({{count}})",
"selectedItem": "wybrany element",
"selectedDocuments": "wybrane dokumenty ({{count}})",
"selectedDocument": "wybrany dokument",
"deleteDocumentFailedLog": "Nie można usunąć dokumentu {{documentId}} z kodem stanu {{statusCode}}",
"deleteSuccessLog": "Pomyślnie usunięto dokumenty ({{count}})",
"deleteThrottledLog": "Nie można usunąć dokumentów ({{count}}) z powodu błędu „Żądanie zbyt duże” (429). Trwa ponawianie próby...",
"missingShardKeyLog": "Nie udało się zapisać nowego dokumentu: nie zdefiniowano klucza fragmentu dokumentu",
"filterTooltip": "Wpisz predykat zapytania lub wybierz go z listy.",
"loadMore": "Załaduj więcej",
"documentEditor": "Edytor dokumentów",
"savedFilters": "Zapisane filtry",
"defaultFilters": "Domyślne filtry",
"abort": "Przerwij",
"deletingDocuments": "Usuwanie dokumentów ({{count}})",
"deletedDocumentsSuccess": "Pomyślnie usunięto dokumenty ({{count}}).",
"deleteAborted": "Usuwanie dokumentów zostało przerwane.",
"failedToDeleteDocuments": "Nie można usunąć dokumentów ({{count}}).",
"requestTooLargeBase": "Niektóre żądania usunięcia nie powiodły się z powodu wyjątku „Żądanie za duże” (429)",
"retriedSuccessfully": "ale pomyślnie ponowiono próbę.",
"retryingNow": "Ponawianie próby teraz.",
"increaseThroughputTip": "Aby temu zapobiec w przyszłości, rozważ zwiększenie przepustowości kontenera lub bazy danych.",
"numberOfSelectedDocuments": "Liczba wybranych dokumentów: {{count}}",
"mongoFilterPlaceholder": "Wpisz predykat zapytania (np. {\"id\":\"foo\"}), wybierz go z listy rozwijanej lub pozostaw pusty, aby zapytać o wszystkie dokumenty.",
"sqlFilterPlaceholder": "Wpisz predykat zapytania (np. WHERE c.id=\"1\"), wybierz go z listy rozwijanej lub pozostaw pusty, aby zapytać o wszystkie dokumenty.",
"error": "Błąd",
"warning": "Ostrzeżenie"
},
"query": {
"executeQuery": "Wykonaj zapytanie",
"executeSelection": "Wykonaj zaznaczenie",
"saveQuery": "Zapisz zapytanie",
"downloadQuery": "Pobierz zapytanie",
"cancelQuery": "Anuluj zapytanie",
"openSavedQueries": "Otwórz zapisane zapytania",
"vertical": "W pionie",
"horizontal": "W poziomie",
"view": "Wyświetl",
"editingQuery": "Edytowanie zapytania"
},
"storedProcedure": {
"id": "Identyfikator procedury składowanej",
"idPlaceholder": "Wprowadź nowy identyfikator procedury składowanej",
"idAriaLabel": "Identyfikator procedury składowanej",
"body": "Treść procedury składowanej",
"bodyAriaLabel": "Treść procedury składowanej",
"successfulExecution": "Pomyślne wykonanie procedury składowanej",
"resultAriaLabel": "Wykonaj wynik procedury składowanej",
"logsAriaLabel": "Wykonywanie dzienników procedur składowanej",
"errors": "Błędy:",
"errorDetailsAriaLabel": "Link szczegółów błędu",
"moreDetails": "Więcej szczegółów",
"consoleLogTab": "console.log"
},
"trigger": {
"id": "Identyfikator wyzwalacza",
"idPlaceholder": "Wprowadź nowy identyfikator wyzwalacza",
"type": "Typ wyzwalacza",
"operation": "Operacja wyzwalacza",
"body": "Treść wyzwalacza",
"bodyAriaLabel": "Treść wyzwalacza",
"pre": "Przed operacją",
"post": "Opublikuj",
"all": "Wszystkie",
"operationCreate": "Utwórz",
"operationDelete": "Usuń",
"operationReplace": "Zamień"
},
"udf": {
"id": "Identyfikator funkcji zdefiniowanej przez użytkownika",
"idPlaceholder": "Wprowadź nowy identyfikator funkcji zdefiniowanej przez użytkownika",
"body": "Treść funkcji zdefiniowanej przez użytkownika",
"bodyAriaLabel": "Treść funkcji zdefiniowanej przez użytkownika"
},
"conflicts": {
"unsavedChanges": "Niezapisane zmiany",
"changesWillBeLost": "Zmiany zostaną utracone. Czy chcesz kontynuować?",
"resolveConflictFailed": "Rozwiązywanie konfliktu nie powiodło się",
"deleteConflictFailed": "Usuwanie konfliktu nie powiodło się",
"refreshGridFailed": "Nie udało się odświeżyć siatki dokumentów"
},
"mongoShell": {
"title": "Powłoka Mongo"
}
},
"panes": {
"deleteDatabase": {
"panelTitle": "Usuń {{databaseName}}",
"warningMessage": "Ostrzeżenie! Akcji, którą zamierzasz wykonać, nie można cofnąć. Kontynuowanie spowoduje trwałe usunięcie tego zasobu i wszystkich jego zasobów podrzędnych.",
"confirmPrompt": "Potwierdź, wpisując identyfikator {{databaseName}} (nazwa)",
"inputMismatch": "Nazwa wejściowa {{databaseName}} „{{input}}” nie pasuje do wybranej nazwy {{databaseName}} „{{selectedId}}”",
"feedbackTitle": "Pomóż nam ulepszać usługę Azure Cosmos DB!",
"feedbackReason": "Jaki jest powód usunięcia tego {{databaseName}}?"
},
"deleteCollection": {
"panelTitle": "Usuń {{collectionName}}",
"confirmPrompt": "Potwierdź, wpisując identyfikator {{collectionName}}",
"inputMismatch": "Identyfikator wejściowy {{input}} jest niezgodny z wybranym {{selectedId}}",
"feedbackTitle": "Pomóż nam ulepszać usługę Azure Cosmos DB!",
"feedbackReason": "Jaki jest powód usunięcia tego {{collectionName}}?"
},
"addDatabase": {
"databaseLabel": "Baza danych {{suffix}}",
"databaseIdLabel": "Identyfikator bazy danych",
"keyspaceIdLabel": "Identyfikator przestrzeni kluczy",
"databaseIdPlaceholder": "Wpisz nowy identyfikator {{databaseLabel}}",
"databaseTooltip": "{{databaseLabel}} to logiczny kontener co najmniej jednego {{collectionsLabel}}",
"shareThroughput": "Udostępnij przepływność w usłudze {{collectionsLabel}}",
"shareThroughputTooltip": "Aprowizowana przepływność na poziomie {{databaseLabel}} będzie współdzielona przez wszystkie {{collectionsLabel}} w {{databaseLabel}}.",
"greaterThanError": "Wprowadź wartość większą niż {{minValue}} dla przepływności rozwiązania Autopilot",
"acknowledgeSpendError": "Potwierdź szacowane wydatki {{period}}.",
"acknowledgeSpendErrorMonthly": "Please acknowledge the estimated monthly spend.",
"acknowledgeSpendErrorDaily": "Please acknowledge the estimated daily spend.",
"provisionSharedThroughputTitle": "Provision shared throughput",
"provisionThroughputLabel": "Provision throughput"
},
"addCollection": {
"createNew": "Utwórz nowy",
"useExisting": "Użyj istniejących",
"databaseTooltip": "Baza danych jest odpowiednikiem przestrzeni nazw. To jednostka zarządzania zestawem {{collectionName}}.",
"shareThroughput": "Udostępnij przepływność w usłudze {{collectionName}}",
"shareThroughputTooltip": "Przepływność skonfigurowana na poziomie bazy danych będzie współdzielona przez wszystkie {{collectionName}} w bazie danych.",
"collectionIdLabel": "identyfikator {{collectionName}}",
"collectionIdTooltip": "Identyfikator unikatowy {{collectionName}} używany do routingu opartego na identyfikatorach prowadzącego przez interfejs REST i wszystkie zestawy SDK.",
"collectionIdPlaceholder": "np. {{collectionName}}1",
"collectionIdAriaLabel": "Identyfikator {{collectionName}}, przykład {{collectionName}}1",
"existingDatabaseAriaLabel": "Wybierz istniejący identyfikator {{databaseName}}",
"existingDatabasePlaceholder": "Wybierz istniejący identyfikator {{databaseName}}",
"indexing": "Indeksowanie",
"turnOnIndexing": "Włącz indeksowanie",
"automatic": "Automatyczne",
"turnOffIndexing": "Wyłącz indeksowanie",
"off": "Wyłączone",
"sharding": "Fragmentacja",
"shardingTooltip": "Kolekcje podzielone na fragmenty rozdzielają dane na wiele zestawów replik (fragmentów), aby osiągnąć nieograniczoną skalowalność. Kolekcje fragmentowane wymagają wybrania klucza fragmentu (pola), który równomiernie rozłoży dane.",
"unsharded": "Bez fragmentów",
"unshardedLabel": "Bez fragmentów (limit 20 GB)",
"sharded": "Podzielony na fragmenty",
"addPartitionKey": "Dodaj hierarchiczny klucz partycji",
"hierarchicalPartitionKeyInfo": "Ta funkcja pozwala na partycjonowanie danych z użyciem do trzech poziomów kluczy, co poprawia dystrybucję danych. Wymaga zestawu .NET V3, Java V4 SDK lub wersji zapoznawczej JavaScript V3 SDK.",
"provisionDedicatedThroughput": "Przydziel dedykowaną przepływność dla tego elementu {{collectionName}}",
"provisionDedicatedThroughputTooltip": "Opcjonalnie można aprowizować dedykowaną przepływność dla {{collectionName}} w bazie danych z aprowizowaną przepływnością. Ta dedykowana przepływność nie zostanie udostępniona innym {{collectionNamePlural}} w bazie danych i nie będzie wliczona do przepływności aprowizowanej dla bazy danych. Ta kwota przepływności będzie rozliczana oprócz aprowizowanej przepływności na poziomie bazy danych.",
"uniqueKeysPlaceholderMongo": "Ścieżki rozdzielone przecinkami, np. firstName,address.zipCode",
"uniqueKeysPlaceholderSql": "Ścieżki rozdzielone przecinkami, np. /firstName,/address/zipCode",
"addUniqueKey": "Dodaj unikatowy klucz",
"enableAnalyticalStore": "Włącz magazyn analityczny",
"disableAnalyticalStore": "Wyłącz magazyn analityczny",
"on": "Włączone",
"analyticalStoreSynapseLinkRequired": "Usługa Azure Synapse Link jest wymagana do utworzenia magazynu analitycznego {{collectionName}}. Włącz usługę Synapse Link dla tego konta usługi Cosmos DB.",
"enable": "Włącz",
"containerVectorPolicy": "Zasady wektorów kontenera",
"containerFullTextSearchPolicy": "Zasady pełnotekstowego wyszukiwania kontenera",
"advanced": "Zaawansowane",
"mongoIndexingTooltip": "Pole _id jest domyślnie indeksowane. Utworzenie indeksu wieloznacznego dla wszystkich pól zoptymalizuje zapytania i jest zalecane podczas programowania.",
"createWildcardIndex": "Utwórz indeks symbolu wieloznacznego dla wszystkich pól",
"legacySdkCheckbox": "Moja aplikacja korzysta ze starszej wersji zestawu Cosmos .NET lub Java SDK (.NET V1 lub Java V2)",
"legacySdkInfo": "Aby zapewnić zgodność ze starszymi zestawami SDK, utworzony kontener będzie korzystał ze starszego schematu partycjonowania, który obsługuje wartości klucza partycji o rozmiarze do 101 bajtów. Jeśli ta opcja jest włączona, nie będzie można używać hierarchicznych kluczy partycji.",
"indexingOnInfo": "Wszystkie właściwości w dokumentach będą domyślnie indeksowane, co umożliwia elastyczne i wydajne zapytania.",
"indexingOffInfo": "Indeksowanie zostanie wyłączone. Zalecane, jeśli nie musisz uruchamiać zapytań lub wykonujesz tylko operacje na wartościach klucza.",
"indexingOffWarning": "Tworząc ten kontener z wyłączonym indeksowaniem, nie będziesz mógł wprowadzać zmian w polityce indeksowania. Zmiany indeksowania są dozwolone tylko w kontenerze z zasadami indeksowania.",
"acknowledgeSpendErrorMonthly": "Potwierdź szacowane miesięczne wydatki.",
"acknowledgeSpendErrorDaily": "Potwierdź szacowane dzienne wydatki.",
"unshardedMaxRuError": "Kolekcje bez fragmentów obsługują do 10 000 jednostek żądań",
"acknowledgeShareThroughputError": "Potwierdź szacowany koszt tej dedykowanej przepływności.",
"vectorPolicyError": "Napraw błędy w zasadach wektora kontenera",
"fullTextSearchPolicyError": "Napraw błędy w zasadach wyszukiwania pełnotekstowych kontenerów",
"addingSampleDataSet": "Dodawanie przykładowego zestawu danych",
"databaseFieldLabelName": "Database name",
"databaseFieldLabelId": "Database id",
"newDatabaseIdPlaceholder": "Type a new database id",
"newDatabaseIdAriaLabel": "New database id, Type a new database id",
"createNewDatabaseAriaLabel": "Create new database",
"useExistingDatabaseAriaLabel": "Use existing database",
"chooseExistingDatabase": "Choose an existing database",
"teachingBubble": {
"step1Headline": "Create sample database",
"step1Body": "Database is the parent of a container. You can create a new database or use an existing one. In this tutorial we are creating a new database named SampleDB.",
"step1LearnMore": "Learn more about resources.",
"step2Headline": "Setting throughput",
"step2Body": "Cosmos DB recommends sharing throughput across database. Autoscale will give you a flexible amount of throughput based on the max RU/s set (Request Units).",
"step2LearnMore": "Learn more about RU/s.",
"step3Headline": "Naming container",
"step3Body": "Name your container",
"step4Headline": "Setting partition key",
"step4Body": "Last step - you will need to define a partition key for your collection. /address was chosen for this particular example. A good partition key should have a wide range of possible value",
"step4CreateContainer": "Create container",
"step5Headline": "Creating sample container",
"step5Body": "A sample container is now being created and we are adding sample data for you. It should take about 1 minute.",
"step5BodyFollowUp": "Once the sample container is created, review your sample dataset and follow next steps",
"stepOfTotal": "Step {{current}} of {{total}}"
}
},
"addCollectionUtility": {
"shardKeyTooltip": "Klucz fragmentu (pole) służy do dzielenia danych na wiele zestawów replik (fragmentów) w celu osiągnięcia nieograniczonej skalowalności. Ważne jest, aby wybrać pole, które równomiernie rozłoży dane.",
"partitionKeyTooltip": "{{partitionKeyName}} służy do automatycznego dystrybuowania danych między partycjami na potrzeby skalowalności. Wybierz właściwość w dokumencie JSON, która ma szeroki zakres wartości i równomiernie dystrybuuje wolumin żądania.",
"partitionKeyTooltipSqlSuffix": " W przypadku małych obciążeń z dużą ilością odczytu lub obciążeń z dużą ilością zapisu o dowolnym rozmiarze identyfikator jest często dobrym wyborem.",
"shardKeyLabel": "Klucz partycjonujący",
"partitionKeyLabel": "Klucz partycji",
"shardKeyPlaceholder": "np. identyfikator kategorii",
"partitionKeyPlaceholderDefault": "np. /address",
"partitionKeyPlaceholderFirst": "Wymagane — pierwszy klucz partycji, np. /TenantId",
"partitionKeyPlaceholderSecond": "drugi klucz partycji, np. /UserId",
"partitionKeyPlaceholderThird": "trzeci klucz partycji, np., /SessionId",
"partitionKeyPlaceholderGraph": "np. /address/zipCode",
"uniqueKeysTooltip": "Unikatowe klucze zapewniają deweloperom możliwość dodania warstwy integralności danych do bazy danych. Tworząc unikatową politykę kluczy podczas tworzenia kontenera, zapewniasz unikatowość jednej lub więcej wartości na klucz partycji.",
"uniqueKeysLabel": "Unikatowe klucze",
"analyticalStoreLabel": "Magazyn analityczny",
"analyticalStoreTooltip": "Włącz funkcję magazynu analitycznego, aby wykonywać analizy danych operacyjnych niemal w czasie rzeczywistym, bez wpływu na wydajność obciążeń transakcyjnych.",
"analyticalStoreDescription": "Włącz funkcję magazynu analitycznego, aby wykonywać analizy danych operacyjnych niemal w czasie rzeczywistym, bez wpływu na wydajność obciążeń transakcyjnych.",
"vectorPolicyTooltip": "Opisz właściwości w swoich danych, które zawierają wektory, aby można było je wykorzystać w zapytaniach podobieństwa."
},
"settings": {
"pageOptions": "Opcje strony",
"pageOptionsDescription": "Wybierz Niestandardowe, aby określić stałą liczbę wyników zapytania do wyświetlenia, lub Bez ograniczeń, aby pokazać dowolną liczbę wyników na stronie.",
"queryResultsPerPage": "Wyniki zapytania na stronę",
"queryResultsPerPageTooltip": "Wprowadź liczbę wyników zapytania, które powinny być wyświetlane na stronie.",
"customQueryItemsPerPage": "Niestandardowe elementy zapytania na stronę",
"custom": "Niestandardowe",
"unlimited": "Bez ograniczeń",
"entraIdRbac": "Włącz RBAC w Entra ID",
"entraIdRbacDescription": "Wybierz pozycję Automatycznie, aby automatycznie włączyć funkcję RBAC identyfikatora wpisu. Wartość true/false wymusza włączenie/wyłączenie RBAC usługi Entra ID.",
"true": "True",
"false": "False",
"regionSelection": "Wybór regionu",
"regionSelectionDescription": "Zmienia region, którego klient Cosmos używa do dostępu do konta.",
"selectRegion": "Wybierz region",
"selectRegionTooltip": "Zmienia punkt końcowy konta używany do wykonywania operacji klienta.",
"globalDefault": "Globalne (domyślne)",
"readWrite": "(Odczyt/zapis)",
"read": "(Odczyt)",
"queryTimeout": "Limit czasu zapytania",
"queryTimeoutDescription": "Gdy zapytanie osiągnie określony limit czasu, pojawi się okienko z opcją anulowania zapytania, chyba że włączono automatyczne anulowanie.",
"enableQueryTimeout": "Włącz limit czasu zapytania",
"queryTimeoutMs": "Limit czasu zapytania (ms)",
"automaticallyCancelQuery": "Automatycznie anuluj zapytanie po upływie limitu czasu",
"ruLimit": "Limit RU",
"ruLimitDescription": "Jeśli zapytanie przekroczy skonfigurowany limit jednostek RU, zapytanie zostanie przerwane.",
"enableRuLimit": "Włącz limit jednostek RU",
"ruLimitLabel": "Limit jednostek RU (RU)",
"defaultQueryResults": "Domyślny widok wyników zapytania",
"defaultQueryResultsDescription": "Wybierz widok domyślny, który ma być używany podczas wyświetlania wyników zapytania.",
"retrySettings": "Ustawienia ponawiania",
"retrySettingsDescription": "Zasady ponawiania związane z ograniczonymi żądaniami podczas zapytań w usłudze CosmosDB.",
"maxRetryAttempts": "Maksymalna liczba ponownych prób",
"maxRetryAttemptsTooltip": "Maksymalna liczba ponownych prób dla żądania. Wartość domyślna 9.",
"fixedRetryInterval": "Stały interwał ponawiania prób (ms)",
"fixedRetryIntervalTooltip": "Stały interwał ponawiania prób w milisekundach, który określa czas oczekiwania między kolejnymi próbami, ignorując wartość retryAfter zwróconą w odpowiedzi. Wartość domyślna to 0 milisekund.",
"maxWaitTime": "Maksymalny czas oczekiwania (s)",
"maxWaitTimeTooltip": "Maksymalny czas oczekiwania na żądanie podczas ponownych prób, podany w sekundach. Wartość domyślna to 30 sekund.",
"enableContainerPagination": "Włącz paginację kontenera",
"enableContainerPaginationDescription": "Załaduj 50 kontenerów jednocześnie. Obecnie kontenery nie są ściągane w kolejności alfanumerycznej.",
"enableCrossPartitionQuery": "Włącz zapytanie między partycjami",
"enableCrossPartitionQueryDescription": "Wyślij więcej niż jedno żądanie podczas wykonywania zapytania. Jeśli zapytanie nie ma zakresu wartości klucza pojedynczej partycji, konieczne jest więcej niż jedno żądanie.",
"maxDegreeOfParallelism": "Maksymalny stopień równoległości",
"maxDegreeOfParallelismDescription": "Pobiera lub ustawia liczbę równoczesnych operacji uruchamianych po stronie klienta podczas równoległego wykonywania zapytań. Dodatnia wartość właściwości ogranicza liczbę równoczesnych operacji do ustawionej wartości. Jeśli wartość jest mniejsza niż 0, system automatycznie decyduje, ile operacji równoczesnych uruchomić.",
"maxDegreeOfParallelismQuery": "Wykonaj zapytanie o maksymalny stopień równoległości.",
"priorityLevel": "Poziom priorytetu",
"priorityLevelDescription": "Ustawia poziom priorytetu dla żądań płaszczyzny danych z usługi Data Explorer w przypadku korzystania z wykonywania opartego na priorytecie. Jeśli wybrano „Brak”, Data Explorer nie określi poziomu priorytetu, a zostanie użyty domyślny poziom priorytetu po stronie serwera.",
"displayGremlinQueryResults": "Wyświetl wyniki zapytania Gremlin jako:",
"displayGremlinQueryResultsDescription": "Wybierz Graph, aby automatycznie wizualizować wyniki zapytania jako wykres lub JSON, aby wyświetlić wyniki w formacie JSON.",
"graph": "Graph",
"json": "JSON",
"graphAutoVisualization": "Automatyczna wizualizacja grafu",
"enableSampleDatabase": "Włącz przykładową bazę danych",
"enableSampleDatabaseDescription": "To przykładowa baza danych i kolekcja z syntetycznymi danymi produktów, które możesz wykorzystać do eksploracji za pomocą zapytań NoSQL. Baza ta pojawi się jako kolejna baza danych w interfejsie Data Explorer i jest tworzona oraz utrzymywana przez Microsoft bez żadnych kosztów dla Ciebie.",
"enableSampleDbAriaLabel": "Włącz przykładową bazę danych do eksploracji zapytań",
"guidRepresentation": "Reprezentacja identyfikatora GUID",
"guidRepresentationDescription": "Element GuidRepresentation w MongoDB określa sposób serializacji i deserializacji globalnych unikatowych identyfikatorów (GUID) podczas przechowywania w dokumentach BSON. Dotyczy to wszystkich operacji na dokumentach.",
"advancedSettings": "Ustawienia zaawansowane",
"ignorePartitionKey": "Ignoruj klucz partycji podczas aktualizacji dokumentu",
"ignorePartitionKeyTooltip": "Jeśli zaznaczone, wartość klucza partycji nie będzie używana do lokalizowania dokumentu podczas operacji aktualizacji. Używaj tego tylko, gdy aktualizacje dokumentu nie powiodły się z powodu nieprawidłowego klucza partycji.",
"clearHistory": "Wyczyść historię",
"clearHistoryConfirm": "Czy na pewno chcesz kontynuować?",
"clearHistoryDescription": "Ta akcja spowoduje wyczyszczenie wszystkich dostosowań dla tego konta w tej przeglądarce, w tym:",
"clearHistoryTabLayout": "Zresetuj dostosowany układ kart, w tym pozycje rozdzielacza",
"clearHistoryTableColumns": "Wymaż preferencje kolumn tabeli, w tym wszystkie kolumny niestandardowe",
"clearHistoryFilters": "Wyczyść historię filtrów",
"clearHistoryRegion": "Resetuj wybór regionu do globalnego",
"increaseValueBy1000": "Zwiększ wartość o 1000",
"decreaseValueBy1000": "Zmniejsz wartość o 1000",
"none": "Brak",
"low": "Niskie",
"high": "Wysokie",
"automatic": "Automatyczne",
"enhancedQueryControl": "Rozszerzona kontrolka zapytań",
"enableQueryControl": "Włącz kontrolkę zapytania",
"explorerVersion": "Wersja Eksploratora",
"accountId": "Identyfikator konta",
"sessionId": "Identyfikator sesji",
"popupsDisabledError": "Nie udało się ustanowić autoryzacji dla tego konta, ponieważ w przeglądarce są wyłączone wyskakujące okienka.\nWłącz wyskakujące okienka dla tej witryny i kliknij przycisk „Zaloguj się w Entra ID”",
"failedToAcquireTokenError": "Nie można automatycznie uzyskać tokenu autoryzacji. Kliknij przycisk „Zaloguj się dla Entra ID”, aby włączyć operacje RBAC Entra ID"
},
"saveQuery": {
"panelTitle": "Zapisz zapytanie",
"setupCostMessage": "Ze względów zgodności zapisujemy zapytania w kontenerze na Twoim koncie Azure Cosmos w osobnej bazie danych o nazwie „{{databaseName}}”. Aby kontynuować, musimy utworzyć kontener na Twoim koncie, a szacowany dodatkowy koszt to 0,77 USD dziennie.",
"completeSetup": "Ukończ instalację",
"noQueryNameError": "Nie określono nazwy zapytania",
"invalidQueryContentError": "Określono nieprawidłową zawartość zapytania",
"failedToSaveQueryError": "Nie można zapisać zapytania {{queryName}}",
"failedToSetupContainerError": "Nie można skonfigurować kontenera dla zapisanych zapytań",
"accountNotSetupError": "Nie udało się zapisać zapytania: konto nie jest skonfigurowane do zapisywania zapytań",
"name": "Nazwa"
},
"loadQuery": {
"noFileSpecifiedError": "Nie określono pliku",
"failedToLoadQueryError": "Nie można załadować zapytania",
"failedToLoadQueryFromFileError": "Nie można załadować zapytania z pliku {{fileName}}",
"selectFilesToOpen": "Wybierz dokument zapytania",
"browseFiles": "Przeglądaj"
},
"executeStoredProcedure": {
"enterInputParameters": "Wprowadź parametry wejściowe (jeśli są)",
"key": "Klucz",
"param": "Param",
"partitionKeyValue": "Wartość klucza partycji",
"value": "Wartość",
"addNewParam": "Dodaj nowy parametr",
"addParam": "Dodaj parametr",
"deleteParam": "Usuń parametr",
"invalidParamError": "Określono nieprawidłowy parametr: {{invalidParam}}",
"invalidParamConsoleError": "Określono nieprawidłowy parametr: {{invalidParam}} nie jest prawidłową wartością literału",
"stringType": "Ciąg",
"customType": "Niestandardowe"
},
"uploadItems": {
"noFilesSpecifiedError": "Nie określono plików. Wprowadź co najmniej jeden plik.",
"selectJsonFiles": "Wybierz pliki JSON",
"selectJsonFilesTooltip": "Wybierz jeden lub więcej plików JSON do przesłania. Każdy plik może zawierać pojedynczy dokument JSON lub tablicę dokumentów JSON. Łączny rozmiar wszystkich plików w pojedynczej operacji przesyłania musi być mniejszy niż 2 MB. Możesz wykonać wiele operacji przesyłania dla większych zestawów danych.",
"fileNameColumn": "NAZWA PLIKU",
"statusColumn": "STAN",
"uploadStatus": "Utworzono: {{numSucceeded}}, ograniczono: {{numThrottled}}, błędy: {{numFailed}}",
"uploadedFiles": "Przekazywane pliki"
},
"copyNotebook": {
"copyFailedError": "Nie można skopiować {{name}} do {{destination}}",
"uploadFailedError": "Nie można przekazać {{name}}",
"location": "Lokalizacja",
"locationAriaLabel": "Lokalizacja",
"selectLocation": "Wybierz lokalizację notesu do skopiowania",
"name": "Nazwa"
},
"publishNotebook": {
"publishFailedError": "Nie można opublikować {{notebookName}} w galerii",
"publishDescription": "Po opublikowaniu ten notes pojawi się w publicznej galerii notesów Azure Cosmos DB. Przed opublikowaniem upewnij się, że usunięto poufne dane lub dane wyjściowe.",
"publishPrompt": "Czy chcesz opublikować i udostępnić „{{name}}” w galerii?",
"coverImage": "Obraz okładki",
"coverImageUrl": "Adres URL obrazu tytułowego",
"name": "Nazwa",
"description": "Opis",
"tags": "Tagi",
"tagsPlaceholder": "Opcjonalny tag 1, opcjonalny tag 2",
"preview": "Podgląd",
"urlType": "Adres URL",
"customImage": "Obraz niestandardowy",
"takeScreenshot": "Zrób zrzut ekranu",
"useFirstDisplayOutput": "Użyj pierwszego wyświetlania danych wyjściowych",
"failedToCaptureOutput": "Nie można przechwycić pierwszych danych wyjściowych",
"outputDoesNotExist": "Dane wyjściowe nie istnieją dla żadnej komórki.",
"failedToConvertError": "Nie można przekonwertować {{fileName}} na format base64",
"failedToUploadError": "Nie można przekazać {{fileName}}"
},
"changePartitionKey": {
"failedToStartError": "Nie udało się uruchomić zadania transferu danych",
"suboptimalPartitionKeyError": "Ostrzeżenie: system wykrył, że kolekcja może używać nieoptymalnego klucza partycji",
"description": "Zmieniając klucz partycji kontenera, musisz utworzyć kontener docelowy z poprawnym kluczem partycji. Możesz też wybrać istniejący kontener docelowy.",
"sourceContainerId": "Identyfikator {{collectionName}} źródłowego",
"destinationContainerId": "Identyfikator {{collectionName}} docelowego",
"collectionIdTooltip": "Identyfikator unikatowy {{collectionName}} używany do routingu opartego na identyfikatorach prowadzącego przez interfejs REST i wszystkie zestawy SDK.",
"collectionIdPlaceholder": "np. {{collectionName}}1",
"collectionIdAriaLabel": "Identyfikator {{collectionName}}, przykład {{collectionName}}1",
"existingContainers": "Istniejące kontenery",
"partitionKeyWarning": "Kontener docelowy nie może już istnieć. Data Explorer utworzy dla Ciebie nowy kontener docelowy."
},
"cassandraAddCollection": {
"keyspaceLabel": "Nazwa przestrzeni kluczy",
"keyspaceTooltip": "Wybierz istniejącą przestrzeń kluczy lub wprowadź nowy identyfikator przestrzeni kluczy.",
"tableIdLabel": "Wprowadź polecenie CQL, aby utworzyć tabelę.",
"enterTableId": "Wprowadź identyfikator tabeli",
"tableSchemaAriaLabel": "Schemat tabeli",
"provisionDedicatedThroughput": "Aprowizowanie dedykowanej przepływności dla tej tabeli",
"provisionDedicatedThroughputTooltip": "Możesz opcjonalnie przydzielić dedykowaną przepustowość dla tabeli w przestrzeni kluczy, która ma już przydzieloną przepustowość. Ta dedykowana przepustowość nie będzie współdzielona z innymi tabelami w przestrzeni kluczy i nie będzie wliczana do przepustowości przydzielonej dla przestrzeni kluczy. Ta przepustowość będzie rozliczana dodatkowo do przepustowości przydzielonej na poziomie przestrzeni kluczy."
},
"tables": {
"addProperty": "Dodaj właściwość",
"addRow": "Dodaj wiersz",
"addEntity": "Dodaj jednostkę",
"back": "wstecz",
"nullFieldsWarning": "Ostrzeżenie: pola o wartości null nie będą wyświetlane do edycji.",
"propertyEmptyError": "Wartość {{property}} nie może być pusta. Wprowadź wartość dla {{property}}",
"whitespaceError": "{{property}} nie może zawierać białych znaków. Wprowadź wartość dla {{property}} bez białych znaków",
"propertyTypeEmptyError": "Typ właściwości nie może być pusty. Wybierz typ z listy rozwijanej dla właściwości {{property}}"
},
"tableQuerySelect": {
"selectColumns": "Wybierz kolumny, których ma dotyczyć zapytanie.",
"availableColumns": "Dostępne kolumny"
},
"tableColumnSelection": {
"selectColumns": "Wybierz kolumny do wyświetlenia w widoku elementów w kontenerze.",
"searchFields": "Pola wyszukiwania",
"reset": "Zresetuj",
"partitionKeySuffix": " (klucz partycji)"
},
"newVertex": {
"addProperty": "Dodaj właściwość"
},
"addGlobalSecondaryIndex": {
"globalSecondaryIndexId": "Identyfikator kontenera globalnego indeksu pomocniczego",
"globalSecondaryIndexIdPlaceholder": "np. indexbyEmailId",
"projectionQuery": "Zapytanie projekcji",
"projectionQueryPlaceholder": "SELECT c.email, c.accountId FROM c",
"projectionQueryTooltip": "Dowiedz się więcej o definiowaniu globalnych indeksów pomocniczych.",
"disabledTitle": "Globalny indeks pomocniczy jest już tworzony. Zaczekaj na ukończenie tej operacji przed utworzeniem kolejnej."
},
"stringInput": {
"inputMismatchError": "Dane wejściowe {{input}} nie pasują do wybranej {{selectedId}}"
},
"panelInfo": {
"information": "Informacje",
"moreDetails": "Więcej szczegółów"
}
},
"controls": {
"settings": {
"tabTitles": {
"scale": "Scale",
"conflictResolution": "Conflict Resolution",
"settings": "Settings",
"indexingPolicy": "Indexing Policy",
"partitionKeys": "Partition Keys",
"partitionKeysPreview": "Partition Keys (preview)",
"computedProperties": "Computed Properties",
"containerPolicies": "Container Policies",
"throughputBuckets": "Throughput Buckets",
"globalSecondaryIndexPreview": "Global Secondary Index (Preview)",
"maskingPolicyPreview": "Masking Policy (preview)"
},
"mongoNotifications": {
"selectTypeWarning": "Please select a type for each index.",
"enterFieldNameError": "Wprowadź nazwę pola.",
"wildcardPathError": "Wildcard path is not present in the field name. Use a pattern like "
},
"partitionKey": {
"shardKey": "Shard key",
"partitionKey": "Partition key",
"shardKeyTooltip": "Klucz fragmentu (pole) służy do dzielenia danych na wiele zestawów replik (fragmentów) w celu osiągnięcia nieograniczonej skalowalności. Ważne jest, aby wybrać pole, które równomiernie rozłoży dane.",
"partitionKeyTooltip": "is used to automatically distribute data across partitions for scalability. Choose a property in your JSON document that has a wide range of values and evenly distributes request volume.",
"sqlPartitionKeyTooltipSuffix": " W przypadku małych obciążeń z dużą ilością odczytu lub obciążeń z dużą ilością zapisu o dowolnym rozmiarze identyfikator jest często dobrym wyborem.",
"partitionKeySubtext": "For small workloads, the item ID is a suitable choice for the partition key.",
"mongoPlaceholder": "e.g., categoryId",
"gremlinPlaceholder": "e.g., /address",
"sqlFirstPartitionKey": "Wymagane — pierwszy klucz partycji, np. /TenantId",
"sqlSecondPartitionKey": "drugi klucz partycji, np. /UserId",
"sqlThirdPartitionKey": "trzeci klucz partycji, np., /SessionId",
"defaultPlaceholder": "e.g., /address/zipCode"
},
"costEstimate": {
"title": "Cost estimate*",
"howWeCalculate": "How we calculate this",
"updatedCostPerMonth": "Updated cost per month",
"currentCostPerMonth": "Current cost per month",
"perRu": "/RU",
"perHour": "/hr",
"perDay": "/day",
"perMonth": "/mo"
},
"throughput": {
"manualToAutoscaleDisclaimer": "The starting autoscale max RU/s will be determined by the system, based on the current manual throughput settings and storage of your resource. After autoscale has been enabled, you can change the max RU/s.",
"ttlWarningText": "The system will automatically delete items based on the TTL value (in seconds) you provide, without needing a delete operation explicitly issued by a client application. For more information see,",
"ttlWarningLinkText": "Time to Live (TTL) in Azure Cosmos DB",
"unsavedIndexingPolicy": "indexing policy",
"unsavedDataMaskingPolicy": "data masking policy",
"unsavedComputedProperties": "computed properties",
"unsavedEditorWarningPrefix": "You have not saved the latest changes made to your",
"unsavedEditorWarningSuffix": ". Please click save to confirm the changes.",
"updateDelayedApplyWarning": "You are about to request an increase in throughput beyond the pre-allocated capacity. This operation will take some time to complete.",
"scalingUpDelayMessage": "Scaling up will take 4-6 hours as it exceeds what Azure Cosmos DB can instantly support currently based on your number of physical partitions. You can increase your throughput to {{instantMaximumThroughput}} instantly or proceed with this value and wait until the scale-up is completed.",
"exceedPreAllocatedMessage": "Your request to increase throughput exceeds the pre-allocated capacity which may take longer than expected. There are three options you can choose from to proceed:",
"instantScaleOption": "You can instantly scale up to {{instantMaximumThroughput}} RU/s.",
"asyncScaleOption": "You can asynchronously scale up to any value under {{maximumThroughput}} RU/s in 4-6 hours.",
"quotaMaxOption": "Your current quota max is {{maximumThroughput}} RU/s. To go over this limit, you must request a quota increase and the Azure Cosmos DB team will review.",
"belowMinimumMessage": "You are not able to lower throughput below your current minimum of {{minimum}} RU/s. For more information on this limit, please refer to our service quote documentation.",
"saveThroughputWarning": "Your bill will be affected as you update your throughput settings. Please review the updated cost estimate below before saving your changes",
"currentAutoscaleThroughput": "Current autoscale throughput:",
"targetAutoscaleThroughput": "Target autoscale throughput:",
"currentManualThroughput": "Current manual throughput:",
"targetManualThroughput": "Target manual throughput:",
"applyDelayedMessage": "The request to increase the throughput has successfully been submitted. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"databaseLabel": "Database:",
"containerLabel": "Container:",
"applyShortDelayMessage": "A request to increase the throughput is currently in progress. This operation will take some time to complete.",
"applyLongDelayMessage": "A request to increase the throughput is currently in progress. This operation will take 1-3 business days to complete. View the latest status in Notifications.",
"throughputCapError": "Your account is currently configured with a total throughput limit of {{throughputCap}} RU/s. This update isn't possible because it would increase the total throughput to {{newTotalThroughput}} RU/s. Change total throughput limit in cost management.",
"throughputIncrementError": "Throughput value must be in increments of 1000"
},
"conflictResolution": {
"lwwDefault": "Last Write Wins (default)",
"customMergeProcedure": "Merge Procedure (custom)",
"mode": "Mode",
"conflictResolverProperty": "Conflict Resolver Property",
"storedProcedure": "Stored procedure",
"lwwTooltip": "Gets or sets the name of a integer property in your documents which is used for the Last Write Wins (LWW) based conflict resolution scheme. By default, the system uses the system defined timestamp property, _ts to decide the winner for the conflicting versions of the document. Specify your own integer property if you want to override the default timestamp based conflict resolution.",
"customTooltip": "Gets or sets the name of a stored procedure (aka merge procedure) for resolving the conflicts. You can write application defined logic to determine the winner of the conflicting versions of a document. The stored procedure will get executed transactionally, exactly once, on the server side. If you do not provide a stored procedure, the conflicts will be populated in the",
"customTooltipConflictsFeed": " conflicts feed",
"customTooltipSuffix": ". You can update/re-register the stored procedure at any time."
},
"changeFeed": {
"label": "Change feed log retention policy",
"tooltip": "Enable change feed log retention policy to retain last 10 minutes of history for items in the container by default. To support this, the request unit (RU) charge for this container will be multiplied by a factor of two for writes. Reads are unaffected."
},
"mongoIndexing": {
"disclaimer": "For queries that filter on multiple properties, create multiple single field indexes instead of a compound index.",
"disclaimerCompoundIndexesLink": " Compound indexes ",
"disclaimerSuffix": "are only used for sorting query results. If you need to add a compound index, you can create one using the Mongo shell.",
"compoundNotSupported": "Collections with compound indexes are not yet supported in the indexing editor. To modify indexing policy for this collection, use the Mongo Shell.",
"aadError": "To use the indexing policy editor, please login to the",
"aadErrorLink": "azure portal.",
"refreshingProgress": "Refreshing index transformation progress",
"canMakeMoreChangesZero": "You can make more indexing changes once the current index transformation is complete. ",
"refreshToCheck": "Refresh to check if it has completed.",
"canMakeMoreChangesProgress": "You can make more indexing changes once the current index transformation has completed. It is {{progress}}% complete. ",
"refreshToCheckProgress": "Refresh to check the progress.",
"definitionColumn": "Definition",
"typeColumn": "Type",
"dropIndexColumn": "Drop Index",
"addIndexBackColumn": "Add index back",
"deleteIndexButton": "Delete index Button",
"addBackIndexButton": "Add back Index Button",
"currentIndexes": "Current index(es)",
"indexesToBeDropped": "Index(es) to be dropped",
"indexFieldName": "Index Field Name",
"indexType": "Index Type",
"selectIndexType": "Select an index type",
"undoButton": "Undo Button"
},
"subSettings": {
"timeToLive": "Time to Live",
"ttlOff": "Off",
"ttlOnNoDefault": "On (no default)",
"ttlOn": "On",
"seconds": "second(s)",
"timeToLiveInSeconds": "Time to live in seconds",
"analyticalStorageTtl": "Analytical Storage Time to Live",
"geospatialConfiguration": "Geospatial Configuration",
"geography": "Geography",
"geometry": "Geometry",
"uniqueKeys": "Unique keys",
"mongoTtlMessage": "To enable time-to-live (TTL) for your collection/documents,",
"mongoTtlLinkText": "create a TTL index",
"partitionKeyTooltipTemplate": "This {{partitionKeyName}} is used to distribute data across multiple partitions for scalability. The value \"{{partitionKeyValue}}\" determines how documents are partitioned.",
"largePartitionKeyEnabled": "Large {{partitionKeyName}} has been enabled.",
"hierarchicalPartitioned": "Hierarchically partitioned container.",
"nonHierarchicalPartitioned": "Non-hierarchically partitioned container."
},
"scale": {
"freeTierInfo": "With free tier, you will get the first {{ru}} RU/s and {{storage}} GB of storage in this account for free. To keep your account free, keep the total RU/s across all resources in the account to {{ru}} RU/s.",
"freeTierLearnMore": "Learn more.",
"throughputRuS": "Throughput (RU/s)",
"autoScaleCustomSettings": "Your account has custom settings that prevents setting throughput at the container level. Please work with your Cosmos DB engineering team point of contact to make changes.",
"keyspaceSharedThroughput": "This table shared throughput is configured at the keyspace",
"throughputRangeLabel": "Throughput ({{min}} - {{max}} RU/s)",
"unlimited": "unlimited"
},
"partitionKeyEditor": {
"changePartitionKey": "Change {{partitionKeyName}}",
"currentPartitionKey": "Current {{partitionKeyName}}",
"partitioning": "Partitioning",
"hierarchical": "Hierarchical",
"nonHierarchical": "Non-hierarchical",
"safeguardWarning": "To safeguard the integrity of the data being copied to the new container, ensure that no updates are made to the source container for the entire duration of the partition key change process.",
"changeDescription": "To change the partition key, a new destination container must be created or an existing destination container selected. Data will then be copied to the destination container.",
"changeButton": "Change",
"changeJob": "{{partitionKeyName}} change job",
"cancelButton": "Cancel",
"documentsProcessed": "({{processedCount}} of {{totalCount}} documents processed)"
},
"computedProperties": {
"ariaLabel": "Computed properties",
"learnMorePrefix": "about how to define computed properties and how to use them."
},
"indexingPolicy": {
"ariaLabel": "Indexing Policy"
},
"dataMasking": {
"ariaLabel": "Data Masking Policy",
"validationFailed": "Validation failed:",
"includedPathsRequired": "includedPaths is required",
"includedPathsMustBeArray": "includedPaths must be an array",
"excludedPathsMustBeArray": "excludedPaths must be an array if provided"
},
"containerPolicy": {
"vectorPolicy": "Vector Policy",
"fullTextPolicy": "Full Text Policy",
"createFullTextPolicy": "Create new full text search policy"
},
"globalSecondaryIndex": {
"indexesDefined": "This container has the following indexes defined for it.",
"learnMoreSuffix": "about how to define global secondary indexes and how to use them.",
"jsonAriaLabel": "Global Secondary Index JSON",
"addIndex": "Add index",
"settingsTitle": "Global Secondary Index Settings",
"sourceContainer": "Source container",
"indexDefinition": "Global secondary index definition"
},
"indexingPolicyRefresh": {
"refreshFailed": "Refreshing index transformation progress failed"
},
"throughputInput": {
"autoscale": "Autoscale",
"manual": "Manual",
"minimumRuS": "Minimum RU/s",
"maximumRuS": "Maximum RU/s",
"x10Equals": "x 10 =",
"storageCapacity": "Storage capacity",
"fixed": "Fixed",
"unlimited": "Unlimited",
"instant": "Instant",
"fourToSixHrs": "4-6 hrs",
"autoscaleDescription": "Based on usage, your {{resourceType}} throughput will scale from",
"freeTierWarning": "Billing will apply if you provision more than {{ru}} RU/s of manual throughput, or if the resource scales beyond {{ru}} RU/s with autoscale.",
"capacityCalculator": "Estimate your required RU/s with",
"capacityCalculatorLink": " capacity calculator",
"fixedStorageNote": "When using a collection with fixed storage capacity, you can set up to 10,000 RU/s.",
"min": "min",
"max": "max"
},
"throughputBuckets": {
"label": "Throughput Buckets",
"bucketLabel": "Bucket {{id}}",
"dataExplorerQueryBucket": " (Data Explorer Query Bucket)",
"active": "Active",
"inactive": "Inactive"
}
}
}
}

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