Compare commits

..

5 Commits

Author SHA1 Message Date
Nan Yu 418627f901 slightly nicer color definitions 2020-12-06 17:57:09 -08:00
Nan Yu 6153f392ec add back background 2020-12-02 02:15:45 -08:00
Nan Yu db404b63fe change bg on active item on drag as well 2020-12-02 02:13:02 -08:00
Nan Yu c1ea8fa6a4 remove global styles import 2020-12-02 02:12:52 -08:00
Nan Yu 03175b38ad update dropzone to new version 2020-12-02 02:12:23 -08:00
77 changed files with 1076 additions and 2351 deletions
-5
View File
@@ -24,11 +24,6 @@ DEBUG=cache,presenters,events
SLACK_KEY=get_a_key_from_slack
SLACK_SECRET=get_the_secret_of_above_key
# To configure Google auth, you'll need to create an OAuth Client ID at
# => https://console.cloud.google.com/apis/credentials
#
# When configuring the Client ID, add an Authorized redirect URI:
# https://<your Outline URL>/auth/google.callback
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
+2 -2
View File
@@ -3,7 +3,7 @@ Business Source License 1.1
Parameters
Licensor: General Outline, Inc.
Licensed Work: Outline 0.51.0
Licensed Work: Outline 0.50.0
The Licensed Work is (c) 2020 General Outline, Inc.
Additional Use Grant: You may make use of the Licensed Work, provided that
you may not use the Licensed Work for a Document
@@ -15,7 +15,7 @@ Additional Use Grant: You may make use of the Licensed Work, provided that
Licensed Work by creating teams and documents
controlled by such third parties.
Change Date: 2023-12-13
Change Date: 2023-11-14
Change License: Apache License, Version 2.0
-1
View File
@@ -12,7 +12,6 @@
<a href="https://circleci.com/gh/outline/outline" rel="nofollow"><img src="https://circleci.com/gh/outline/outline.svg?style=shield&amp;circle-token=c0c4c2f39990e277385d5c1ae96169c409eb887a"></a>
<a href="https://github.com/prettier/prettier"><img src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat"></a>
<a href="https://github.com/styled-components/styled-components"><img src="https://img.shields.io/badge/style-%F0%9F%92%85%20styled--components-orange.svg"></a>
<a href="https://translate.getoutline.com/project/outline"><img src="https://badges.crowdin.net/outline/localized.svg"></a>
</p>
This is the source code that runs [**Outline**](https://www.getoutline.com) and all the associated services. If you want to use Outline then you don't need to run this code, we offer a hosted version of the app at [getoutline.com](https://www.getoutline.com).
+1 -1
View File
@@ -99,7 +99,7 @@ const Breadcrumb = ({ document, onlyText }: Props) => {
}
const path = collection.pathToDocument
? collection.pathToDocument(document.id).slice(0, -1)
? collection.pathToDocument(document).slice(0, -1)
: [];
if (onlyText === true) {
+5 -5
View File
@@ -102,7 +102,7 @@ function Editor(props: PropsWithRef) {
deleteTable: t("Delete table"),
em: t("Italic"),
embedInvalidLink: t("Sorry, that link wont work for this embed type"),
findOrCreateDoc: `${t("Find or create a doc")}`,
findOrCreateDoc: t("Find or create a doc"),
h1: t("Big heading"),
h2: t("Medium heading"),
h3: t("Small heading"),
@@ -115,18 +115,18 @@ function Editor(props: PropsWithRef) {
link: t("Link"),
linkCopied: t("Link copied to clipboard"),
mark: t("Highlight"),
newLineEmpty: `${t("Type '/' to insert")}`,
newLineWithSlash: `${t("Keep typing to filter")}`,
newLineEmpty: t("Type '/' to insert"),
newLineWithSlash: t("Keep typing to filter"),
noResults: t("No results"),
openLink: t("Open link"),
orderedList: t("Ordered list"),
pasteLink: `${t("Paste a link")}`,
pasteLink: t("Paste a link"),
pasteLinkWithTitle: (service: string) =>
t("Paste a {{service}} link…", { service }),
placeholder: t("Placeholder"),
quote: t("Quote"),
removeLink: t("Remove link"),
searchOrPasteLink: `${t("Search or paste a link")}`,
searchOrPasteLink: t("Search or paste a link"),
strikethrough: t("Strikethrough"),
strong: t("Bold"),
subheading: t("Subheading"),
+1 -1
View File
@@ -200,7 +200,7 @@ class IconPicker extends React.Component<Props> {
})}
</Icons>
<Flex onClick={preventEventBubble}>
<React.Suspense fallback={<Loading>{t("Loading")}</Loading>}>
<React.Suspense fallback={<Loading>{t("Loading")}</Loading>}>
<ColorPicker
color={this.props.color}
onChange={(color) =>
+1 -1
View File
@@ -54,7 +54,7 @@ class InputSearch extends React.Component<Props> {
render() {
const { t } = this.props;
const { theme, placeholder = `${t("Search")}` } = this.props;
const { theme, placeholder = t("Search") } = this.props;
return (
<InputMaxWidth
+2 -14
View File
@@ -65,11 +65,6 @@ class Layout extends React.Component<Props> {
window.document.body.style.background = props.theme.background;
}
@keydown("meta+.")
handleToggleSidebar() {
this.props.ui.toggleCollapsedSidebar();
}
@keydown("shift+/")
handleOpenKeyboardShortcuts() {
if (this.props.ui.editMode) return;
@@ -124,11 +119,7 @@ class Layout extends React.Component<Props> {
</Switch>
)}
<Content
auto
justify="center"
sidebarCollapsed={ui.editMode || ui.sidebarCollapsed}
>
<Content auto justify="center" editMode={ui.editMode}>
{this.props.children}
</Content>
@@ -168,10 +159,7 @@ const Content = styled(Flex)`
}
${breakpoint("tablet")`
margin-left: ${(props) =>
props.sidebarCollapsed
? props.theme.sidebarCollapsedWidth
: props.theme.sidebarWidth};
margin-left: ${(props) => (props.editMode ? 0 : props.theme.sidebarWidth)};
`};
`;
+3 -31
View File
@@ -8,7 +8,6 @@ import styled from "styled-components";
import breakpoint from "styled-components-breakpoint";
import Fade from "components/Fade";
import Flex from "components/Flex";
import CollapseToggle, { Button } from "./components/CollapseToggle";
import usePrevious from "hooks/usePrevious";
import useStores from "hooks/useStores";
@@ -31,14 +30,10 @@ function Sidebar({ location, children }: Props) {
const content = (
<Container
editMode={ui.editMode}
mobileSidebarVisible={ui.mobileSidebarVisible}
collapsed={ui.editMode || ui.sidebarCollapsed}
column
>
<CollapseToggle
collapsed={ui.sidebarCollapsed}
onClick={ui.toggleCollapsedSidebar}
/>
<Toggle
onClick={ui.toggleMobileSidebar}
mobileSidebarVisible={ui.mobileSidebarVisible}
@@ -68,7 +63,7 @@ const Container = styled(Flex)`
bottom: 0;
width: 100%;
background: ${(props) => props.theme.sidebarBackground};
transition: box-shadow, 100ms, ease-in-out, left 100ms ease-out,
transition: left 100ms ease-out,
${(props) => props.theme.backgroundTransition};
margin-left: ${(props) => (props.mobileSidebarVisible ? 0 : "-100%")};
z-index: ${(props) => props.theme.depths.sidebar};
@@ -95,33 +90,10 @@ const Container = styled(Flex)`
}
${breakpoint("tablet")`
left: ${(props) =>
props.collapsed
? `calc(-${props.theme.sidebarWidth} + ${props.theme.sidebarCollapsedWidth})`
: 0};
left: ${(props) => (props.editMode ? `-${props.theme.sidebarWidth}` : 0)};
width: ${(props) => props.theme.sidebarWidth};
margin: 0;
z-index: 3;
&:hover,
&:focus-within {
left: 0;
box-shadow: ${(props) =>
props.collapsed ? "rgba(0, 0, 0, 0.2) 1px 0 4px" : "none"};
& ${Button} {
opacity: .75;
}
& ${Button}:hover {
opacity: 1;
}
}
&:not(:hover):not(:focus-within) > div {
opacity: ${(props) => (props.collapsed ? "0" : "1")};
transition: opacity 100ms ease-in-out;
}
`};
`;
@@ -1,59 +0,0 @@
// @flow
import { NextIcon, BackIcon } from "outline-icons";
import * as React from "react";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import Tooltip from "components/Tooltip";
import { meta } from "utils/keyboard";
type Props = {|
collapsed: boolean,
onClick?: () => void,
|};
function CollapseToggle({ collapsed, ...rest }: Props) {
const { t } = useTranslation();
return (
<Tooltip
tooltip={collapsed ? t("Expand") : t("Collapse")}
shortcut={`${meta}+.`}
delay={500}
placement="bottom"
>
<Button {...rest} aria-hidden>
{collapsed ? (
<NextIcon color="currentColor" />
) : (
<BackIcon color="currentColor" />
)}
</Button>
</Tooltip>
);
}
export const Button = styled.button`
display: block;
position: absolute;
top: 28px;
right: 8px;
border: 0;
width: 24px;
height: 24px;
z-index: 1;
font-weight: 600;
color: ${(props) => props.theme.sidebarText};
background: ${(props) => props.theme.sidebarItemBackground};
transition: opacity 100ms ease-in-out;
border-radius: 4px;
opacity: 0;
cursor: pointer;
padding: 0;
&:hover {
color: ${(props) => props.theme.white};
background: ${(props) => props.theme.primary};
}
`;
export default CollapseToggle;
@@ -1,7 +1,7 @@
// @flow
import { observable } from "mobx";
import { observer } from "mobx-react";
import * as React from "react";
import { useDrop } from "react-dnd";
import UiStore from "stores/UiStore";
import Collection from "models/Collection";
import Document from "models/Document";
@@ -10,7 +10,6 @@ import DropToImport from "components/DropToImport";
import DocumentLink from "./DocumentLink";
import EditableTitle from "./EditableTitle";
import SidebarLink from "./SidebarLink";
import useStores from "hooks/useStores";
import CollectionMenu from "menus/CollectionMenu";
type Props = {|
@@ -21,44 +20,27 @@ type Props = {|
prefetchDocument: (id: string) => Promise<void>,
|};
function CollectionLink({
collection,
activeDocument,
prefetchDocument,
canUpdate,
ui,
}: Props) {
const [menuOpen, setMenuOpen] = React.useState(false);
@observer
class CollectionLink extends React.Component<Props> {
@observable menuOpen = false;
const handleTitleChange = React.useCallback(
async (name: string) => {
await collection.save({ name });
},
[collection]
);
handleTitleChange = async (name: string) => {
await this.props.collection.save({ name });
};
const { documents, policies } = useStores();
const expanded = collection.id === ui.activeCollectionId;
render() {
const {
collection,
activeDocument,
prefetchDocument,
canUpdate,
ui,
} = this.props;
// Droppable
const [{ isOver, canDrop }, drop] = useDrop({
accept: "document",
drop: (item, monitor) => {
if (!collection) return;
documents.move(item.id, collection.id);
},
canDrop: (item, monitor) => {
return policies.abilities(collection.id).update;
},
collect: (monitor) => ({
isOver: !!monitor.isOver(),
canDrop: monitor.canDrop(),
}),
});
const expanded = collection.id === ui.activeCollectionId;
return (
<>
<div ref={drop}>
return (
<>
<DropToImport key={collection.id} collectionId={collection.id}>
<SidebarLink
key={collection.id}
@@ -68,12 +50,11 @@ function CollectionLink({
}
iconColor={collection.color}
expanded={expanded}
menuOpen={menuOpen}
isActiveDrop={isOver && canDrop}
menuOpen={this.menuOpen}
label={
<EditableTitle
title={collection.name}
onSubmit={handleTitleChange}
onSubmit={this.handleTitleChange}
canUpdate={canUpdate}
/>
}
@@ -82,28 +63,28 @@ function CollectionLink({
<CollectionMenu
position="right"
collection={collection}
onOpen={() => setMenuOpen(true)}
onClose={() => setMenuOpen(false)}
onOpen={() => (this.menuOpen = true)}
onClose={() => (this.menuOpen = false)}
/>
}
></SidebarLink>
</DropToImport>
</div>
{expanded &&
collection.documents.map((node) => (
<DocumentLink
key={node.id}
node={node}
collection={collection}
activeDocument={activeDocument}
prefetchDocument={prefetchDocument}
canUpdate={canUpdate}
depth={1.5}
/>
))}
</>
);
{expanded &&
collection.documents.map((node) => (
<DocumentLink
key={node.id}
node={node}
collection={collection}
activeDocument={activeDocument}
prefetchDocument={prefetchDocument}
canUpdate={canUpdate}
depth={1.5}
/>
))}
</>
);
}
}
export default observer(CollectionLink);
export default CollectionLink;
@@ -72,7 +72,7 @@ class Collections extends React.Component<Props> {
to="/collections"
onClick={this.props.onCreateCollection}
icon={<PlusIcon color="currentColor" />}
label={`${t("New collection")}`}
label={t("New collection")}
exact
/>
</>
@@ -2,7 +2,6 @@
import { observer } from "mobx-react";
import { CollapsedIcon } from "outline-icons";
import * as React from "react";
import { useDrag, useDrop } from "react-dnd";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import Collection from "models/Collection";
@@ -34,7 +33,7 @@ function DocumentLink({
depth,
canUpdate,
}: Props) {
const { documents, policies } = useStores();
const { documents } = useStores();
const { t } = useTranslation();
const isActiveDocument = activeDocument && activeDocument.id === node.id;
@@ -49,19 +48,13 @@ function DocumentLink({
}
}, [fetchChildDocuments, node, hasChildDocuments, isActiveDocument]);
const pathToNode = React.useMemo(
() =>
collection && collection.pathToDocument(node.id).map((entry) => entry.id),
[collection, node]
);
const showChildren = React.useMemo(() => {
return !!(
hasChildDocuments &&
activeDocument &&
collection &&
(collection
.pathToDocument(activeDocument.id)
.pathToDocument(activeDocument)
.map((entry) => entry.id)
.includes(node.id) ||
isActiveDocument)
@@ -107,88 +100,51 @@ function DocumentLink({
);
const [menuOpen, setMenuOpen] = React.useState(false);
const isMoving = documents.movingDocumentId === node.id;
// Draggable
const [{ isDragging }, drag] = useDrag({
item: { type: "document", ...node, depth, active: isActiveDocument },
collect: (monitor) => ({
isDragging: !!monitor.isDragging(),
}),
canDrag: (monitor) => {
return policies.abilities(node.id).move;
},
});
// Droppable
const [{ isOver, canDrop }, drop] = useDrop({
accept: "document",
drop: async (item, monitor) => {
if (!collection) return;
documents.move(item.id, collection.id, node.id);
},
canDrop: (item, monitor) =>
pathToNode && !pathToNode.includes(monitor.getItem().id),
collect: (monitor) => ({
isOver: !!monitor.isOver(),
canDrop: monitor.canDrop(),
}),
});
return (
<>
<Draggable
key={node.id}
ref={drag}
$isDragging={isDragging}
$isMoving={isMoving}
>
<div ref={drop}>
<DropToImport documentId={node.id} activeClassName="activeDropZone">
<SidebarLink
innerRef={isActiveDocument ? activeDocumentRef : undefined}
onMouseEnter={handleMouseEnter}
to={{
pathname: node.url,
state: { title: node.title },
}}
label={
<>
{hasChildDocuments && (
<Disclosure
expanded={expanded && !isDragging}
onClick={handleDisclosureClick}
/>
)}
<EditableTitle
title={node.title || t("Untitled")}
onSubmit={handleTitleChange}
canUpdate={canUpdate}
/>
</>
}
isActiveDrop={isOver && canDrop}
depth={depth}
exact={false}
menuOpen={menuOpen}
menu={
document && !isMoving ? (
<Fade>
<DocumentMenu
position="right"
document={document}
onOpen={() => setMenuOpen(true)}
onClose={() => setMenuOpen(false)}
/>
</Fade>
) : undefined
}
/>
</DropToImport>
</div>
</Draggable>
<React.Fragment key={node.id}>
<DropToImport documentId={node.id} activeClassName="activeDropZone">
<SidebarLink
innerRef={isActiveDocument ? activeDocumentRef : undefined}
onMouseEnter={handleMouseEnter}
to={{
pathname: node.url,
state: { title: node.title },
}}
label={
<>
{hasChildDocuments && (
<Disclosure
expanded={expanded}
onClick={handleDisclosureClick}
/>
)}
<EditableTitle
title={node.title || t("Untitled")}
onSubmit={handleTitleChange}
canUpdate={canUpdate}
/>
</>
}
depth={depth}
exact={false}
menuOpen={menuOpen}
menu={
document ? (
<Fade>
<DocumentMenu
position="right"
document={document}
onOpen={() => setMenuOpen(true)}
onClose={() => setMenuOpen(false)}
/>
</Fade>
) : undefined
}
></SidebarLink>
</DropToImport>
{expanded && !isDragging && (
{expanded && (
<>
{node.children.map((childNode) => (
<ObservedDocumentLink
@@ -203,15 +159,10 @@ function DocumentLink({
))}
</>
)}
</>
</React.Fragment>
);
}
const Draggable = styled("div")`
opacity: ${(props) => (props.$isDragging || props.$isMoving ? 0.5 : 1)};
pointer-events: ${(props) => (props.$isMoving ? "none" : "all")};
`;
const Disclosure = styled(CollapsedIcon)`
position: absolute;
left: -24px;
@@ -61,7 +61,7 @@ const Header = styled.button`
display: flex;
align-items: center;
flex-shrink: 0;
padding: 20px 24px;
padding: 16px 24px;
position: relative;
background: none;
line-height: inherit;
@@ -17,7 +17,6 @@ type Props = {
menuOpen?: boolean,
iconColor?: string,
active?: boolean,
isActiveDrop?: boolean,
theme: Theme,
exact?: boolean,
depth?: number,
@@ -31,7 +30,6 @@ function SidebarLink({
to,
label,
active,
isActiveDrop,
menu,
menuOpen,
theme,
@@ -56,8 +54,7 @@ function SidebarLink({
return (
<StyledNavLink
$isActiveDrop={isActiveDrop}
activeStyle={isActiveDrop ? undefined : activeStyle}
activeStyle={activeStyle}
style={active ? activeStyle : style}
onClick={onClick}
onMouseEnter={onMouseEnter}
@@ -106,20 +103,12 @@ const StyledNavLink = styled(NavLink)`
text-overflow: ellipsis;
padding: 4px 16px;
border-radius: 4px;
background: ${(props) =>
props.$isActiveDrop ? props.theme.slateDark : "inherit"};
color: ${(props) =>
props.$isActiveDrop ? props.theme.white : props.theme.sidebarText};
color: ${(props) => props.theme.sidebarText};
font-size: 15px;
cursor: pointer;
svg {
${(props) => (props.$isActiveDrop ? `fill: ${props.theme.white};` : "")}
}
&:hover {
color: ${(props) =>
props.$isActiveDrop ? props.theme.white : props.theme.text};
color: ${(props) => props.theme.text};
}
&:focus {
+34 -36
View File
@@ -3,7 +3,6 @@ import distanceInWordsToNow from "date-fns/distance_in_words_to_now";
import format from "date-fns/format";
import * as React from "react";
import Tooltip from "components/Tooltip";
import useStores from "hooks/useStores";
let callbacks = [];
@@ -29,45 +28,44 @@ type Props = {
shorten?: boolean,
};
function Time(props: Props) {
const { auth } = useStores();
const [_, setMinutesMounted] = React.useState(0); // eslint-disable-line no-unused-vars
const callback = React.useRef();
class Time extends React.Component<Props> {
removeEachMinuteCallback: () => void;
React.useEffect(() => {
callback.current = eachMinute(() => {
setMinutesMounted((state) => ++state);
componentDidMount() {
this.removeEachMinuteCallback = eachMinute(() => {
this.forceUpdate();
});
return () => {
if (callback.current) {
callback.current();
}
};
}, []);
const { shorten, addSuffix } = props;
let content = distanceInWordsToNow(props.dateTime, {
addSuffix,
locale: auth.user ? auth.user.language : undefined,
});
if (shorten) {
content = content
.replace("about", "")
.replace("less than a minute ago", "just now")
.replace("minute", "min");
}
return (
<Tooltip
tooltip={format(props.dateTime, "MMMM Do, YYYY h:mm a")}
delay={props.tooltipDelay}
placement="bottom"
>
<time dateTime={props.dateTime}>{props.children || content}</time>
</Tooltip>
);
componentWillUnmount() {
this.removeEachMinuteCallback();
}
render() {
const { shorten, addSuffix } = this.props;
let content = distanceInWordsToNow(this.props.dateTime, {
addSuffix,
});
if (shorten) {
content = content
.replace("about", "")
.replace("less than a minute ago", "just now")
.replace("minute", "min");
}
return (
<Tooltip
tooltip={format(this.props.dateTime, "MMMM Do, YYYY h:mm a")}
delay={this.props.tooltipDelay}
placement="bottom"
>
<time dateTime={this.props.dateTime}>
{this.props.children || content}
</time>
</Tooltip>
);
}
}
export default Time;
+9 -12
View File
@@ -3,10 +3,9 @@ import "mobx-react-lite/batchingForReactDom";
import "focus-visible";
import { Provider } from "mobx-react";
import * as React from "react";
import { DndProvider } from "react-dnd";
import { HTML5Backend } from "react-dnd-html5-backend";
import { render } from "react-dom";
import { BrowserRouter as Router } from "react-router-dom";
import { initI18n } from "shared/i18n";
import stores from "stores";
import ErrorBoundary from "components/ErrorBoundary";
@@ -25,16 +24,14 @@ if (element) {
<ErrorBoundary>
<Provider {...stores}>
<Theme>
<DndProvider backend={HTML5Backend}>
<Router>
<>
<ScrollToTop>
<Routes />
</ScrollToTop>
<Toasts />
</>
</Router>
</DndProvider>
<Router>
<>
<ScrollToTop>
<Routes />
</ScrollToTop>
<Toasts />
</>
</Router>
</Theme>
</Provider>
</ErrorBoundary>,
+4 -4
View File
@@ -159,22 +159,22 @@ class CollectionMenu extends React.Component<Props> {
type: "separator",
},
{
title: `${t("Edit")}`,
title: t("Edit"),
visible: !!(collection && can.update),
onClick: this.handleEditCollectionOpen,
},
{
title: `${t("Permissions")}`,
title: t("Permissions"),
visible: !!(collection && can.update),
onClick: this.handleMembersModalOpen,
},
{
title: `${t("Export")}`,
title: t("Export"),
visible: !!(collection && can.export),
onClick: this.handleExportCollectionOpen,
},
{
title: `${t("Delete")}`,
title: t("Delete"),
visible: !!(collection && can.delete),
onClick: this.handleDeleteCollectionOpen,
},
+5 -5
View File
@@ -200,7 +200,7 @@ class DocumentMenu extends React.Component<Props> {
onClick: this.handleRestore,
},
{
title: `${t("Restore")}`,
title: t("Restore"),
visible: !collection && !!can.restore,
style: {
left: -170,
@@ -251,7 +251,7 @@ class DocumentMenu extends React.Component<Props> {
visible: !document.isStarred && !!can.star,
},
{
title: `${t("Share link")}`,
title: t("Share link"),
onClick: this.handleShareLink,
visible: canShareDocuments,
},
@@ -274,7 +274,7 @@ class DocumentMenu extends React.Component<Props> {
visible: !!can.createChildDocument,
},
{
title: `${t("Create template")}`,
title: t("Create template"),
onClick: this.handleOpenTemplateModal,
visible: !!can.update && !document.isTemplate,
},
@@ -299,12 +299,12 @@ class DocumentMenu extends React.Component<Props> {
visible: !!can.archive,
},
{
title: `${t("Delete")}`,
title: t("Delete"),
onClick: this.handleDelete,
visible: !!can.delete,
},
{
title: `${t("Move")}`,
title: t("Move"),
onClick: this.handleMove,
visible: !!can.move,
},
+3 -3
View File
@@ -78,7 +78,7 @@ class GroupMenu extends React.Component<Props> {
<DropdownMenuItems
items={[
{
title: `${t("Members")}`,
title: t("Members"),
onClick: this.props.onMembers,
visible: !!(group && can.read),
},
@@ -86,12 +86,12 @@ class GroupMenu extends React.Component<Props> {
type: "separator",
},
{
title: `${t("Edit")}`,
title: t("Edit"),
onClick: this.onEdit,
visible: !!(group && can.update),
},
{
title: `${t("Delete")}`,
title: t("Delete"),
onClick: this.onDelete,
visible: !!(group && can.delete),
},
+7 -5
View File
@@ -2,7 +2,7 @@
import { observable } from "mobx";
import { observer, inject } from "mobx-react";
import * as React from "react";
import { Trans, withTranslation, type TFunction } from "react-i18next";
import { withTranslation, type TFunction } from "react-i18next";
import { Redirect } from "react-router-dom";
import CollectionsStore from "stores/CollectionsStore";
@@ -43,7 +43,6 @@ class NewChildDocumentMenu extends React.Component<Props> {
const { label, document, collections, t } = this.props;
const collection = collections.get(document.collectionId);
const collectionName = collection ? collection.name : t("collection");
return (
<DropdownMenu label={label}>
@@ -51,9 +50,12 @@ class NewChildDocumentMenu extends React.Component<Props> {
items={[
{
title: (
<Trans>
New document in <strong>{{ collectionName }}</strong>
</Trans>
<span>
{t("New document in")}{" "}
<strong>
{collection ? collection.name : t("collection")}
</strong>
</span>
),
onClick: this.handleNewDocument,
},
+1 -1
View File
@@ -45,7 +45,7 @@ class NewTemplateMenu extends React.Component<Props> {
label={
label || (
<Button icon={<PlusIcon />} small>
{t("New template")}
{t("New template")}
</Button>
)
}
+2 -2
View File
@@ -99,7 +99,7 @@ class UserMenu extends React.Component<Props> {
type: "separator",
},
{
title: `${t("Revoke invite")}`,
title: t("Revoke invite"),
onClick: this.handleRevoke,
visible: user.isInvited,
},
@@ -109,7 +109,7 @@ class UserMenu extends React.Component<Props> {
visible: !user.isInvited && user.isSuspended,
},
{
title: `${t("Suspend account")}`,
title: t("Suspend account"),
onClick: this.handleSuspend,
visible: !user.isInvited && !user.isSuspended,
},
+2 -2
View File
@@ -79,12 +79,12 @@ export default class Collection extends BaseModel {
return result;
}
pathToDocument(documentId: string) {
pathToDocument(document: Document) {
let path;
const traveler = (nodes, previousPath) => {
nodes.forEach((childNode) => {
const newPath = [...previousPath, childNode];
if (childNode.id === documentId) {
if (childNode.id === document.id) {
path = newPath;
return;
}
+2 -2
View File
@@ -207,7 +207,7 @@ export default class Document extends BaseModel {
@action
view = () => {
// we don't record views for documents in the trash
if (this.isDeleted || !this.publishedAt) {
if (this.isDeleted) {
return;
}
@@ -268,7 +268,7 @@ export default class Document extends BaseModel {
};
move = (collectionId: string, parentDocumentId: ?string) => {
return this.store.move(this.id, collectionId, parentDocumentId);
return this.store.move(this, collectionId, parentDocumentId);
};
duplicate = () => {
+2 -2
View File
@@ -144,7 +144,7 @@ class CollectionScene extends React.Component<Props> {
<Action>
<InputSearch
source="collection"
placeholder={`${t("Search in collection")}`}
placeholder={t("Search in collection")}
collectionId={match.params.id}
/>
</Action>
@@ -207,7 +207,7 @@ class CollectionScene extends React.Component<Props> {
&nbsp;&nbsp;
{collection.private && (
<Button onClick={this.onPermissions} neutral>
{t("Manage members")}
{t("Manage members")}
</Button>
)}
</Wrapper>
+1 -1
View File
@@ -120,7 +120,7 @@ class CollectionEdit extends React.Component<Props> {
type="submit"
disabled={this.isSaving || !this.props.collection.name}
>
{this.isSaving ? `${t("Saving")}` : t("Save")}
{this.isSaving ? t("Saving") : t("Save")}
</Button>
</form>
</Flex>
@@ -92,7 +92,7 @@ class AddGroupsToCollection extends React.Component<Props> {
<Input
type="search"
placeholder={`${t("Search by group name")}`}
placeholder={t("Search by group name")}
value={this.query}
onChange={this.handleFilter}
label={t("Search groups")}
@@ -86,7 +86,7 @@ class AddPeopleToCollection extends React.Component<Props> {
<Input
type="search"
placeholder={`${t("Search by name")}`}
placeholder={t("Search by name")}
value={this.query}
onChange={this.handleFilter}
label={t("Search people")}
@@ -52,7 +52,7 @@ const MemberListItem = ({
<ButtonWrap>
<DropdownMenu>
<DropdownMenuItem onClick={openMembersModal}>
{t("Members")}
{t("Members")}
</DropdownMenuItem>
<hr />
<DropdownMenuItem onClick={onRemove}>
@@ -1,6 +1,6 @@
// @flow
import * as React from "react";
import { Trans, useTranslation } from "react-i18next";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import Membership from "models/Membership";
import User from "models/User";
@@ -46,9 +46,11 @@ const MemberListItem = ({
subtitle={
<>
{user.lastActiveAt ? (
<Trans>
Active <Time dateTime={user.lastActiveAt} /> ago
</Trans>
<>
{t("Active {{ lastActiveAt }} ago", {
lastActiveAt: <Time dateTime={user.lastActiveAt} />,
})}
</>
) : (
t("Never signed in")
)}
@@ -1,7 +1,7 @@
// @flow
import { PlusIcon } from "outline-icons";
import * as React from "react";
import { Trans, useTranslation } from "react-i18next";
import { useTranslation } from "react-i18next";
import User from "models/User";
import Avatar from "components/Avatar";
import Badge from "components/Badge";
@@ -25,9 +25,11 @@ const UserListItem = ({ user, onAdd, canEdit }: Props) => {
subtitle={
<>
{user.lastActiveAt ? (
<Trans>
Active <Time dateTime={user.lastActiveAt} /> ago
</Trans>
<>
{t("Active {{ lastActiveAt }} ago", {
lastActiveAt: <Time dateTime={user.lastActiveAt} />,
})}
</>
) : (
t("Never signed in")
)}
+1 -1
View File
@@ -148,7 +148,7 @@ class CollectionNew extends React.Component<Props> {
</HelpText>
<Button type="submit" disabled={this.isSaving || !this.name}>
{this.isSaving ? `${t("Creating")}` : t("Create")}
{this.isSaving ? t("Creating") : t("Create")}
</Button>
</form>
);
+2 -2
View File
@@ -203,7 +203,7 @@ class Header extends React.Component<Props> {
<Wrapper align="center" justify="flex-end">
{isSaving && !isPublishing && (
<Action>
<Status>{t("Saving")}</Status>
<Status>{t("Saving")}</Status>
</Action>
)}
&nbsp;
@@ -331,7 +331,7 @@ class Header extends React.Component<Props> {
disabled={publishingIsDisabled}
small
>
{isPublishing ? `${t("Publishing")}` : t("Publish")}
{isPublishing ? t("Publishing") : t("Publish")}
</Button>
</Tooltip>
</Action>
@@ -16,9 +16,8 @@ class MarkAsViewed extends React.Component<Props> {
const { document } = this.props;
this.viewTimeout = setTimeout(async () => {
const view = await document.view();
if (view) {
if (document.publishedAt) {
const view = await document.view();
document.updateLastViewed(view);
}
}, MARK_AS_VIEWED_AFTER);
+1 -1
View File
@@ -88,7 +88,7 @@ class AddPeopleToGroup extends React.Component<Props> {
<Input
type="search"
placeholder={`${t("Search by name")}`}
placeholder={t("Search by name")}
value={this.query}
onChange={this.handleFilter}
label={t("Search people")}
+1 -1
View File
@@ -82,7 +82,7 @@ class GroupMembers extends React.Component<Props> {
icon={<PlusIcon />}
neutral
>
{t("Add people")}
{t("Add people")}
</Button>
</span>
</>
+1 -1
View File
@@ -270,7 +270,7 @@ class Search extends React.Component<Props> {
)}
<ResultsWrapper pinToTop={this.pinToTop} column auto>
<SearchField
placeholder={`${t("Search")}`}
placeholder={t("Search")}
onKeyDown={this.handleKeyDown}
onChange={this.updateLocation}
defaultValue={this.query}
+1 -1
View File
@@ -146,7 +146,7 @@ class Profile extends React.Component<Props> {
.
</HelpText>
<Button type="submit" disabled={isSaving || !this.isValid}>
{isSaving ? `${t("Saving")}` : t("Save")}
{isSaving ? t("Saving") : t("Save")}
</Button>
</form>
@@ -28,7 +28,7 @@ class ImageUpload extends React.Component<Props> {
@observable isUploading: boolean = false;
@observable isCropping: boolean = false;
@observable zoom: number = 1;
@observable file: File;
file: File;
avatarEditorRef: AvatarEditor;
static defaultProps = {
@@ -128,12 +128,7 @@ class ImageUpload extends React.Component<Props> {
style={EMPTY_OBJECT}
disablePreview
>
{({ getRootProps, getInputProps, isDragActive }) => (
<div {...getRootProps()} {...{ isDragActive }}>
<input {...getInputProps()} />
{this.props.children}
</div>
)}
{this.props.children}
</Dropzone>
);
}
+9 -10
View File
@@ -1,12 +1,14 @@
// @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now";
import { observer } from "mobx-react";
import { inject, observer } from "mobx-react";
import { EditIcon } from "outline-icons";
import * as React from "react";
import { useTranslation } from "react-i18next";
import { withRouter, type RouterHistory } from "react-router-dom";
import styled from "styled-components";
import { settings } from "shared/utils/routeHelpers";
import AuthStore from "stores/AuthStore";
import DocumentsStore from "stores/DocumentsStore";
import User from "models/User";
import Avatar from "components/Avatar";
import Badge from "components/Badge";
@@ -16,23 +18,20 @@ import HelpText from "components/HelpText";
import Modal from "components/Modal";
import PaginatedDocumentList from "components/PaginatedDocumentList";
import Subheading from "components/Subheading";
import useCurrentUser from "hooks/useCurrentUser";
import useStores from "hooks/useStores";
type Props = {
user: User,
auth: AuthStore,
documents: DocumentsStore,
history: RouterHistory,
onRequestClose: () => void,
};
function UserProfile(props: Props) {
const { t } = useTranslation();
const { documents } = useStores();
const currentUser = useCurrentUser();
const { user, ...rest } = props;
const { user, auth, documents, ...rest } = props;
if (!user) return null;
const isCurrentUser = currentUser.id === user.id;
const isCurrentUser = auth.user && auth.user.id === user.id;
return (
<Modal
@@ -61,7 +60,7 @@ function UserProfile(props: Props) {
{isCurrentUser && (
<Edit>
<Button
onClick={() => props.history.push(settings())}
onClick={() => this.props.history.push(settings())}
icon={<EditIcon />}
neutral
>
@@ -104,4 +103,4 @@ const Meta = styled(HelpText)`
margin-top: -12px;
`;
export default withRouter(observer(UserProfile));
export default inject("documents", "auth")(withRouter(observer(UserProfile)));
+10 -17
View File
@@ -19,7 +19,6 @@ export default class DocumentsStore extends BaseStore<Document> {
@observable searchCache: Map<string, SearchResult[]> = new Map();
@observable starredIds: Map<string, boolean> = new Map();
@observable backlinks: Map<string, string[]> = new Map();
@observable movingDocumentId: ?string;
importFileTypes: string[] = [
"text/markdown",
@@ -451,26 +450,20 @@ export default class DocumentsStore extends BaseStore<Document> {
@action
move = async (
documentId: string,
document: Document,
collectionId: string,
parentDocumentId: ?string
) => {
this.movingDocumentId = documentId;
const res = await client.post("/documents.move", {
id: document.id,
collectionId,
parentDocumentId,
});
invariant(res && res.data, "Data not available");
try {
const res = await client.post("/documents.move", {
id: documentId,
collectionId,
parentDocumentId,
});
invariant(res && res.data, "Data not available");
res.data.documents.forEach(this.add);
res.data.collections.forEach(this.rootStore.collections.add);
this.addPolicies(res.policies);
} finally {
this.movingDocumentId = undefined;
}
res.data.documents.forEach(this.add);
res.data.collections.forEach(this.rootStore.collections.add);
this.addPolicies(res.policies);
};
@action
-18
View File
@@ -23,7 +23,6 @@ class UiStore {
@observable editMode: boolean = false;
@observable tocVisible: boolean = false;
@observable mobileSidebarVisible: boolean = false;
@observable sidebarCollapsed: boolean = false;
@observable toasts: Map<string, Toast> = new Map();
constructor() {
@@ -52,7 +51,6 @@ class UiStore {
// persisted keys
this.languagePromptDismissed = data.languagePromptDismissed;
this.sidebarCollapsed = data.sidebarCollapsed;
this.tocVisible = data.tocVisible;
this.theme = data.theme || "system";
@@ -109,21 +107,6 @@ class UiStore {
this.activeCollectionId = undefined;
};
@action
collapseSidebar = () => {
this.sidebarCollapsed = true;
};
@action
expandSidebar = () => {
this.sidebarCollapsed = false;
};
@action
toggleCollapsedSidebar = () => {
this.sidebarCollapsed = !this.sidebarCollapsed;
};
@action
showTableOfContents = () => {
this.tocVisible = true;
@@ -207,7 +190,6 @@ class UiStore {
get asJson(): string {
return JSON.stringify({
tocVisible: this.tocVisible,
sidebarCollapsed: this.sidebarCollapsed,
languagePromptDismissed: this.languagePromptDismissed,
theme: this.theme,
});
+56
View File
@@ -0,0 +1,56 @@
// flow-typed signature: c69369aa4bc769d5f1d4f6ec9c76d8f2
// flow-typed version: c6154227d1/react-dropzone_v4.x.x/flow_>=v0.104.x
declare module "react-dropzone" {
declare type ChildrenProps = {
draggedFiles: Array<File>,
acceptedFiles: Array<File>,
rejectedFiles: Array<File>,
isDragActive: boolean,
isDragAccept: boolean,
isDragReject: boolean,
...
}
declare type DropzoneFile = File & { preview?: string, ... }
declare type DropzoneProps = {
accept?: string,
children?: React$Node | (ChildrenProps) => React$Node,
disableClick?: boolean,
disabled?: boolean,
disablePreview?: boolean,
preventDropOnDocument?: boolean,
inputProps?: Object,
multiple?: boolean,
name?: string,
maxSize?: number,
minSize?: number,
className?: string,
activeClassName?: string,
acceptClassName?: string,
rejectClassName?: string,
disabledClassName?: string,
style?: Object,
activeStyle?: Object,
acceptStyle?: Object,
rejectStyle?: Object,
disabledStyle?: Object,
onClick?: (event: SyntheticMouseEvent<>) => mixed,
onDrop?: (acceptedFiles: Array<DropzoneFile>, rejectedFiles: Array<DropzoneFile>, event: SyntheticDragEvent<>) => mixed,
onDropAccepted?: (acceptedFiles: Array<DropzoneFile>, event: SyntheticDragEvent<>) => mixed,
onDropRejected?: (rejectedFiles: Array<DropzoneFile>, event: SyntheticDragEvent<>) => mixed,
onDragStart?: (event: SyntheticDragEvent<>) => mixed,
onDragEnter?: (event: SyntheticDragEvent<>) => mixed,
onDragOver?: (event: SyntheticDragEvent<>) => mixed,
onDragLeave?: (event: SyntheticDragEvent<>) => mixed,
onFileDialogCancel?: () => mixed,
...
};
declare class Dropzone extends React$Component<DropzoneProps> {
open(): void;
}
declare module.exports: typeof Dropzone;
}
+2 -4
View File
@@ -137,8 +137,6 @@
"react-autosize-textarea": "^6.0.0",
"react-avatar-editor": "^10.3.0",
"react-color": "^2.17.3",
"react-dnd": "^11.1.3",
"react-dnd-html5-backend": "^11.1.3",
"react-dom": "^16.8.6",
"react-dropzone": "^11.2.4",
"react-helmet": "^5.2.0",
@@ -150,7 +148,7 @@
"react-virtualized-auto-sizer": "^1.0.2",
"react-waypoint": "^9.0.2",
"react-window": "^1.8.6",
"rich-markdown-editor": "^11.0.11",
"rich-markdown-editor": "^11.0.7",
"semver": "^7.3.2",
"sequelize": "^6.3.4",
"sequelize-cli": "^6.2.0",
@@ -206,5 +204,5 @@
"dot-prop": "^5.2.0",
"js-yaml": "^3.13.1"
},
"version": "0.51.0"
"version": "0.50.0"
}
-32
View File
@@ -92,38 +92,6 @@ router.post("attachments.create", auth(), async (ctx) => {
};
});
router.post("attachments.delete", auth(), async (ctx) => {
let { id } = ctx.body;
ctx.assertPresent(id, "id is required");
const user = ctx.state.user;
const attachment = await Attachment.findByPk(id);
if (!attachment) {
throw new NotFoundError();
}
if (attachment.documentId) {
const document = await Document.findByPk(attachment.documentId, {
userId: user.id,
});
authorize(user, "update", document);
}
authorize(user, "delete", attachment);
await attachment.destroy();
await Event.create({
name: "attachments.delete",
teamId: user.teamId,
userId: user.id,
ip: ctx.request.ip,
});
ctx.body = {
success: true,
};
});
router.post("attachments.redirect", auth(), async (ctx) => {
const { id } = ctx.body;
ctx.assertPresent(id, "id is required");
-119
View File
@@ -1,7 +1,6 @@
/* eslint-disable flowtype/require-valid-file-annotation */
import TestServer from "fetch-test-server";
import app from "../app";
import { Attachment } from "../models";
import {
buildUser,
buildCollection,
@@ -12,127 +11,9 @@ import { flushdb } from "../test/support";
const server = new TestServer(app.callback());
jest.mock("aws-sdk", () => {
const mS3 = { deleteObject: jest.fn().mockReturnThis(), promise: jest.fn() };
return {
S3: jest.fn(() => mS3),
Endpoint: jest.fn(),
};
});
beforeEach(() => flushdb());
afterAll(() => server.close());
describe("#attachments.delete", () => {
it("should require authentication", async () => {
const res = await server.post("/api/attachments.delete");
expect(res.status).toEqual(401);
});
it("should allow deleting an attachment belonging to a document user has access to", async () => {
const user = await buildUser();
const attachment = await buildAttachment({
teamId: user.teamId,
userId: user.id,
});
const res = await server.post("/api/attachments.delete", {
body: { token: user.getJwtToken(), id: attachment.id },
});
expect(res.status).toEqual(200);
expect(await Attachment.count()).toEqual(0);
});
it("should allow deleting an attachment without a document created by user", async () => {
const user = await buildUser();
const attachment = await buildAttachment({
teamId: user.teamId,
userId: user.id,
});
attachment.documentId = null;
await attachment.save();
const res = await server.post("/api/attachments.delete", {
body: { token: user.getJwtToken(), id: attachment.id },
});
expect(res.status).toEqual(200);
expect(await Attachment.count()).toEqual(0);
});
it("should allow deleting an attachment without a document if admin", async () => {
const user = await buildUser({ isAdmin: true });
const attachment = await buildAttachment({
teamId: user.teamId,
});
attachment.documentId = null;
await attachment.save();
const res = await server.post("/api/attachments.delete", {
body: { token: user.getJwtToken(), id: attachment.id },
});
expect(res.status).toEqual(200);
expect(await Attachment.count()).toEqual(0);
});
it("should not allow deleting an attachment in another team", async () => {
const user = await buildUser({ isAdmin: true });
const attachment = await buildAttachment();
attachment.documentId = null;
await attachment.save();
const res = await server.post("/api/attachments.delete", {
body: { token: user.getJwtToken(), id: attachment.id },
});
expect(res.status).toEqual(403);
});
it("should not allow deleting an attachment without a document", async () => {
const user = await buildUser();
const attachment = await buildAttachment({
teamId: user.teamId,
});
attachment.documentId = null;
await attachment.save();
const res = await server.post("/api/attachments.delete", {
body: { token: user.getJwtToken(), id: attachment.id },
});
expect(res.status).toEqual(403);
});
it("should not allow deleting an attachment belonging to a document user does not have access to", async () => {
const user = await buildUser();
const collection = await buildCollection({
private: true,
});
const document = await buildDocument({
teamId: collection.teamId,
userId: collection.userId,
collectionId: collection.id,
});
const attachment = await buildAttachment({
teamId: document.teamId,
userId: document.userId,
documentId: document.id,
acl: "private",
});
const res = await server.post("/api/attachments.delete", {
body: { token: user.getJwtToken(), id: attachment.id },
});
expect(res.status).toEqual(403);
});
});
describe("#attachments.redirect", () => {
it("should require authentication", async () => {
const res = await server.post("/api/attachments.redirect");
+1 -1
View File
@@ -31,13 +31,13 @@ const api = new Koa();
const router = new Router();
// middlewares
api.use(errorHandling());
api.use(
bodyParser({
multipart: true,
formidable: { maxFieldsSize: 10 * 1024 * 1024 },
})
);
api.use(errorHandling());
api.use(methodOverride());
api.use(validation());
api.use(apiWrapper());
+10 -12
View File
@@ -37,20 +37,18 @@ router.post("team.update", auth(), async (ctx) => {
await team.save();
if (changes) {
for (const change of changes) {
data[change] = team[change];
}
await Event.create({
name: "teams.update",
actorId: user.id,
teamId: user.teamId,
data,
ip: ctx.request.ip,
});
for (const change of changes) {
data[change] = team[change];
}
await Event.create({
name: "teams.update",
actorId: user.id,
teamId: user.teamId,
data,
ip: ctx.request.ip,
});
ctx.body = {
data: presentTeam(team),
policies: presentPolicies(user, [team]),
-11
View File
@@ -21,17 +21,6 @@ describe("#team.update", () => {
expect(body.data.name).toEqual("New name");
});
it("should allow identical team details", async () => {
const { admin, team } = await seed();
const res = await server.post("/api/team.update", {
body: { token: admin.getJwtToken(), name: team.name },
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data.name).toEqual(team.name);
});
it("should require admin", async () => {
const { user } = await seed();
const res = await server.post("/api/team.update", {
+18 -54
View File
@@ -4,80 +4,44 @@ import debug from "debug";
import Router from "koa-router";
import { AuthenticationError } from "../errors";
import { Document, Attachment } from "../models";
import { Op, sequelize } from "../sequelize";
import parseAttachmentIds from "../utils/parseAttachmentIds";
import { Op } from "../sequelize";
const router = new Router();
const log = debug("utils");
router.post("utils.gc", async (ctx) => {
const { token, limit = 500 } = ctx.body;
const { token } = ctx.body;
if (process.env.UTILS_SECRET !== token) {
throw new AuthenticationError("Invalid secret token");
}
log(`Permanently destroying upto ${limit} documents older than 30 days…`);
log("Permanently deleting documents older than 30 days…");
const where = {
deletedAt: {
[Op.lt]: subDays(new Date(), 30),
},
};
const documents = await Document.scope("withUnpublished").findAll({
attributes: ["id", "teamId", "text"],
attributes: ["id"],
where,
});
const documentIds = documents.map((d) => d.id);
await Attachment.destroy({
where: {
deletedAt: {
[Op.lt]: subDays(new Date(), 30),
},
documentId: documentIds,
},
paranoid: false,
limit,
});
const query = `
SELECT COUNT(id)
FROM documents
WHERE "searchVector" @@ to_tsquery('english', :query) AND
"teamId" = :teamId AND
"id" != :documentId
`;
for (const document of documents) {
const attachmentIds = parseAttachmentIds(document.text);
for (const attachmentId of attachmentIds) {
const [{ count }] = await sequelize.query(query, {
type: sequelize.QueryTypes.SELECT,
replacements: {
documentId: document.id,
teamId: document.teamId,
query: attachmentId,
},
});
if (parseInt(count) === 0) {
const attachment = await Attachment.findOne({
where: {
teamId: document.teamId,
id: attachmentId,
},
});
if (attachment) {
await attachment.destroy();
log(`Attachment ${attachmentId} deleted`);
} else {
log(`Unknown attachment ${attachmentId} ignored`);
}
}
}
}
await Document.scope("withUnpublished").destroy({
where: {
id: documents.map((document) => document.id),
},
where,
force: true,
});
log(`Destroyed ${documents.length} documents`);
log(`Deleted ${documentIds.length} documents`);
ctx.body = {
success: true,
+31 -103
View File
@@ -2,141 +2,69 @@
import subDays from "date-fns/sub_days";
import TestServer from "fetch-test-server";
import app from "../app";
import { Attachment, Document } from "../models";
import { buildAttachment, buildDocument } from "../test/factories";
import { Document } from "../models";
import { sequelize } from "../sequelize";
import { buildDocument } from "../test/factories";
import { flushdb } from "../test/support";
const server = new TestServer(app.callback());
jest.mock("aws-sdk", () => {
const mS3 = { deleteObject: jest.fn().mockReturnThis(), promise: jest.fn() };
return {
S3: jest.fn(() => mS3),
Endpoint: jest.fn(),
};
});
beforeEach(() => flushdb());
afterAll(() => server.close());
describe("#utils.gc", () => {
it("should destroy documents deleted more than 30 days ago", async () => {
await buildDocument({
const document = await buildDocument({
publishedAt: new Date(),
deletedAt: subDays(new Date(), 60),
});
await sequelize.query(
`UPDATE documents SET "deletedAt" = '${subDays(
new Date(),
60
).toISOString()}' WHERE id = '${document.id}'`
);
const res = await server.post("/api/utils.gc", {
body: {
token: process.env.UTILS_SECRET,
},
});
expect(res.status).toEqual(200);
expect(await Document.scope().count()).toEqual(0);
});
it("should destroy attachments no longer referenced", async () => {
const document = await buildDocument({
publishedAt: subDays(new Date(), 90),
deletedAt: subDays(new Date(), 60),
});
const attachment = await buildAttachment({
teamId: document.teamId,
documentId: document.id,
});
document.text = `![text](${attachment.redirectUrl})`;
await document.save();
const res = await server.post("/api/utils.gc", {
body: {
token: process.env.UTILS_SECRET,
const reloaded = await Document.scope().findOne({
where: {
id: document.id,
},
paranoid: false,
});
expect(res.status).toEqual(200);
expect(await Attachment.count()).toEqual(0);
expect(await Document.scope().count()).toEqual(0);
});
it("should handle unknown attachment ids", async () => {
const document = await buildDocument({
publishedAt: subDays(new Date(), 90),
deletedAt: subDays(new Date(), 60),
});
const attachment = await buildAttachment({
teamId: document.teamId,
documentId: document.id,
});
document.text = `![text](${attachment.redirectUrl})`;
await document.save();
// remove attachment so it no longer exists in the database, this is also
// representative of a corrupt attachment id in the doc or the regex returning
// an incorrect string
await attachment.destroy({ force: true });
const res = await server.post("/api/utils.gc", {
body: {
token: process.env.UTILS_SECRET,
},
});
expect(res.status).toEqual(200);
expect(await Attachment.count()).toEqual(0);
expect(await Document.scope().count()).toEqual(0);
});
it("should not destroy attachments referenced in other documents", async () => {
const document1 = await buildDocument();
const document = await buildDocument({
teamId: document1.teamId,
publishedAt: subDays(new Date(), 90),
deletedAt: subDays(new Date(), 60),
});
const attachment = await buildAttachment({
teamId: document1.teamId,
documentId: document.id,
});
document1.text = `![text](${attachment.redirectUrl})`;
await document1.save();
document.text = `![text](${attachment.redirectUrl})`;
await document.save();
expect(await Attachment.count()).toEqual(1);
const res = await server.post("/api/utils.gc", {
body: {
token: process.env.UTILS_SECRET,
},
});
expect(res.status).toEqual(200);
expect(await Attachment.count()).toEqual(1);
expect(await Document.scope().count()).toEqual(1);
expect(reloaded).toBe(null);
});
it("should destroy draft documents deleted more than 30 days ago", async () => {
await buildDocument({
const document = await buildDocument({
publishedAt: undefined,
deletedAt: subDays(new Date(), 60),
});
await sequelize.query(
`UPDATE documents SET "deletedAt" = '${subDays(
new Date(),
60
).toISOString()}' WHERE id = '${document.id}'`
);
const res = await server.post("/api/utils.gc", {
body: {
token: process.env.UTILS_SECRET,
},
});
const reloaded = await Document.scope().findOne({
where: {
id: document.id,
},
paranoid: false,
});
expect(res.status).toEqual(200);
expect(await Document.scope().count()).toEqual(0);
expect(reloaded).toBe(null);
});
it("should require authentication", async () => {
-12
View File
@@ -119,18 +119,6 @@ app.on("error", (error, ctx) => {
if (requestId) {
scope.setTag("request_id", requestId);
}
const authType = ctx.state ? ctx.state.authType : undefined;
if (authType) {
scope.setTag("auth_type", authType);
}
const userId =
ctx.state && ctx.state.user ? ctx.state.user.id : undefined;
if (userId) {
scope.setUser({ id: userId });
}
scope.addEventProcessor(function (event) {
return Sentry.Handlers.parseRequest(event, ctx.request);
});
+1 -5
View File
@@ -45,11 +45,7 @@ router.post("email", async (ctx) => {
user.lastSigninEmailSentAt &&
user.lastSigninEmailSentAt > subMinutes(new Date(), 2)
) {
ctx.body = {
redirect: `${team.url}?notice=email-auth-ratelimit`,
message: "Rate limit exceeded",
success: false,
};
ctx.redirect(`${team.url}?notice=email-auth-ratelimit`);
return;
}
-4
View File
@@ -28,8 +28,6 @@ export default async function documentMover({
document.collectionId = collectionId;
document.parentDocumentId = null;
document.lastModifiedById = user.id;
document.updatedBy = user;
await document.save();
result.documents.push(document);
@@ -56,8 +54,6 @@ export default async function documentMover({
// add to new collection (may be the same)
document.collectionId = collectionId;
document.parentDocumentId = parentDocumentId;
document.lastModifiedById = user.id;
document.updatedBy = user;
const newCollection: Collection = collectionChanged
? await Collection.findByPk(collectionId, { transaction })
@@ -1,29 +0,0 @@
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.changeColumn(
"attachments",
"key",
{ type: Sequelize.STRING(4096), allowNull: false, }
);
await queryInterface.changeColumn(
"attachments",
"url",
{ type: Sequelize.STRING(4096), allowNull: false, }
);
},
down: async (queryInterface, Sequelize) => {
await queryInterface.changeColumn(
"attachments",
"key",
{ type: Sequelize.STRING(255), allowNull: false, }
);
await queryInterface.changeColumn(
"attachments",
"url",
{ type: Sequelize.STRING(255), allowNull: false, }
);
}
};
@@ -1,37 +0,0 @@
const tableName = 'attachments';
// because of this issue in Sequelize the foreign key constraint may be named differently depending
// on when the previous migrations were ran https://github.com/sequelize/sequelize/pull/9890
const constraintNames = ['attachments_documentId_fkey', 'attachments_foreign_idx'];
module.exports = {
up: async (queryInterface, Sequelize) => {
let error;
for (const constraintName of constraintNames) {
try {
await queryInterface.sequelize.query(`alter table "${tableName}" drop constraint "${constraintName}"`)
return;
} catch (err) {
error = err;
}
}
throw error;
},
down: async (queryInterface, Sequelize) => {
let error;
for (const constraintName of constraintNames) {
try {
await queryInterface.sequelize.query(
`alter table "${tableName}"
add constraint "${constraintName}" foreign key("documentId") references "documents" ("id")
on delete cascade`
);
return;
} catch (err) {
error = err;
}
}
throw error;
},
};
-14
View File
@@ -1,14 +0,0 @@
// @flow
import { Attachment, User } from "../models";
import policy from "./policy";
const { allow } = policy;
allow(User, "create", Attachment);
allow(User, "delete", Attachment, (actor, attachment) => {
if (!attachment || attachment.teamId !== actor.teamId) return false;
if (actor.isAdmin) return true;
if (actor.id === attachment.userId) return true;
return false;
});
+2 -3
View File
@@ -1,8 +1,7 @@
// @flow
import { Attachment, Team, User, Collection, Document, Group } from "../models";
import { Team, User, Collection, Document, Group } from "../models";
import policy from "./policy";
import "./apiKey";
import "./attachment";
import "./collection";
import "./document";
import "./integration";
@@ -25,7 +24,7 @@ type Policy = {
*/
export function serialize(
model: User,
target: Attachment | Team | Collection | Document | Group
target: Team | Collection | Document | Group
): Policy {
let output = {};
+6 -3
View File
@@ -1,7 +1,6 @@
// @flow
import { takeRight } from "lodash";
import { Attachment, Document, User } from "../models";
import parseAttachmentIds from "../utils/parseAttachmentIds";
import { getSignedImageUrl } from "../utils/s3";
import presentUser from "./user";
@@ -9,9 +8,13 @@ type Options = {
isPublic?: boolean,
};
const attachmentRegex = /!\[.*?\]\(\/api\/attachments\.redirect\?id=(?<id>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\)/gi;
// replaces attachments.redirect urls with signed/authenticated url equivalents
async function replaceImageAttachments(text: string) {
const attachmentIds = parseAttachmentIds(text);
async function replaceImageAttachments(text) {
const attachmentIds = [...text.matchAll(attachmentRegex)].map(
(match) => match.groups && match.groups.id
);
for (const id of attachmentIds) {
const attachment = await Attachment.findByPk(id);
+2 -2
View File
@@ -8,6 +8,7 @@ import sendfile from "koa-sendfile";
import serve from "koa-static";
import { languages } from "../shared/i18n";
import environment from "./env";
import { NotFoundError } from "./errors";
import apexRedirect from "./middlewares/apexRedirect";
import { opensearchResponse } from "./utils/opensearch";
import { robotsResponse } from "./utils/robots";
@@ -77,8 +78,7 @@ router.get("/locales/:lng.json", async (ctx) => {
let { lng } = ctx.params;
if (!languages.includes(lng)) {
ctx.status = 404;
return;
throw new NotFoundError();
}
if (process.env.NODE_ENV === "production") {
-8
View File
@@ -1,8 +0,0 @@
// @flow
const attachmentRegex = /!\[.*?\]\(\/api\/attachments\.redirect\?id=(?<id>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\)/gi;
export default function parseAttachmentIds(text: any): string[] {
return [...text.matchAll(attachmentRegex)].map(
(match) => match.groups && match.groups.id
);
}
+1 -1
View File
@@ -59,7 +59,7 @@ export const makePolicy = (
expiration: format(tomorrow, "YYYY-MM-DDTHH:mm:ss\\Z"),
};
return Buffer.from(JSON.stringify(policy)).toString("base64");
return new Buffer(JSON.stringify(policy)).toString("base64");
};
export const getSignature = (policy: any) => {
-1
View File
@@ -36,7 +36,6 @@ export const languageOptions = [
{ label: "Deutsch (Deutschland)", value: "de_DE" },
{ label: "Español (España)", value: "es_ES" },
{ label: "Français (France)", value: "fr_FR" },
{ label: "한국어 (Korean)", value: "ko_KR" },
{ label: "Português (Portugal)", value: "pt_PT" },
];
+12 -12
View File
@@ -15,16 +15,16 @@ describe("i18n process.env is unset", () => {
});
it("translation of key should match", () =>
expect(i18n.t("Saving")).toBe("Saving"));
expect(i18n.t("Saving")).toBe("Saving"));
it("translation if changed to de_DE", () => {
i18n.changeLanguage("de_DE");
expect(i18n.t("Saving")).toBe("Speichert");
expect(i18n.t("Saving")).toBe("Speichert");
});
it("translation if changed to pt_PT", () => {
i18n.changeLanguage("pt_PT");
expect(i18n.t("Saving")).toBe("A guardar");
expect(i18n.t("Saving")).toBe("A guardar");
});
});
@@ -38,16 +38,16 @@ describe("i18n process.env is en_US", () => {
});
it("translation of key should match", () =>
expect(i18n.t("Saving")).toBe("Saving"));
expect(i18n.t("Saving")).toBe("Saving"));
it("translation if changed to de_DE", () => {
i18n.changeLanguage("de_DE");
expect(i18n.t("Saving")).toBe("Speichert");
expect(i18n.t("Saving")).toBe("Speichert");
});
it("translation if changed to pt_PT", () => {
i18n.changeLanguage("pt_PT");
expect(i18n.t("Saving")).toBe("A guardar");
expect(i18n.t("Saving")).toBe("A guardar");
});
});
@@ -61,16 +61,16 @@ describe("i18n process.env is de_DE", () => {
});
it("translation of key should match", () =>
expect(i18n.t("Saving")).toBe("Speichert"));
expect(i18n.t("Saving")).toBe("Speichert"));
it("translation if changed to en_US", () => {
i18n.changeLanguage("en_US");
expect(i18n.t("Saving")).toBe("Saving");
expect(i18n.t("Saving")).toBe("Saving");
});
it("translation if changed to pt_PT", () => {
i18n.changeLanguage("pt_PT");
expect(i18n.t("Saving")).toBe("A guardar");
expect(i18n.t("Saving")).toBe("A guardar");
});
});
@@ -84,15 +84,15 @@ describe("i18n process.env is pt_PT", () => {
});
it("translation of key should match", () =>
expect(i18n.t("Saving")).toBe("A guardar"));
expect(i18n.t("Saving")).toBe("A guardar"));
it("translation if changed to en_US", () => {
i18n.changeLanguage("en_US");
expect(i18n.t("Saving")).toBe("Saving");
expect(i18n.t("Saving")).toBe("Saving");
});
it("translation if changed to de_DE", () => {
i18n.changeLanguage("de_DE");
expect(i18n.t("Saving")).toBe("Speichert");
expect(i18n.t("Saving")).toBe("Speichert");
});
});
+40 -49
View File
@@ -7,16 +7,6 @@
"Archive": "Archiv",
"Drafts": "Entwürfe",
"Templates": "Vorlagen",
"Deleted Collection": "Sammlung löschen",
"deleted": "gelöscht",
"archived": "archiviert",
"created": "erstellt",
"published": "veröffentlicht",
"saved": "gespeichert",
"updated": "aktualisiert",
"Never viewed": "Nie angeschaut",
"Viewed": "Angeschaut",
"in": "in",
"New": "Neu",
"Only visible to you": "Nur für Sie sichtbar",
"Draft": "Entwurf",
@@ -43,7 +33,7 @@
"Delete table": "Tabelle löschen",
"Italic": "Kursiv",
"Sorry, that link wont work for this embed type": "Dieser Link funktioniert für diesen Einbettungstyp leider nicht",
"Find or create a doc": "Suchen oder erstellen Sie ein Dokument",
"Find or create a doc": "Suchen oder erstellen Sie ein Dokument",
"Big heading": "Große Überschrift",
"Medium heading": "Mittlere Überschrift",
"Small heading": "Kleine Überschrift",
@@ -56,17 +46,17 @@
"Link": "Link",
"Link copied to clipboard": "Link in die Zwischenablage kopiert",
"Highlight": "Hervorheben",
"Type '/' to insert": "Geben Sie '/' zum einfügen",
"Keep typing to filter": "Tippen Sie weiter um zu filtern",
"Type '/' to insert": "Geben Sie '/' zum Einzufügen ein",
"Keep typing to filter": "Tippen Sie weiter um zu filtern",
"No results": "Keine Ergebnisse",
"Open link": "Link öffnen",
"Ordered list": "Nummerierte Liste",
"Paste a link": "Link einfügen",
"Paste a link": "Link einfügen",
"Paste a {{service}} link…": "{{service}} Link einfügen…",
"Placeholder": "Platzhalter",
"Quote": "Zitat",
"Remove link": "Link entfernen",
"Search or paste a link": "Suchen oder Einfügen eines Links",
"Search or paste a link": "Suchen oder Einfügen eines Links",
"Strikethrough": "Durchstreichen",
"Bold": "Fett",
"Subheading": "Untertitel",
@@ -75,17 +65,13 @@
"Tip notice": "Tipp Hinweis",
"Warning": "Warnung",
"Warning notice": "Warnhinweis",
"Icon": "Icon",
"Loading": "Laden",
"Search": "Suche",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline ist in Ihrer Sprache {{optionLabel}} verfügbar. Möchten Sie diese ändern?",
"Change Language": "Sprache ändern",
"Dismiss": "Ablehnen",
"Search…": "Suche…",
"Keyboard shortcuts": "Tastaturkürzel",
"New collection": "Neue Sammlung",
"New collection": "Neue Sammlung",
"Collections": "Sammlungen",
"Untitled": "Ohne Titel",
"Home": "Startseite",
"Search": "Suche",
"Starred": "Favoriten",
"Invite people…": "Personen einladen…",
"Invite people": "Personen einladen",
@@ -106,8 +92,8 @@
"API documentation": "API Dokumentation",
"Changelog": "Änderungsprotokoll",
"Send us feedback": "Schicken Sie uns Feedback",
"Report a bug": "Ein technischer Fehler melden",
"Appearance": "Darstellung",
"Report a bug": "Ein technischen Fehler melden",
"Appearance": "Aussehen",
"System": "System",
"Light": "Hell",
"Dark": "Dunkel",
@@ -115,10 +101,10 @@
"Collection permissions": "Sammlungsberechtigungen",
"New document": "Neues Dokument",
"Import document": "Dokument importieren",
"Edit": "Bearbeiten",
"Permissions": "Berechtigungen",
"Export": "Exportieren",
"Delete": "Löschen",
"Edit": "Bearbeiten",
"Permissions": "Berechtigungen",
"Export": "Exportieren",
"Delete": "Löschen",
"Edit collection": "Sammlung bearbeiten",
"Delete collection": "Sammlung löschen",
"Export collection": "Sammlung exportieren",
@@ -127,30 +113,33 @@
"Document restored": "Dokument wiederhergestellt",
"Document unpublished": "Dokument unveröffentlicht",
"Restore": "Wiederherstellen",
"Restore…": "Wiederherstellen…",
"Choose a collection": "Sammlung auswählen",
"Unpin": "Lospinnen",
"Pin to collection": "Zur Sammlung anpinnen",
"Unstar": "Aus den Favoriten entfernen",
"Star": "Favorisieren",
"Share link": "Link teilen",
"Share link": "Link teilen",
"Enable embeds": "Einbettungen aktivieren",
"Disable embeds": "Einbettungen deaktivieren",
"New nested document": "Neues verschachteltes Dokument",
"Create template": "Vorlage erstellen",
"Create template": "Vorlage erstellen",
"Edit": "Bearbeiten",
"Duplicate": "Duplizieren",
"Unpublish": "Nicht veröffentlichen",
"Move": "Verschieben",
"Move": "Verschieben",
"History": "Verlauf",
"Download": "Herunterladen",
"Print": "Drucken",
"Delete {{ documentName }}": "{{ documentName }} löschen",
"Create template": "Vorlage erstellen",
"Share document": "Dokument teilen",
"Edit group": "Gruppe bearbeiten",
"Delete group": "Gruppe löschen",
"Members": "Mitglieder",
"Members": "Mitglieder",
"New document in": "Neues Dokument in",
"collection": "Sammlung",
"New document in <1>{{collectionName}}</1>": "Neues Dokument in <1>{{collectionName}}</1>",
"New template": "Neue Vorlage",
"New template…": "Neue Vorlage…",
"Link copied": "Link wurde kopiert",
"Restore version": "Version wiederherstellen",
"Copy link": "Link kopieren",
@@ -158,22 +147,22 @@
"Share link copied": "Freigabelink wurde kopiert",
"Go to document": "Zum Dokument gehen",
"Revoke link": "Link widerrufen",
"By {{ author }}": "Von {{ author }}",
"By {{ author }}": "von {{author}}",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Sind Sie sicher, dass Sie {{ userName }} zu einem Administrator machen möchten? Administratoren können Team- und Rechnungsinformationen ändern.",
"Are you sure you want to make {{ userName }} a member?": "Sind Sie sicher, dass Sie {{ userName }} zu einem Mitglied machen möchten?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Möchten Sie dieses Konto wirklich sperren? Gesperrte Benutzer können sich nicht anmelden.",
"Make {{ userName }} a member…": "{{ userName }} zu einem Mitglied machen…",
"Make {{ userName }} an admin…": "{{ userName }} zu einem Admin machen…",
"Revoke invite": "Einladung widerrufen",
"Revoke invite": "Einladung widerrufen",
"Activate account": "Konto aktivieren",
"Suspend account": "Konto sperren",
"Suspend account": "Konto sperren",
"Documents": "Dokumente",
"The document archive is empty at the moment.": "Das Dokumentenarchiv ist momentan leer.",
"Search in collection": "Suche in Sammlung",
"Search in collection": "Suche in Sammlung",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> enthält noch keine Dokumente.",
"Get started by creating a new one!": "Erstellen Sie zunächst ein neues Dokument!",
"Create a document": "Dokument erstellen",
"Manage members": "Mitglieder verwalten",
"Manage members": "Mitglieder verwalten",
"Pinned": "Gepinned",
"Recently updated": "Vor Kurzem aktualisiert",
"Recently published": "Vor Kurzem veröffentlicht",
@@ -184,15 +173,15 @@
"Name": "Name",
"Description": "Beschreibung",
"More details about this collection…": "Weitere Details zu dieser Sammlung…",
"Private collection": "Private Sammlung",
"Private collection": "private Sammlung",
"A private collection will only be visible to invited team members.": "Eine private Sammlung ist nur für eingeladene Teammitglieder sichtbar.",
"Saving": "Speichert",
"Saving": "Speichert",
"Save": "Speichern",
"{{ groupName }} was added to the collection": "{{ groupName }} wurde zur Sammlung hinzugefügt",
"Could not add user": "Benutzer kann nicht hinzugefügt werden",
"Cant find the group youre looking for?": "Sie können die gesuchte Gruppe nicht finden?",
"Create a group": "Gruppe erstellen",
"Search by group name": "Suche nach Gruppennamen",
"Search by group name": "Suche nach Gruppennamen",
"Search groups": "Gruppen suchen",
"No groups matching your search": "Keine Gruppen, die Ihrer Suche entsprechen",
"No groups left to add": "Keine Gruppen übrig zum Hinzufügen",
@@ -200,21 +189,22 @@
"{{ userName }} was added to the collection": "{{ userName }} wurde zur Sammlung hinzugefügt",
"Need to add someone whos not yet on the team yet?": "Müssen Sie jemanden hinzufügen, der noch nicht im Team ist?",
"Invite people to {{ teamName }}": "Personen zu {{ teamName }} einladen",
"Search by name": "Nach Name suchen",
"Search by name": "Nach Name suchen",
"Search people": "Personen suchen",
"No people matching your search": "Keine Personen, die Ihrer Suche entsprechen",
"No people left to add": "Keine Personen übrig zum Hinzufügen",
"Read only": "Schreibgeschützt",
"Read & Edit": "Lesen & Bearbeiten",
"Permissions": "Berechtigungen",
"Remove": "Entfernen",
"Active <1></1> ago": "Aktiv vor <1></1>",
"Active {{ lastActiveAt }} ago": "Aktiv vor {{ lastActiveAt }}",
"Never signed in": "Nie angemeldet",
"Invited": "Eingeladen",
"Admin": "Administrator",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Sammlungen dienen zur Gruppierung Ihrer Wissensbasis. Sie funktionieren am besten, wenn sie nach einem Thema oder einem internen Team organisiert sind - beispielsweise nach Produkt oder Engineering.",
"Creating": "Erstellen",
"Creating": "Wird erstellt…",
"Create": "Erstellen",
"Recently viewed": "Zuletzt angesehen",
"Recently viewed": "Vor Kurzem angesehen",
"Created by me": "Von mir erstellt",
"Hide contents": "Inhalt ausblenden",
"Show contents": "Inhalt anzeigen",
@@ -227,7 +217,7 @@
"New from template": "Neu aus Vorlage",
"Publish": "Veröffentlichen",
"Publish document": "Dokument veröffentlichen",
"Publishing": "Am Veröffentlichen",
"Publishing": "Am Veröffentlichen",
"No documents found for your filters.": "Keine Dokumente anhand Ihre Filter gefunden.",
"Youve not got any drafts at the moment.": "Sie haben im Moment keine Entwürfe.",
"Not found": "Nicht gefunden",
@@ -235,13 +225,13 @@
"Offline": "Offline",
"We were unable to load the document while offline.": "Wir konnten das Dokument nicht offline laden.",
"Your account has been suspended": "Ihr Konto wurde gesperrt",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "Ein Administrator (<1>{{suspendedContactEmail}}</1>) hat Ihr Konto gesperrt. Um Ihr Konto wieder zu aktivieren, wenden Sie sich bitte direkt an diesen.",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "Ein Teamadministrator (<1>{{suspendedContactEmail}}</1>) hat Ihr Konto gesperrt. Um Ihr Konto wieder zu aktivieren, wenden Sie sich bitte direkt an diesen.",
"{{userName}} was added to the group": "{{userName}} wurde zur Gruppe hinzugefügt",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "Fügen Sie unten Teammitglieder hinzu, um ihnen Zugriff auf die Gruppe zu gewähren. Sie müssen jemanden hinzufügen, der noch nicht im Team ist?",
"Invite them to {{teamName}}": "Personen zu {{teamName}} einladen",
"{{userName}} was removed from the group": "{{userName}} wurde aus der Gruppe entfernt",
"Could not remove user": "Benutzer konnte nicht entfernt werden",
"Add people": "Personen hinzufügen",
"Add people": "Personen hinzufügen",
"This group has no members.": "Diese Gruppe hat keine Mitglieder.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline ist so konzipiert, dass es schnell und einfach zu bedienen ist. Alle Ihre üblichen Tastaturkürzel funktionieren hier, und es gibt auch Markdown.",
"Navigation": "Navigation",
@@ -284,6 +274,7 @@
"Delete Account": "Konto löschen",
"You may delete your account at any time, note that this is unrecoverable": "Sie können Ihren Account jederzeit löschen, beachten Sie, dass dies nicht wiederhergestellt werden kann",
"Delete account": "Konto löschen",
"Recently Updated": "Vor Kurzem Aktualisiert",
"Alphabetical": "Alphabetisch",
"Youve not starred any documents yet.": "Keine Favoriten.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "Es gibt noch keine Vorlagen. Sie können Vorlagen erstellen, mit denen Ihr Team eine konsistente und genaue Dokumentation erstellen kann.",
+34 -31
View File
@@ -43,7 +43,7 @@
"Delete table": "Delete table",
"Italic": "Italic",
"Sorry, that link wont work for this embed type": "Sorry, that link wont work for this embed type",
"Find or create a doc": "Find or create a doc",
"Find or create a doc": "Find or create a doc",
"Big heading": "Big heading",
"Medium heading": "Medium heading",
"Small heading": "Small heading",
@@ -56,17 +56,17 @@
"Link": "Link",
"Link copied to clipboard": "Link copied to clipboard",
"Highlight": "Highlight",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"No results": "No results",
"Open link": "Open link",
"Ordered list": "Ordered list",
"Paste a link": "Paste a link",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "Paste a {{service}} link…",
"Placeholder": "Placeholder",
"Quote": "Quote",
"Remove link": "Remove link",
"Search or paste a link": "Search or paste a link",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "Strikethrough",
"Bold": "Bold",
"Subheading": "Subheading",
@@ -76,18 +76,17 @@
"Warning": "Warning",
"Warning notice": "Warning notice",
"Icon": "Icon",
"Loading": "Loading",
"Search": "Search",
"Loading": "Loading",
"Search": "Search",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline is available in your language {{optionLabel}}, would you like to change?",
"Change Language": "Change Language",
"Dismiss": "Dismiss",
"Keyboard shortcuts": "Keyboard shortcuts",
"Expand": "Expand",
"Collapse": "Collapse",
"New collection": "New collection",
"New collection…": "New collection…",
"Collections": "Collections",
"Untitled": "Untitled",
"Home": "Home",
"Search": "Search",
"Starred": "Starred",
"Invite people…": "Invite people…",
"Invite people": "Invite people",
@@ -117,10 +116,10 @@
"Collection permissions": "Collection permissions",
"New document": "New document",
"Import document": "Import document",
"Edit": "Edit",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit": "Edit",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "Edit collection",
"Delete collection": "Delete collection",
"Export collection": "Export collection",
@@ -129,30 +128,33 @@
"Document restored": "Document restored",
"Document unpublished": "Document unpublished",
"Restore": "Restore",
"Restore…": "Restore…",
"Choose a collection": "Choose a collection",
"Unpin": "Unpin",
"Pin to collection": "Pin to collection",
"Unstar": "Unstar",
"Star": "Star",
"Share link": "Share link",
"Share link": "Share link",
"Enable embeds": "Enable embeds",
"Disable embeds": "Disable embeds",
"New nested document": "New nested document",
"Create template": "Create template",
"Create template": "Create template",
"Edit": "Edit",
"Duplicate": "Duplicate",
"Unpublish": "Unpublish",
"Move": "Move",
"Move": "Move",
"History": "History",
"Download": "Download",
"Print": "Print",
"Delete {{ documentName }}": "Delete {{ documentName }}",
"Create template": "Create template",
"Share document": "Share document",
"Edit group": "Edit group",
"Delete group": "Delete group",
"Members": "Members",
"Members": "Members",
"New document in": "New document in",
"collection": "collection",
"New document in <1>{{collectionName}}</1>": "New document in <1>{{collectionName}}</1>",
"New template": "New template",
"New template…": "New template…",
"Link copied": "Link copied",
"Restore version": "Restore version",
"Copy link": "Copy link",
@@ -166,16 +168,16 @@
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Are you sure you want to suspend this account? Suspended users will be prevented from logging in.",
"Make {{ userName }} a member…": "Make {{ userName }} a member…",
"Make {{ userName }} an admin…": "Make {{ userName }} an admin…",
"Revoke invite": "Revoke invite",
"Revoke invite": "Revoke invite",
"Activate account": "Activate account",
"Suspend account": "Suspend account",
"Suspend account": "Suspend account",
"Documents": "Documents",
"The document archive is empty at the moment.": "The document archive is empty at the moment.",
"Search in collection": "Search in collection",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> doesnt contain any documents yet.",
"Get started by creating a new one!": "Get started by creating a new one!",
"Create a document": "Create a document",
"Manage members": "Manage members",
"Manage members": "Manage members",
"Pinned": "Pinned",
"Recently updated": "Recently updated",
"Recently published": "Recently published",
@@ -188,13 +190,13 @@
"More details about this collection…": "More details about this collection…",
"Private collection": "Private collection",
"A private collection will only be visible to invited team members.": "A private collection will only be visible to invited team members.",
"Saving": "Saving",
"Saving": "Saving",
"Save": "Save",
"{{ groupName }} was added to the collection": "{{ groupName }} was added to the collection",
"Could not add user": "Could not add user",
"Cant find the group youre looking for?": "Cant find the group youre looking for?",
"Create a group": "Create a group",
"Search by group name": "Search by group name",
"Search by group name": "Search by group name",
"Search groups": "Search groups",
"No groups matching your search": "No groups matching your search",
"No groups left to add": "No groups left to add",
@@ -202,19 +204,20 @@
"{{ userName }} was added to the collection": "{{ userName }} was added to the collection",
"Need to add someone whos not yet on the team yet?": "Need to add someone whos not yet on the team yet?",
"Invite people to {{ teamName }}": "Invite people to {{ teamName }}",
"Search by name": "Search by name",
"Search by name": "Search by name",
"Search people": "Search people",
"No people matching your search": "No people matching your search",
"No people left to add": "No people left to add",
"Read only": "Read only",
"Read & Edit": "Read & Edit",
"Permissions": "Permissions",
"Remove": "Remove",
"Active <1></1> ago": "Active <1></1> ago",
"Active {{ lastActiveAt }} ago": "Active {{ lastActiveAt }} ago",
"Never signed in": "Never signed in",
"Invited": "Invited",
"Admin": "Admin",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.",
"Creating": "Creating",
"Creating": "Creating",
"Create": "Create",
"Recently viewed": "Recently viewed",
"Created by me": "Created by me",
@@ -229,7 +232,7 @@
"New from template": "New from template",
"Publish": "Publish",
"Publish document": "Publish document",
"Publishing": "Publishing",
"Publishing": "Publishing",
"No documents found for your filters.": "No documents found for your filters.",
"Youve not got any drafts at the moment.": "Youve not got any drafts at the moment.",
"Not found": "Not found",
@@ -243,7 +246,7 @@
"Invite them to {{teamName}}": "Invite them to {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} was removed from the group",
"Could not remove user": "Could not remove user",
"Add people": "Add people",
"Add people": "Add people",
"This group has no members.": "This group has no members.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.",
"Navigation": "Navigation",
+34 -43
View File
@@ -7,16 +7,6 @@
"Archive": "Archivar",
"Drafts": "Borradores",
"Templates": "Plantillas",
"Deleted Collection": "Colección Eliminada",
"deleted": "eliminado",
"archived": "archivado",
"created": "creado",
"published": "publicado",
"saved": "guardado",
"updated": "actualizado",
"Never viewed": "Nunca visto",
"Viewed": "Visto",
"in": "en",
"New": "Nuevo",
"Only visible to you": "Solo visible para ti",
"Draft": "Borrador",
@@ -43,7 +33,7 @@
"Delete table": "Eliminar tabla",
"Italic": "Cursiva",
"Sorry, that link wont work for this embed type": "Lo sentimos, ese enlace no funcionará para este tipo embebido",
"Find or create a doc": "Buscar o crear un documento",
"Find or create a doc": "Buscar o crear un documento",
"Big heading": "Título grande",
"Medium heading": "Título medio",
"Small heading": "Título pequeño",
@@ -56,17 +46,17 @@
"Link": "Enlace",
"Link copied to clipboard": "Enlace copiado al porta papeles",
"Highlight": "Resaltar",
"Type '/' to insert": "Escriba '/' para insertar",
"Keep typing to filter": "Sigue escribiendo para filtrar",
"Type '/' to insert": "Escriba '/' para insertar",
"Keep typing to filter": "Sigue escribiendo para filtrar",
"No results": "No hay resultados",
"Open link": "Abrir enlace",
"Ordered list": "Lista ordenada",
"Paste a link": "Pegar un enlace",
"Paste a link": "Pegar un enlace",
"Paste a {{service}} link…": "Pegar un enlace de {{service}}…",
"Placeholder": "Marcador",
"Quote": "Cita",
"Remove link": "Eliminar enlace",
"Search or paste a link": "Buscar o pegar un enlace",
"Search or paste a link": "Buscar o pegar un enlace",
"Strikethrough": "Tachado",
"Bold": "Negrita",
"Subheading": "Subtítulo",
@@ -75,17 +65,13 @@
"Tip notice": "Aviso de sugerencia",
"Warning": "Advertencia",
"Warning notice": "Aviso de advertencia",
"Icon": "Ícono",
"Loading": "Cargando",
"Search": "Buscar",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline is available in your language {{optionLabel}}, would you like to change?",
"Change Language": "Cambiar Idioma",
"Dismiss": "Descartar",
"Search…": "Buscar…",
"Keyboard shortcuts": "Atajos del teclado",
"New collection": "Nueva colección",
"New collection": "Nueva colección",
"Collections": "Colecciones",
"Untitled": "Sin título",
"Home": "Inicio",
"Search": "Buscar",
"Starred": "Favoritos",
"Invite people…": "Invitar personas…",
"Invite people": "Invitar personas",
@@ -115,10 +101,10 @@
"Collection permissions": "Permisos de colección",
"New document": "Nuevo documento",
"Import document": "Importar documento",
"Edit": "Editar",
"Permissions": "Permisos",
"Export": "Exportar",
"Delete": "Borrar",
"Edit": "Editar",
"Permissions": "Permisos",
"Export": "Exportar",
"Delete": "Borrar",
"Edit collection": "Editar colección",
"Delete collection": "Eliminar colección",
"Export collection": "Exportar colección",
@@ -127,30 +113,33 @@
"Document restored": "Documento restaurado",
"Document unpublished": "Documento no publicado",
"Restore": "Restaurar",
"Restore…": "Restaurar…",
"Choose a collection": "Elige una Colección",
"Unpin": "Eliminar fijado",
"Pin to collection": "Fijar a colección",
"Unstar": "Eliminar de favoritos",
"Star": "Favorito",
"Share link": "Compartir enlace",
"Share link": "Compartir enlace",
"Enable embeds": "Habilitar embeds",
"Disable embeds": "Desactivar embeds",
"New nested document": "Nuevo documento anidado",
"Create template": "Crear plantilla",
"Create template": "Crear plantilla",
"Edit": "Editar",
"Duplicate": "Duplicar",
"Unpublish": "Cancelar publicación",
"Move": "Mover",
"Move": "Mover",
"History": "Historial",
"Download": "Descargar",
"Print": "Imprimir",
"Delete {{ documentName }}": "Eliminar {{ documentName }}",
"Create template": "Crear plantilla",
"Share document": "Compartir documento",
"Edit group": "Editar grupo",
"Delete group": "Eliminar grupo",
"Members": "Miembros",
"Members": "Miembros",
"New document in": "Nuevo documento en",
"collection": "colección",
"New document in <1>{{collectionName}}</1>": "Nuevo documento en <1>{{collectionName}}</1>",
"New template": "Nueva plantilla",
"New template…": "Nueva plantilla…",
"Link copied": "Enlace copiado",
"Restore version": "Restaurar versión",
"Copy link": "Copiar enlace",
@@ -164,16 +153,16 @@
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "¿Está seguro que desea suspender esta cuenta? Los usuarios suspendidos no podrán iniciar sesión.",
"Make {{ userName }} a member…": "Hacer a {{ userName }} un miembro…",
"Make {{ userName }} an admin…": "Hacer a {{ userName }} un administrador…",
"Revoke invite": "Revocar Invitación",
"Revoke invite": "Revocar Invitación",
"Activate account": "Activar cuenta",
"Suspend account": "Suspender Cuenta",
"Suspend account": "Suspender Cuenta",
"Documents": "Documentos",
"The document archive is empty at the moment.": "El archivo de documento está vacío en este momento.",
"Search in collection": "Buscar en colección",
"Search in collection": "Buscar en colección",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> todavía no contiene ningún documento.",
"Get started by creating a new one!": "¡Empiece creando uno nuevo!",
"Create a document": "Crear Documento",
"Manage members": "Administrar miembros",
"Manage members": "Administrar miembros",
"Pinned": "Fijado",
"Recently updated": "Recientemente actualizado",
"Recently published": "Recientemente publicado",
@@ -186,13 +175,13 @@
"More details about this collection…": "Más detalles sobre esta colección…",
"Private collection": "Colección privada",
"A private collection will only be visible to invited team members.": "Una colección privada sólo será visible para los miembros invitados del equipo.",
"Saving": "Guardando",
"Saving": "Guardando",
"Save": "Guardar",
"{{ groupName }} was added to the collection": "{{ groupName }} fue agregado a la colección",
"Could not add user": "No se pudo agregar al usuario",
"Cant find the group youre looking for?": "¿No encuentras el grupo que estás buscando?",
"Create a group": "Crear un grupo",
"Search by group name": "Buscar por nombre de grupo",
"Search by group name": "Buscar por nombre de grupo",
"Search groups": "Buscar grupos",
"No groups matching your search": "No hay proyectos que coincidan con tu búsqueda",
"No groups left to add": "No quedan grupos para agregar",
@@ -200,19 +189,20 @@
"{{ userName }} was added to the collection": "{{ userName }} fue agregado a la colección",
"Need to add someone whos not yet on the team yet?": "¿Necesitas añadir a alguien que todavía no está en el equipo?",
"Invite people to {{ teamName }}": "Invitar personas a {{ teamName }}",
"Search by name": "Buscar por nombre",
"Search by name": "Buscar por nombre",
"Search people": "Buscar personas",
"No people matching your search": "No hay personas que coincidan con su búsqueda",
"No people left to add": "No quedan personas para agregar",
"Read only": "Solo lectura",
"Read & Edit": "Leer y editar",
"Permissions": "Permisos",
"Remove": "Eliminar",
"Active <1></1> ago": "Activo hace <1></1>",
"Active {{ lastActiveAt }} ago": "Activo hace {{ lastActiveAt }}",
"Never signed in": "No ha iniciado sesión nunca",
"Invited": "Invitado",
"Admin": "Admin",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Las colecciones sirven para agrupar su base de conocimientos. Funcionan mejor cuando se organizan en torno a un tema o un equipo interno: producto o ingeniería, por ejemplo.",
"Creating": "Creando",
"Creating": "Creando",
"Create": "Crear",
"Recently viewed": "Recientemente vistos",
"Created by me": "Creado por mí",
@@ -227,7 +217,7 @@
"New from template": "Nuevo desde plantilla",
"Publish": "Publicar",
"Publish document": "Publicar documento",
"Publishing": "Publicando",
"Publishing": "Publicando",
"No documents found for your filters.": "No se encontraron documentos para sus filtros.",
"Youve not got any drafts at the moment.": "No tienes borradores en este momento.",
"Not found": "No encontrado",
@@ -241,7 +231,7 @@
"Invite them to {{teamName}}": "Invítalos a {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} fue eliminado del grupo",
"Could not remove user": "No se pudo remover al usuario",
"Add people": "Agregar personas",
"Add people": "Agregar personas",
"This group has no members.": "Este grupo no tiene miembros.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline está diseñado para ser rápido y fácil de usar. Todos sus atajos de teclado habituales funcionan aquí, y también usa Markdown.",
"Navigation": "Navegación",
@@ -284,6 +274,7 @@
"Delete Account": "Eliminar cuenta",
"You may delete your account at any time, note that this is unrecoverable": "Puede eliminar su cuenta en cualquier momento, tenga en cuenta que esto es irréversible",
"Delete account": "Eliminar cuenta",
"Recently Updated": "Actualizados recientemente",
"Alphabetical": "Alfabético",
"Youve not starred any documents yet.": "Todavía no has marcado documentos como favoritos.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "Todavía no hay plantillas. Puede crear plantillas para ayudar a su equipo a crear documentación precisa y coherente.",
+34 -43
View File
@@ -7,16 +7,6 @@
"Archive": "Archiver",
"Drafts": "Brouillons",
"Templates": "Modèles",
"Deleted Collection": "Collection supprimée",
"deleted": "supprimé",
"archived": "archivé",
"created": "créé",
"published": "publié",
"saved": "enregistré",
"updated": "mis à jour",
"Never viewed": "Jamais vu",
"Viewed": "Vu",
"in": "dans",
"New": "Nouveau",
"Only visible to you": "Visible uniquement pour vous",
"Draft": "Brouillon",
@@ -43,7 +33,7 @@
"Delete table": "Supprimer ce tableau",
"Italic": "Italique",
"Sorry, that link wont work for this embed type": "Désolé, ce lien ne fonctionne pas pour ce type d'intégration",
"Find or create a doc": "Rechercher ou créer un doc",
"Find or create a doc": "Rechercher ou créer un doc",
"Big heading": "En-tête",
"Medium heading": "Titre moyen",
"Small heading": "Petit titre",
@@ -56,17 +46,17 @@
"Link": "Lien",
"Link copied to clipboard": "Lien copié dans le presse-papiers",
"Highlight": "Surligner",
"Type '/' to insert": "Tapez '/' pour insérer",
"Keep typing to filter": "Continuez à taper pour filtrer",
"Type '/' to insert": "Tapez '/' pour insérer",
"Keep typing to filter": "Continuez à taper pour filtrer",
"No results": "Aucun résultats",
"Open link": "Ouvrir le lien",
"Ordered list": "Liste ordonnée",
"Paste a link": "Coller un lien",
"Paste a link": "Coller un lien",
"Paste a {{service}} link…": "Collez un lien {{service}}…",
"Placeholder": "Indication",
"Quote": "Citation",
"Remove link": "Supprimer le lien",
"Search or paste a link": "Rechercher ou coller un lien",
"Search or paste a link": "Rechercher ou coller un lien",
"Strikethrough": "Barré",
"Bold": "Gras",
"Subheading": "Sous-titre",
@@ -75,17 +65,13 @@
"Tip notice": "Astuce",
"Warning": "Avertissement",
"Warning notice": "Avertissement",
"Icon": "Icône",
"Loading": "Chargement",
"Search": "Recherche",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline est disponible dans votre langue {{optionLabel}}, voulez-vous changer ?",
"Change Language": "Changer de Langue",
"Dismiss": "Rejeter",
"Search…": "Recherche…",
"Keyboard shortcuts": "Raccourcis clavier",
"New collection": "Nouvelle collection",
"New collection": "Nouvelle collection",
"Collections": "Collections",
"Untitled": "Sans titre",
"Home": "Accueil",
"Search": "Recherche",
"Starred": "Favoris",
"Invite people…": "Inviter des personnes…",
"Invite people": "Inviter des personnes",
@@ -115,10 +101,10 @@
"Collection permissions": "Permissions sur les collections",
"New document": "Nouveau document",
"Import document": "Importer un document",
"Edit": "Modifier",
"Permissions": "Permissions",
"Export": "Exporter",
"Delete": "Supprimer",
"Edit": "Modifier",
"Permissions": "Permissions",
"Export": "Exporter",
"Delete": "Supprimer",
"Edit collection": "Modifier la collection",
"Delete collection": "Supprimer la collection",
"Export collection": "Exporter la collection",
@@ -127,30 +113,33 @@
"Document restored": "Document restauré",
"Document unpublished": "Document dépublié",
"Restore": "Restaurer",
"Restore…": "Restaurer…",
"Choose a collection": "Choisir une collection",
"Unpin": "Désépingler",
"Pin to collection": "Épingler à la collection",
"Unstar": "Enlever des favoris",
"Star": "Ajouter aux favoris",
"Share link": "Partager le lien",
"Share link": "Partager le lien",
"Enable embeds": "Activer les intégrations",
"Disable embeds": "Désactiver les intégrations",
"New nested document": "Nouveau document imbriqué",
"Create template": "Créer un modèle",
"Create template": "Créer un modèle",
"Edit": "Modifier",
"Duplicate": "Dupliquer",
"Unpublish": "Dépublier",
"Move": "Déplacer",
"Move": "Déplacer",
"History": "Historique",
"Download": "Télécharger",
"Print": "Imprimer",
"Delete {{ documentName }}": "Supprimer {{ documentName }}",
"Create template": "Créer un modèle",
"Share document": "Partager le document",
"Edit group": "Modifier le groupe",
"Delete group": "Supprimer le groupe",
"Members": "Membres",
"Members": "Membres",
"New document in": "Nouveau document",
"collection": "collection",
"New document in <1>{{collectionName}}</1>": "Nouveau document dans <1>{{collectionName}}</1>",
"New template": "Nouveau modèle",
"New template…": "Nouveau modèle…",
"Link copied": "Lien copié",
"Restore version": "Restaurer cette version",
"Copy link": "Copier le lien",
@@ -164,16 +153,16 @@
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Voulez-vous vraiment suspendre ce compte ? Les utilisateurs suspendus ne pourront plus se connecter.",
"Make {{ userName }} a member…": "Faire de {{ userName }} un membre…",
"Make {{ userName }} an admin…": "Faire de {{ userName }} un administrateur…",
"Revoke invite": "Révoquer l'invitation",
"Revoke invite": "Révoquer l'invitation",
"Activate account": "Activer le compte",
"Suspend account": "Suspendre le compte",
"Suspend account": "Suspendre le compte",
"Documents": "Documents",
"The document archive is empty at the moment.": "L'archive du document est vide pour le moment.",
"Search in collection": "Rechercher dans la collection",
"Search in collection": "Rechercher dans la collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> ne contient aucun document pour le moment.",
"Get started by creating a new one!": "Commencez par en créer un nouveau !",
"Create a document": "Créer un document",
"Manage members": "Gérer les membres",
"Manage members": "Gérer les membres",
"Pinned": "Épinglé",
"Recently updated": "Récemment mis à jour",
"Recently published": "Récemment publiés",
@@ -186,13 +175,13 @@
"More details about this collection…": "Plus de détails sur cette collection…",
"Private collection": "Collection Privée",
"A private collection will only be visible to invited team members.": "Une collection privée ne sera visible que pour les membres invités de l'équipe.",
"Saving": "Enregistrement",
"Saving": "Enregistrement",
"Save": "Sauvegarder",
"{{ groupName }} was added to the collection": "{{ groupName }} été ajouté à la collection",
"Could not add user": "Impossible d'ajouter l'utilisateur",
"Cant find the group youre looking for?": "Vous ne trouvez pas le groupe que vous cherchez ?",
"Create a group": "Créer un groupe",
"Search by group name": "Rechercher par nom de groupe",
"Search by group name": "Rechercher par nom de groupe",
"Search groups": "Rechercher des groupes",
"No groups matching your search": "Aucun groupe ne correspond à votre recherche",
"No groups left to add": "Plus aucun groupe à ajouter",
@@ -200,19 +189,20 @@
"{{ userName }} was added to the collection": "{{ userName }} été ajouté à la collection",
"Need to add someone whos not yet on the team yet?": "Besoin d'ajouter quelqu'un qui ne fait pas encore partie de l'équipe?",
"Invite people to {{ teamName }}": "Inviter des personnes à {{ teamName }}",
"Search by name": "Rechercher par nom",
"Search by name": "Rechercher par nom",
"Search people": "Rechercher des personnes",
"No people matching your search": "Aucune personne ne correspond à votre recherche",
"No people left to add": "Plus aucune personne à ajouter",
"Read only": "Lecture seule",
"Read & Edit": "Lire et éditer",
"Permissions": "Permissions",
"Remove": "Supprimer",
"Active <1></1> ago": "Active il y a <1></1>",
"Active {{ lastActiveAt }} ago": "Actif il y a {{ lastActiveAt }}",
"Never signed in": "Jamais connecté",
"Invited": "Invité",
"Admin": "Administrateur",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Les collections servent à regrouper votre base de connaissances. Ils fonctionnent mieux lorsqu'ils sont organisés autour d'un sujet ou d'une équipe interne - Produit ou Engineering par exemple.",
"Creating": "Création en cours",
"Creating": "Création en cours",
"Create": "Créer",
"Recently viewed": "Vu récemment",
"Created by me": "Créé par moi",
@@ -227,7 +217,7 @@
"New from template": "Nouveau à partir d'un modèle",
"Publish": "Publier",
"Publish document": "Publier le document",
"Publishing": "Publication en cours",
"Publishing": "Publication en cours",
"No documents found for your filters.": "Aucun documents trouvés pour votre recherche.",
"Youve not got any drafts at the moment.": "Vous n'avez aucun brouillon pour le moment.",
"Not found": "Non trouvé",
@@ -241,7 +231,7 @@
"Invite them to {{teamName}}": "Invitez-les à {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} a été retiré du groupe",
"Could not remove user": "Impossible de supprimer l'utilisateur",
"Add people": "Ajouter quelqu'un",
"Add people": "Ajouter quelqu'un",
"This group has no members.": "Ce groupe n'a aucun membre.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline est conçu pour être rapide et facile à utiliser. Tous vos raccourcis clavier habituels fonctionnent ici, et il y a aussi un support Markdown.",
"Navigation": "Navigation",
@@ -284,6 +274,7 @@
"Delete Account": "Supprimer le compte",
"You may delete your account at any time, note that this is unrecoverable": "Vous pouvez supprimer votre compte à tout moment, notez que cela est irrécupérable",
"Delete account": "Supprimer compte",
"Recently Updated": "Mis à jour récemment",
"Alphabetical": "Alphabétique",
"Youve not starred any documents yet.": "Vous n'avez encore ajouté aucun document aux favoris.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "Il n'y a pas encore de modèles. Vous pouvez créer des modèles pour aider votre équipe à créer une documentation cohérente et précise.",
+34 -43
View File
@@ -7,16 +7,6 @@
"Archive": "Archive",
"Drafts": "Drafts",
"Templates": "Templates",
"Deleted Collection": "Deleted Collection",
"deleted": "deleted",
"archived": "archived",
"created": "created",
"published": "published",
"saved": "saved",
"updated": "updated",
"Never viewed": "Never viewed",
"Viewed": "Viewed",
"in": "in",
"New": "New",
"Only visible to you": "Only visible to you",
"Draft": "Draft",
@@ -43,7 +33,7 @@
"Delete table": "Delete table",
"Italic": "Italic",
"Sorry, that link wont work for this embed type": "Sorry, that link wont work for this embed type",
"Find or create a doc": "Find or create a doc",
"Find or create a doc": "Find or create a doc",
"Big heading": "Big heading",
"Medium heading": "Medium heading",
"Small heading": "Small heading",
@@ -56,17 +46,17 @@
"Link": "Link",
"Link copied to clipboard": "Link copied to clipboard",
"Highlight": "Highlight",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"No results": "No results",
"Open link": "Open link",
"Ordered list": "Ordered list",
"Paste a link": "Paste a link",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "Paste a {{service}} link…",
"Placeholder": "Placeholder",
"Quote": "Quote",
"Remove link": "Remove link",
"Search or paste a link": "Search or paste a link",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "Strikethrough",
"Bold": "Bold",
"Subheading": "Subheading",
@@ -75,17 +65,13 @@
"Tip notice": "Tip notice",
"Warning": "Warning",
"Warning notice": "Warning notice",
"Icon": "Icon",
"Loading": "Loading",
"Search": "Search",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline is available in your language {{optionLabel}}, would you like to change?",
"Change Language": "Change Language",
"Dismiss": "Dismiss",
"Search…": "Search…",
"Keyboard shortcuts": "Keyboard shortcuts",
"New collection": "New collection",
"New collection": "New collection",
"Collections": "Collections",
"Untitled": "Untitled",
"Home": "Home",
"Search": "Search",
"Starred": "Starred",
"Invite people…": "Invite people…",
"Invite people": "Invite people",
@@ -115,10 +101,10 @@
"Collection permissions": "Collection permissions",
"New document": "New document",
"Import document": "Import document",
"Edit": "Edit",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit": "Edit",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "Edit collection",
"Delete collection": "Delete collection",
"Export collection": "Export collection",
@@ -127,30 +113,33 @@
"Document restored": "Document restored",
"Document unpublished": "Document unpublished",
"Restore": "Restore",
"Restore…": "Restore…",
"Choose a collection": "Choose a collection",
"Unpin": "Unpin",
"Pin to collection": "Pin to collection",
"Unstar": "Unstar",
"Star": "Star",
"Share link": "Share link",
"Share link": "Share link",
"Enable embeds": "Enable embeds",
"Disable embeds": "Disable embeds",
"New nested document": "New nested document",
"Create template": "Create template",
"Create template": "Create template",
"Edit": "Edit",
"Duplicate": "Duplicate",
"Unpublish": "Unpublish",
"Move": "Move",
"Move": "Move",
"History": "History",
"Download": "Download",
"Print": "Print",
"Delete {{ documentName }}": "Delete {{ documentName }}",
"Create template": "Create template",
"Share document": "Share document",
"Edit group": "Edit group",
"Delete group": "Delete group",
"Members": "Members",
"Members": "Members",
"New document in": "New document in",
"collection": "collection",
"New document in <1>{{collectionName}}</1>": "New document in <1>{{collectionName}}</1>",
"New template": "New template",
"New template…": "New template…",
"Link copied": "Link copied",
"Restore version": "Restore version",
"Copy link": "Copy link",
@@ -164,16 +153,16 @@
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Are you sure you want to suspend this account? Suspended users will be prevented from logging in.",
"Make {{ userName }} a member…": "Make {{ userName }} a member…",
"Make {{ userName }} an admin…": "Make {{ userName }} an admin…",
"Revoke invite": "Revoke invite",
"Revoke invite": "Revoke invite",
"Activate account": "Activate account",
"Suspend account": "Suspend account",
"Suspend account": "Suspend account",
"Documents": "Documents",
"The document archive is empty at the moment.": "The document archive is empty at the moment.",
"Search in collection": "Search in collection",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> doesnt contain any documents yet.",
"Get started by creating a new one!": "Get started by creating a new one!",
"Create a document": "Create a document",
"Manage members": "Manage members",
"Manage members": "Manage members",
"Pinned": "Pinned",
"Recently updated": "Recently updated",
"Recently published": "Recently published",
@@ -186,13 +175,13 @@
"More details about this collection…": "More details about this collection…",
"Private collection": "Private collection",
"A private collection will only be visible to invited team members.": "A private collection will only be visible to invited team members.",
"Saving": "Saving",
"Saving": "Saving",
"Save": "Save",
"{{ groupName }} was added to the collection": "{{ groupName }} was added to the collection",
"Could not add user": "Could not add user",
"Cant find the group youre looking for?": "Cant find the group youre looking for?",
"Create a group": "Create a group",
"Search by group name": "Search by group name",
"Search by group name": "Search by group name",
"Search groups": "Search groups",
"No groups matching your search": "No groups matching your search",
"No groups left to add": "No groups left to add",
@@ -200,19 +189,20 @@
"{{ userName }} was added to the collection": "{{ userName }} was added to the collection",
"Need to add someone whos not yet on the team yet?": "Need to add someone whos not yet on the team yet?",
"Invite people to {{ teamName }}": "Invite people to {{ teamName }}",
"Search by name": "Search by name",
"Search by name": "Search by name",
"Search people": "Search people",
"No people matching your search": "No people matching your search",
"No people left to add": "No people left to add",
"Read only": "Read only",
"Read & Edit": "Read & Edit",
"Permissions": "Permissions",
"Remove": "Remove",
"Active <1></1> ago": "Active <1></1> ago",
"Active {{ lastActiveAt }} ago": "Active {{ lastActiveAt }} ago",
"Never signed in": "Never signed in",
"Invited": "Invited",
"Admin": "Admin",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.",
"Creating": "Creating",
"Creating": "Creating",
"Create": "Create",
"Recently viewed": "Recently viewed",
"Created by me": "Created by me",
@@ -227,7 +217,7 @@
"New from template": "New from template",
"Publish": "Publish",
"Publish document": "Publish document",
"Publishing": "Publishing",
"Publishing": "Publishing",
"No documents found for your filters.": "No documents found for your filters.",
"Youve not got any drafts at the moment.": "Youve not got any drafts at the moment.",
"Not found": "Not found",
@@ -241,7 +231,7 @@
"Invite them to {{teamName}}": "Invite them to {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} was removed from the group",
"Could not remove user": "Could not remove user",
"Add people": "Add people",
"Add people": "Add people",
"This group has no members.": "This group has no members.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.",
"Navigation": "Navigation",
@@ -284,6 +274,7 @@
"Delete Account": "Delete Account",
"You may delete your account at any time, note that this is unrecoverable": "You may delete your account at any time, note that this is unrecoverable",
"Delete account": "Delete account",
"Recently Updated": "Recently Updated",
"Alphabetical": "Alphabetical",
"Youve not starred any documents yet.": "Youve not starred any documents yet.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.",
-297
View File
@@ -1,297 +0,0 @@
{
"currently editing": "현재 편집 중",
"currently viewing": "현재 조회 중",
"viewed {{ timeAgo }} ago": "{{ timeAgo }} 전 조회",
"You": "귀하",
"Trash": "휴지통",
"Archive": "보관",
"Drafts": "임시 보관함",
"Templates": "탬플릿",
"Deleted Collection": "삭제 된 콜렉션",
"deleted": "삭제됨",
"archived": "보관됨",
"created": "추가됨",
"published": "게시됨",
"saved": "저장됨",
"updated": "업데이트 됨",
"Never viewed": "미조회",
"Viewed": "조회",
"in": "안에",
"New": "새",
"Only visible to you": "나에게만 보임",
"Draft": "임시보관",
"Template": "템플릿",
"New doc": "새 문서",
"More options": "옵션 더 보기",
"Insert column after": "뒤에 열 추가",
"Insert column before": "앞에 열 추가",
"Insert row after": "뒤에 행 추가",
"Insert row before": "앞에 행 추가",
"Align center": "가운데 정렬",
"Align left": "왼쪽 정렬",
"Align right": "오른쪽 정렬",
"Bulleted list": "글머리 기호 목록",
"Todo list": "할 일 목록",
"Code block": "코드블럭",
"Copied to clipboard": "클립보드에 복사되었습니다",
"Code": "코드",
"Create link": "링크 생성",
"Sorry, an error occurred creating the link": "죄송합니다, 링크 생성 중 에러가 발생했습니다",
"Create a new doc": "새 문서 만들기",
"Delete column": "열 삭제",
"Delete row": "행 삭제",
"Delete table": "테이블 삭제",
"Italic": "이탤릭체",
"Sorry, that link wont work for this embed type": "죄송합니다, 해당 링크를 이 임베드 유형에서 사용할 수 없습니다",
"Find or create a doc": "찾기 또는 새 문서 만들기",
"Big heading": "큰 제목",
"Medium heading": "중간 제목",
"Small heading": "작은 제목",
"Heading": "제목",
"Divider": "구분선",
"Image": "이미지",
"Sorry, an error occurred uploading the image": "이미지 업로드 중에 오류가 발생했습니다",
"Info": "정보",
"Info notice": "정보 공지",
"Link": "링크",
"Link copied to clipboard": "링크가 클립보드로 복사 되었습니다",
"Highlight": "강조",
"Type '/' to insert": "키보드의 '/' 키로 글을 작성할 수 있어요",
"Keep typing to filter": "찾으실 항목을 입력해 주세요",
"No results": "결과 없음",
"Open link": "링크 열기",
"Ordered list": "번호가 있는 목록",
"Paste a link": "링크 붙여 넣기",
"Paste a {{service}} link…": "{{service}} 링크 붙여 넣기…",
"Placeholder": "Placeholder",
"Quote": "인용구",
"Remove link": "링크 삭제",
"Search or paste a link": "링크 검색 또는 붙여넣기",
"Strikethrough": "취소선",
"Bold": "굵게",
"Subheading": "부제목",
"Table": "표",
"Tip": "도움말",
"Tip notice": "팁 사항",
"Warning": "주의",
"Warning notice": "주의 사항",
"Icon": "아이콘",
"Loading": "로딩 중",
"Search": "검색",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline을 {{optionLabel}}어로 사용할 수 있어요. 적용할까요?",
"Change Language": "언어 변경",
"Dismiss": "닫기",
"Keyboard shortcuts": "단축키",
"New collection": "새 컬렉션",
"Collections": "컬렉션",
"Untitled": "제목없음",
"Home": "홈",
"Starred": "중요 문서",
"Invite people…": "초대하기…",
"Invite people": "초대하기",
"Create a collection": "컬렉션 만들기",
"Return to App": "앱으로 돌아가기",
"Profile": "사용자 정보",
"Notifications": "알림",
"API Tokens": "API 토큰",
"Details": "세부 정보",
"Security": "보안",
"People": "사용자",
"Groups": "그룹",
"Share Links": "링크공유",
"Export Data": "데이터 내보내기",
"Integrations": "연동",
"Installation": "설치",
"Settings": "설정",
"API documentation": "API 문서",
"Changelog": "변경 사항",
"Send us feedback": "의견 보내기",
"Report a bug": "버그 신고",
"Appearance": "화면",
"System": "시스템",
"Light": "밝게 보기",
"Dark": "어둡게 보기",
"Log out": "로그아웃",
"Collection permissions": "컬렉션 권한",
"New document": "새 문서",
"Import document": "문서 가져 오기",
"Edit": "편집",
"Permissions": "권한",
"Export": "내보내기",
"Delete": "삭제",
"Edit collection": "컬렉션 편집",
"Delete collection": "컬렉션 삭제",
"Export collection": "컬렉션 내보내기",
"Document duplicated": "문서가 중복되었습니다",
"Document archived": "문서가 보관되었습니다",
"Document restored": "문서가 복원되었습니다",
"Document unpublished": "문서가 게시되지 않았습니다",
"Restore": "복원하기",
"Choose a collection": "컬렉션 선택",
"Unpin": "고정 해제",
"Pin to collection": "컬렉션에 고정",
"Unstar": "중요 문서 해제",
"Star": "중요 문서 표시",
"Share link": "링크 공유하기",
"Enable embeds": "임베드 활성화",
"Disable embeds": "임베드 비활성화",
"New nested document": "새 하위 문서",
"Create template": "템플릿 만들기",
"Duplicate": "복사하기",
"Unpublish": "게시 취소",
"Move": "Move",
"History": "히스토리",
"Download": "다운로드",
"Print": "인쇄",
"Delete {{ documentName }}": "{{ documentName }} 삭제",
"Share document": "문서 공유하기",
"Edit group": "그룹 수정",
"Delete group": "그룹 삭제",
"Members": "Members",
"collection": "컬렉션",
"New document in <1>{{collectionName}}</1>": "New document in <1>{{collectionName}}</1>",
"New template": "New template",
"Link copied": "링크 복사됨",
"Restore version": "버전 복원",
"Copy link": "링크 복사",
"Share link revoked": "링크 공유가 취소되었습니다",
"Share link copied": "공유 할 링크가 복사되었습니다.",
"Go to document": "문서로 이동",
"Revoke link": "링크 삭제",
"By {{ author }}": "{{ author }} 작성",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "정말로 {{ userName }} 에게 관리자 권한을 부여 하시겠습니까? 관리자는 팀과 결제 정보를 수정할 수 있습니다.",
"Are you sure you want to make {{ userName }} a member?": "정말로 {{ userName }} 에게 멤버 권한을 부여 하시겠습니까?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "이 계정 사용을 중지 하시겠습니까? 정지된 사용자는 로그인 할 수 없습니다.",
"Make {{ userName }} a member…": "{{ userName }} 을 멤버로 지정...",
"Make {{ userName }} an admin…": "{{ userName }} 을 관리자로 지정...",
"Revoke invite": "Revoke invite",
"Activate account": "계정 활성화",
"Suspend account": "Suspend account",
"Documents": "문서",
"The document archive is empty at the moment.": "현재 보관 문서함이 비어 있습니다.",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> 에 문서가 아직 없습니다.",
"Get started by creating a new one!": "새 문서를 만들어 시작해 보세요!",
"Create a document": "새 문서",
"Manage members": "Manage members",
"Pinned": "고정됨",
"Recently updated": "최근 업데이트 순",
"Recently published": "최근 게시 순",
"Least recently updated": "오래된 순",
"AZ": "A-Z",
"The collection was updated": "컬렉션이 업데이트 되었습니다.",
"You can edit the name and other details at any time, however doing so often might confuse your team mates.": "이름 및 기타 세부 정보를 언제라도 수정할 수 있지만 그렇게 할 경우 팀원들에게 자주 혼란을 줄 수 있습니다.",
"Name": "이름",
"Description": "설명",
"More details about this collection…": "이 컬렉션에 대한 세부 정보…",
"Private collection": "비공개 컬렉션",
"A private collection will only be visible to invited team members.": "비공개 컬렉션은 초대된 팀원에게만 표시됩니다.",
"Saving": "Saving",
"Save": "저장",
"{{ groupName }} was added to the collection": "{{ groupName }} 이 컬렉션에 추가되었습니다.",
"Could not add user": "사용자를 추가할 수 없습니다",
"Cant find the group youre looking for?": "그룹을 찾지 못하시겠습니까?",
"Create a group": "그룹 만들기",
"Search by group name": "Search by group name",
"Search groups": "그룹 검색",
"No groups matching your search": "찾으시는 그룹이 없습니다",
"No groups left to add": "사용자를 추가할 그룹이 없습니다",
"Add": "추가",
"{{ userName }} was added to the collection": "{{ userName }} 사용자가 컬렉션에 추가되었습니다",
"Need to add someone whos not yet on the team yet?": "아직 팀에 추가하실 사람이 더 있습니까?",
"Invite people to {{ teamName }}": "사용자를 {{ teamName }} 팀으로 초대",
"Search by name": "이름으로 검색",
"Search people": "사용자 검색",
"No people matching your search": "찾으시는 사용자가 없습니다.",
"No people left to add": "추가할 사용자가 없습니다",
"Read only": "읽기 전용",
"Read & Edit": "조회 & 편집",
"Remove": "제거",
"Active <1></1> ago": "<1></1> 전에 활동",
"Never signed in": "로그인 한 적 없음",
"Invited": "초대됨",
"Admin": "관리자",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "컬렉션을 통해 사용자님의 지식문서들을 그룹화합니다. 주제나 내부 팀을 중심으로 구성되었을 때 가장 좋습니다.",
"Creating": "Creating",
"Create": "생성",
"Recently viewed": "최근에 조회됨",
"Created by me": "나에 의해 생성됨",
"Hide contents": "내용 숨기기",
"Show contents": "내용 보기",
"Archived": "보관됨",
"Anyone with the link <1></1>can view this document": "링크 <1></1> 가 있는 모든 사용자는 이 문서를 볼 수 있습니다",
"Share": "공유하기",
"Save Draft": "임시 저장",
"Done Editing": "편집 완료",
"Edit {{noun}}": "{{noun}} 편집하기",
"New from template": "새 템플릿 문서",
"Publish": "게시하기",
"Publish document": "문서 게시",
"Publishing": "게시 중",
"No documents found for your filters.": "검색조건과 맞는 문서를 찾을 수 없습니다.",
"Youve not got any drafts at the moment.": "현재 임시보관 된 문서가 없습니다.",
"Not found": "찾을 수 없습니다",
"We were unable to find the page youre looking for. Go to the <2>homepage</2>?": "페이지를 찾을 수 없습니다. <2>홈페이지</2>로 돌아가시겠습니까?",
"Offline": "오프라인",
"We were unable to load the document while offline.": "오프라인 상태에서는 문서를 불러 올 수 없습니다.",
"Your account has been suspended": "계정사용이 중지 되었습니다",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "관리자(<1>{{suspendedContactEmail}}</1>) 가 귀하의 계정 사용을 중지시켰습니다. 계정을 다시 활성화 하려면 해당 담당자에게 직접 문의 하십시오.",
"{{userName}} was added to the group": "{{userName}} 이 그룹에 추가되었습니다.",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "팀원을 그룹에 추가하여 그룹의 접근 권한을 부여할 수 있어요. 추가할 팀원이 있으신가요?",
"Invite them to {{teamName}}": "{{teamName}}으로 초대해보세요",
"{{userName}} was removed from the group": "{{userName}} 이 그룹에서 제외되었습니다.",
"Could not remove user": "사용자를 제거할 수 없습니다",
"Add people": "Add people",
"This group has no members.": "비어있는 그룹입니다.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline은 쉽고 빠르게 사용할 수 있도록 디자인되었습니다. 일반적인 키보드 단축키들을 사용할 수 있으며, 마크다운 형식도 사용가능합니다.",
"Navigation": "네비게이션",
"New document in current collection": "현재 컬렉션의 새 문서",
"Edit current document": "현재 문서 편집",
"Move current document": "현재 문서로 이동",
"Jump to search": "검색으로 이동",
"Jump to dashboard": "대시보드로 이동",
"Table of contents": "목차",
"Open this guide": "이 가이드 열기",
"Editor": "편집자",
"Save and exit document edit mode": "문서 저장하고 편집 모드 종료",
"Publish and exit document edit mode": "문서 게시하고 편집모드 종료",
"Save document and continue editing": "저장하고 편집 계속하기",
"Cancel editing": "변경 취소",
"Underline": "밑줄",
"Undo": "실행 취소",
"Redo": "복원하기",
"Markdown": "마크다운",
"Large header": "큰 제목",
"Medium header": "중간 제목",
"Small header": "작은 제목",
"Numbered list": "번호 매기기 목록",
"Blockquote": "블록 인용구",
"Horizontal divider": "구분선",
"Inline code": "인라인 코드",
"Not Found": "찾을 수 없습니다",
"We were unable to find the page youre looking for.": "페이지를 찾을 수 없습니다.",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "<1>{{meta}}+K</1>를 입력해서 검색할 수 있어요",
"No documents found for your search filters. <1></1>Create a new document?": "문서를 찾을 수 없어요. <1></1>새 문서를 만들까요?",
"Clear filters": "필터 지우기",
"Profile saved": "프로필이 저장되었습니다",
"Profile picture updated": "프로필 사진이 업데이트 됨",
"Unable to upload new profile picture": "새 프로필 사진을 업로드 할 수 없습니다",
"Photo": "사진",
"Upload": "업로드",
"Full name": "이름",
"Language": "언어",
"Please note that translations are currently in early access.<1></1>Community contributions are accepted though our <4>translation portal</4>": "현재 번역은 사전 체험판입니다. <1></1> <4>번역 포털</4> 을 통해 커뮤니티에 공헌하실 수 있습니다",
"Delete Account": "계정 삭제",
"You may delete your account at any time, note that this is unrecoverable": "계정을 언제든지 삭제할 수 있지만 다시 복구할 수 없습니다",
"Delete account": "계정 삭제",
"Alphabetical": "알파벳 순",
"Youve not starred any documents yet.": "중요 표시된 문서가 없어요.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "템플릿이 없습니다. 템플릿을 추가해서 팀이 지속적이고 정확한 문서를 만들도록 도와줄 수 있습니다.",
"Trash is empty at the moment.": "현재 휴지통이 비어 있습니다.",
"You joined": "{0}에 참여하였습니다",
"Joined": "참여함",
"{{ time }} ago.": "{{ time }} 전.",
"Suspended": "사용 중지됨",
"Edit Profile": "프로필 수정",
"{{ userName }} hasnt updated any documents yet.": "아직 {{ userName }} 가 문서를 업데이트하지 않았습니다."
}
-297
View File
@@ -1,297 +0,0 @@
{
"currently editing": "atualmente editando",
"currently viewing": "atualmente visualizando",
"viewed {{ timeAgo }} ago": "visto {{ timeAgo }} atrás",
"You": "Você",
"Trash": "Lixeira",
"Archive": "Arquivo",
"Drafts": "Rascunhos",
"Templates": "Modelos",
"Deleted Collection": "Excluir Coleção",
"deleted": "excluído",
"archived": "arquivado",
"created": "criado",
"published": "publicado",
"saved": "salvo",
"updated": "atualizado",
"Never viewed": "Nunca aberto",
"Viewed": "Visualizado",
"in": "em",
"New": "Novo",
"Only visible to you": "Visível apenas para você",
"Draft": "Rascunho",
"Template": "Modelo",
"New doc": "Novo documento",
"More options": "Mais opções",
"Insert column after": "Inserir coluna à esquerda",
"Insert column before": "Inserir coluna à direita",
"Insert row after": "Inserir linha acima",
"Insert row before": "Inserir linha abaixo",
"Align center": "Alinhar ao centro",
"Align left": "Alinhar à esquerda",
"Align right": "Alinhar à direita",
"Bulleted list": "Lista não ordenada",
"Todo list": "Lista de tarefas",
"Code block": "Bloco de código",
"Copied to clipboard": "Copiado para a área de transferência",
"Code": "Código",
"Create link": "Criar atalho",
"Sorry, an error occurred creating the link": "Desculpe, ocorreu um erro ao criar o link",
"Create a new doc": "Criar um novo documento",
"Delete column": "Excluir coluna",
"Delete row": "Excluir linha",
"Delete table": "Excluir tabela",
"Italic": "Itálico",
"Sorry, that link wont work for this embed type": "Desculpe, esse link não funcionará para este tipo de incorporação",
"Find or create a doc": "Find or create a doc",
"Big heading": "Cabeçalho grande",
"Medium heading": "Cabeçalho médio",
"Small heading": "Cabeçalho pequeno",
"Heading": "Cabeçalho",
"Divider": "Divisor",
"Image": "Imagem",
"Sorry, an error occurred uploading the image": "Desculpe, ocorreu um erro ao enviar a imagem",
"Info": "Informação",
"Info notice": "Aviso de informação",
"Link": "Link",
"Link copied to clipboard": "Link copiado para área de transferência",
"Highlight": "Destaque",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"No results": "Sem resultados",
"Open link": "Abrir link",
"Ordered list": "Lista ordenada",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "Cole um link de {{service}}…",
"Placeholder": "Placeholder",
"Quote": "Citação",
"Remove link": "Excluir link",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "Riscado",
"Bold": "Negrito",
"Subheading": "Subtítulo",
"Table": "Tabela",
"Tip": "Dica",
"Tip notice": "Aviso de dica",
"Warning": "Atenção",
"Warning notice": "Aviso de atenção",
"Icon": "Ícone",
"Loading": "Loading",
"Search": "Busca",
"Outline is available in your language {{optionLabel}}, would you like to change?": "O esboço está disponível em seu idioma {{optionLabel}}, deseja alterar?",
"Change Language": "Mudar Idioma",
"Dismiss": "Descartar",
"Keyboard shortcuts": "Atalhos de teclado",
"New collection": "New collection",
"Collections": "Coleções",
"Untitled": "Sem título",
"Home": "Início",
"Starred": "Favoritos",
"Invite people…": "Convidar pessoas…",
"Invite people": "Convidar pessoas",
"Create a collection": "Criar uma coleção",
"Return to App": "Voltar ao App",
"Profile": "Perfil",
"Notifications": "Notificações",
"API Tokens": "Tokens de API",
"Details": "Detalhes",
"Security": "Segurança",
"People": "Pessoas",
"Groups": "Grupos",
"Share Links": "Links Compartilhados",
"Export Data": "Exportar Dados",
"Integrations": "Integrações",
"Installation": "Instalação",
"Settings": "Configurações",
"API documentation": "Documentação da API",
"Changelog": "Histórico de Atualizações",
"Send us feedback": "Envie-nos a sua opinião",
"Report a bug": "Reportar erro",
"Appearance": "Aparência",
"System": "Sistema",
"Light": "Claro",
"Dark": "Escuro",
"Log out": "Sair",
"Collection permissions": "Permissões da coleção",
"New document": "Novo documento",
"Import document": "Importar documento",
"Edit": "Edit",
"Permissions": "Permissões",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "Editar coleção",
"Delete collection": "Excluir coleção",
"Export collection": "Exportar coleção",
"Document duplicated": "Documento duplicado",
"Document archived": "Documento arquivado",
"Document restored": "Documento restaurado",
"Document unpublished": "Documento não publicado",
"Restore": "Restaurar",
"Choose a collection": "Escolha uma coleção",
"Unpin": "Desafixar",
"Pin to collection": "Fixar à coleção",
"Unstar": "Desfavoritar",
"Star": "Favoritar",
"Share link": "Share link",
"Enable embeds": "Enable embeds",
"Disable embeds": "Disable embeds",
"New nested document": "New nested document",
"Create template": "Create template",
"Duplicate": "Duplicate",
"Unpublish": "Unpublish",
"Move": "Move",
"History": "History",
"Download": "Download",
"Print": "Print",
"Delete {{ documentName }}": "Delete {{ documentName }}",
"Share document": "Share document",
"Edit group": "Edit group",
"Delete group": "Delete group",
"Members": "Members",
"collection": "collection",
"New document in <1>{{collectionName}}</1>": "New document in <1>{{collectionName}}</1>",
"New template": "New template",
"Link copied": "Link copied",
"Restore version": "Restore version",
"Copy link": "Copy link",
"Share link revoked": "Share link revoked",
"Share link copied": "Share link copied",
"Go to document": "Go to document",
"Revoke link": "Revoke link",
"By {{ author }}": "By {{ author }}",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.",
"Are you sure you want to make {{ userName }} a member?": "Are you sure you want to make {{ userName }} a member?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Are you sure you want to suspend this account? Suspended users will be prevented from logging in.",
"Make {{ userName }} a member…": "Make {{ userName }} a member…",
"Make {{ userName }} an admin…": "Make {{ userName }} an admin…",
"Revoke invite": "Revoke invite",
"Activate account": "Activate account",
"Suspend account": "Suspend account",
"Documents": "Documents",
"The document archive is empty at the moment.": "The document archive is empty at the moment.",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> doesnt contain any documents yet.",
"Get started by creating a new one!": "Get started by creating a new one!",
"Create a document": "Create a document",
"Manage members": "Manage members",
"Pinned": "Pinned",
"Recently updated": "Recently updated",
"Recently published": "Recently published",
"Least recently updated": "Least recently updated",
"AZ": "AZ",
"The collection was updated": "The collection was updated",
"You can edit the name and other details at any time, however doing so often might confuse your team mates.": "You can edit the name and other details at any time, however doing so often might confuse your team mates.",
"Name": "Nome",
"Description": "Descrição",
"More details about this collection…": "Mais detalhes sobre esta coleção…",
"Private collection": "Coleção privada",
"A private collection will only be visible to invited team members.": "Uma coleção privada só será visível aos membros convidados da equipe.",
"Saving": "Saving",
"Save": "Salvar",
"{{ groupName }} was added to the collection": "{{ groupName }} foi adicionado à coleção",
"Could not add user": "Não foi possível adicionar o usuário",
"Cant find the group youre looking for?": "Não achou o grupo que procura?",
"Create a group": "Criar um grupo",
"Search by group name": "Search by group name",
"Search groups": "Buscar grupos",
"No groups matching your search": "Nenhum grupo corresponde à sua pesquisa",
"No groups left to add": "Nenhum grupo restante para adicionar",
"Add": "Adicionar",
"{{ userName }} was added to the collection": "{{ userName }} foi adicionado à coleção",
"Need to add someone whos not yet on the team yet?": "Precisa adicionar alguém que ainda não faz parte da equipe?",
"Invite people to {{ teamName }}": "Convide pessoas para {{ teamName }}",
"Search by name": "Search by name",
"Search people": "Procurar pessoas",
"No people matching your search": "Nenhuma pessoa corresponde à sua pesquisa",
"No people left to add": "Nenhuma pessoa restante para adicionar",
"Read only": "Somente leitura",
"Read & Edit": "Leitura & Edição",
"Remove": "Remover",
"Active <1></1> ago": "Active <1></1> ago",
"Never signed in": "Nunca logou",
"Invited": "Convidado",
"Admin": "Administrador",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Coleções são para agrupar sua base de conhecimento. Elas funcionam melhor quando organizadas em torno de um tópico ou equipe interna - por exemplo, Produto ou Engenharia.",
"Creating": "Creating",
"Create": "Create",
"Recently viewed": "Recently viewed",
"Created by me": "Created by me",
"Hide contents": "Hide contents",
"Show contents": "Show contents",
"Archived": "Archived",
"Anyone with the link <1></1>can view this document": "Anyone with the link <1></1>can view this document",
"Share": "Share",
"Save Draft": "Save Draft",
"Done Editing": "Done Editing",
"Edit {{noun}}": "Edit {{noun}}",
"New from template": "New from template",
"Publish": "Publish",
"Publish document": "Publish document",
"Publishing": "Publishing",
"No documents found for your filters.": "No documents found for your filters.",
"Youve not got any drafts at the moment.": "Youve not got any drafts at the moment.",
"Not found": "Not found",
"We were unable to find the page youre looking for. Go to the <2>homepage</2>?": "We were unable to find the page youre looking for. Go to the <2>homepage</2>?",
"Offline": "Offline",
"We were unable to load the document while offline.": "We were unable to load the document while offline.",
"Your account has been suspended": "Your account has been suspended",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.",
"{{userName}} was added to the group": "{{userName}} was added to the group",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?",
"Invite them to {{teamName}}": "Invite them to {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} was removed from the group",
"Could not remove user": "Could not remove user",
"Add people": "Add people",
"This group has no members.": "This group has no members.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.",
"Navigation": "Navigation",
"New document in current collection": "New document in current collection",
"Edit current document": "Edit current document",
"Move current document": "Move current document",
"Jump to search": "Jump to search",
"Jump to dashboard": "Jump to dashboard",
"Table of contents": "Table of contents",
"Open this guide": "Open this guide",
"Editor": "Editor",
"Save and exit document edit mode": "Save and exit document edit mode",
"Publish and exit document edit mode": "Publish and exit document edit mode",
"Save document and continue editing": "Save document and continue editing",
"Cancel editing": "Cancel editing",
"Underline": "Underline",
"Undo": "Undo",
"Redo": "Redo",
"Markdown": "Markdown",
"Large header": "Large header",
"Medium header": "Medium header",
"Small header": "Small header",
"Numbered list": "Numbered list",
"Blockquote": "Blockquote",
"Horizontal divider": "Horizontal divider",
"Inline code": "Inline code",
"Not Found": "Not Found",
"We were unable to find the page youre looking for.": "We were unable to find the page youre looking for.",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base",
"No documents found for your search filters. <1></1>Create a new document?": "No documents found for your search filters. <1></1>Create a new document?",
"Clear filters": "Clear filters",
"Profile saved": "Profile saved",
"Profile picture updated": "Profile picture updated",
"Unable to upload new profile picture": "Unable to upload new profile picture",
"Photo": "Photo",
"Upload": "Upload",
"Full name": "Full name",
"Language": "Language",
"Please note that translations are currently in early access.<1></1>Community contributions are accepted though our <4>translation portal</4>": "Please note that translations are currently in early access.<1></1>Community contributions are accepted though our <4>translation portal</4>",
"Delete Account": "Delete Account",
"You may delete your account at any time, note that this is unrecoverable": "You may delete your account at any time, note that this is unrecoverable",
"Delete account": "Delete account",
"Alphabetical": "Alphabetical",
"Youve not starred any documents yet.": "Youve not starred any documents yet.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.",
"Trash is empty at the moment.": "Trash is empty at the moment.",
"You joined": "You joined",
"Joined": "Joined",
"{{ time }} ago.": "{{ time }} ago.",
"Suspended": "Suspended",
"Edit Profile": "Edit Profile",
"{{ userName }} hasnt updated any documents yet.": "{{ userName }} hasnt updated any documents yet."
}
+34 -43
View File
@@ -7,16 +7,6 @@
"Archive": "Arquivo",
"Drafts": "Rascunhos",
"Templates": "Modelos",
"Deleted Collection": "Coleção eliminada",
"deleted": "eliminado",
"archived": "arquivado",
"created": "criado",
"published": "publicado",
"saved": "guardado",
"updated": "atualizado",
"Never viewed": "Nunca visto",
"Viewed": "Visto",
"in": "em",
"New": "Novo",
"Only visible to you": "Apenas visível para ti",
"Draft": "Rascunho",
@@ -43,7 +33,7 @@
"Delete table": "Eliminar tabela",
"Italic": "Itálico",
"Sorry, that link wont work for this embed type": "Desculpe, esse link não funcionará para este tipo de incorporação",
"Find or create a doc": "Encontre ou crie um documento",
"Find or create a doc": "Encontre ou crie um documento",
"Big heading": "Cabeçalho grande",
"Medium heading": "Cabeçalho médio",
"Small heading": "Cabeçalho pequeno",
@@ -56,17 +46,17 @@
"Link": "Link",
"Link copied to clipboard": "Copiado para o clipboard",
"Highlight": "Destaque",
"Type '/' to insert": "Digite '/' para inserir",
"Keep typing to filter": "Continue digitando para filtrar",
"Type '/' to insert": "Digite '/' para inserir",
"Keep typing to filter": "Continue digitando para filtrar",
"No results": "Sem resultados",
"Open link": "Abrir link",
"Ordered list": "Lista ordenada",
"Paste a link": "Inserir um link",
"Paste a link": "Inserir um link",
"Paste a {{service}} link…": "Inserir um {{service}} link…",
"Placeholder": "Espaço em branco",
"Quote": "Citação",
"Remove link": "Remover link",
"Search or paste a link": "Procure ou insira um link",
"Search or paste a link": "Procure ou insira um link",
"Strikethrough": "Riscado",
"Bold": "Negrito",
"Subheading": "Subtítulo",
@@ -75,17 +65,13 @@
"Tip notice": "Aviso de dica",
"Warning": "Aviso",
"Warning notice": "Aviso de alerta",
"Icon": "Ícone",
"Loading": "A carregar",
"Search": "Pesquisa",
"Outline is available in your language {{optionLabel}}, would you like to change?": "O Outline está disponível no seu idioma {{optionLabel}}, deseja alterar?",
"Change Language": "Alterar língua",
"Dismiss": "Dispensar",
"Search…": "Pesquisa…",
"Keyboard shortcuts": "Atalhos do teclado",
"New collection": "Nova coleção",
"New collection": "Nova coleção",
"Collections": "Coleções",
"Untitled": "Sem título",
"Home": "Página inicial",
"Search": "Pesquisa",
"Starred": "Favoritos",
"Invite people…": "Convidar pessoas…",
"Invite people": "Convidar pessoas",
@@ -115,10 +101,10 @@
"Collection permissions": "Permissões da coleção",
"New document": "Novo documento",
"Import document": "Importar documento",
"Edit": "Editar",
"Permissions": "Permissões",
"Export": "Exportar",
"Delete": "Apagar",
"Edit": "Editar",
"Permissions": "Permissões",
"Export": "Exportar",
"Delete": "Apagar",
"Edit collection": "Editar coleção",
"Delete collection": "Apagar coleção",
"Export collection": "Exportar coleção",
@@ -127,30 +113,33 @@
"Document restored": "Documento restaurado",
"Document unpublished": "Documento não publicado",
"Restore": "Restaurar",
"Restore…": "Restaurar…",
"Choose a collection": "Escolher coleção",
"Unpin": "Tirar pino",
"Pin to collection": "Pin coleção",
"Unstar": "Tirar estrela",
"Star": "Estrela",
"Share link": "Partilhar link",
"Share link": "Partilhar link",
"Enable embeds": "Ativar embeds",
"Disable embeds": "Desativar embeds",
"New nested document": "Novo documento aninhado",
"Create template": "Criar template",
"Create template": "Criar template",
"Edit": "Editar",
"Duplicate": "Duplicar",
"Unpublish": "Despublicar",
"Move": "Mover",
"Move": "Mover",
"History": "Historia",
"Download": "Download",
"Print": "Imprimir",
"Delete {{ documentName }}": "Apagar {{ documentName }}",
"Create template": "Criar template",
"Share document": "Partilhar documento",
"Edit group": "Editar grupo",
"Delete group": "Apagar grupo",
"Members": "Membros",
"Members": "Membros",
"New document in": "Novo documento em",
"collection": "coleção",
"New document in <1>{{collectionName}}</1>": "Novo documento em <1>{{collectionName}}</1>",
"New template": "Novo template",
"New template…": "Novo template…",
"Link copied": "Link copiado",
"Restore version": "Restaurar versão",
"Copy link": "Copiar link",
@@ -164,16 +153,16 @@
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Tem a certeza que deseja suspender esta conta? Os usuários suspensos serão impedidos de se conectar.",
"Make {{ userName }} a member…": "Tornar {{ userName }} um membro…",
"Make {{ userName }} an admin…": "Tornar {{ userName }} um administrador…",
"Revoke invite": "Revogar convite",
"Revoke invite": "Revogar convite",
"Activate account": "Ativar conta",
"Suspend account": "Suspender conta",
"Suspend account": "Suspender conta",
"Documents": "Documentos",
"The document archive is empty at the moment.": "O arquivo do documento está vazio neste momento.",
"Search in collection": "Procurar na coleção",
"Search in collection": "Procurar na coleção",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> não contém nenhum documento ainda.",
"Get started by creating a new one!": "Para começar, crie um documento novo!",
"Create a document": "Criar documento",
"Manage members": "Gerenciar membros",
"Manage members": "Gerenciar membros",
"Pinned": "Marcado",
"Recently updated": "Atualizado recentemente",
"Recently published": "Publicado recentemente",
@@ -186,13 +175,13 @@
"More details about this collection…": "Mais detalhes sobre esta coleção…",
"Private collection": "Coleção privada",
"A private collection will only be visible to invited team members.": "Uma coleção privada só será visível para os membros convidados da equipa.",
"Saving": "A guardar",
"Saving": "A guardar",
"Save": "Guardar",
"{{ groupName }} was added to the collection": "{{ groupName }} foi adicionado à coleção",
"Could not add user": "Não foi possível adicionar usuário",
"Cant find the group youre looking for?": "Não consegue encontrar o grupo que procura?",
"Create a group": "Criar grupo",
"Search by group name": "Procurar grupo pelo nome",
"Search by group name": "Procurar grupo pelo nome",
"Search groups": "Procurar grupos",
"No groups matching your search": "Nenhum grupo corresponde à sua pesquisa",
"No groups left to add": "Nenhum grupo restante para adicionar",
@@ -200,19 +189,20 @@
"{{ userName }} was added to the collection": "{{ userName }} foi adicionado à coleção",
"Need to add someone whos not yet on the team yet?": "Precisa adicionar alguém que ainda não faz parte da equipe?",
"Invite people to {{ teamName }}": "Convide pessoas para {{ teamName }}",
"Search by name": "Procurar pelo nome",
"Search by name": "Procurar pelo nome",
"Search people": "Procurar pessoas",
"No people matching your search": "Nenhuma pessoa corresponde à sua pesquisa",
"No people left to add": "Não sobrou ninguém para adicionar",
"Read only": "Somente leitura",
"Read & Edit": "Leitura & Escrita",
"Permissions": "Permissões",
"Remove": "Remover",
"Active <1></1> ago": "Ativo <1></1> atrás",
"Active {{ lastActiveAt }} ago": "Ativo há {{ lastActiveAt }}",
"Never signed in": "Nunca conectado",
"Invited": "Convidado",
"Admin": "Administrador",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Coleções são para agrupar a sua base de dados de conhecimento. Elas trabalham melhor quando organizadas em torno de um tópico ou equipa interna — Produto ou Engenharia, por exemplo.",
"Creating": "Criando",
"Creating": "Criando",
"Create": "Criar",
"Recently viewed": "Visto recentemente",
"Created by me": "Criado por mim",
@@ -227,7 +217,7 @@
"New from template": "Criar a partir do modelo",
"Publish": "Publicar",
"Publish document": "Publicar documento",
"Publishing": "Publicando",
"Publishing": "Publicando",
"No documents found for your filters.": "Nenhum documento encontrado com os seus filtros.",
"Youve not got any drafts at the moment.": "Não tem nenhum rascunho de momento.",
"Not found": "Não encontrado",
@@ -241,7 +231,7 @@
"Invite them to {{teamName}}": "Convide pessoas para {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} foi removido do grupo",
"Could not remove user": "Não foi possível remover o usuário",
"Add people": "Adicionar pessoas",
"Add people": "Adicionar pessoas",
"This group has no members.": "Este grupo não tem membros.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "O Outline foi projetado para ser rápido e fácil de usar. Todos os seus atalhos de teclado usuais funcionam aqui, e há Markdown também.",
"Navigation": "Navegação",
@@ -284,6 +274,7 @@
"Delete Account": "Apagar conta",
"You may delete your account at any time, note that this is unrecoverable": "Pode apagar a sua conta a qualquer momento, atenção que isso é irrecuperável",
"Delete account": "Apagar conta",
"Recently Updated": "Atualizado recentemente",
"Alphabetical": "Alfabético",
"Youve not starred any documents yet.": "Ainda não marcou nenhum documento com estrela.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "Ainda não existem modelos. Pode criar modelos para ajudar sua equipa a criar documentação consistente e precisa.",
+273 -282
View File
@@ -1,297 +1,288 @@
{
"currently editing": "сейчас редактируется",
"currently viewing": "сейчас просматривается",
"currently editing": "редактируется",
"currently viewing": "просматривается",
"viewed {{ timeAgo }} ago": "просмотрено {{ timeAgo }} назад",
"You": "Вы",
"You": "You",
"Trash": "Корзина",
"Archive": "Архив",
"Drafts": "Черновики",
"Templates": "Шаблоны",
"Deleted Collection": "Удаленная коллекция",
"deleted": "удален",
"archived": "архивирован",
"created": "создан",
"published": "опубликован",
"saved": "сохранен",
"updated": "обновлен",
"Never viewed": "Не просмотрено",
"Viewed": "Просмотрено",
"in": "в",
"New": "Новое",
"Only visible to you": "Видно только вам",
"New": "New",
"Only visible to you": "Only visible to you",
"Draft": "Черновик",
"Template": "Шаблон",
"New doc": "Новый документ",
"More options": "Больше опций",
"Insert column after": "Вставить столбец справа",
"Insert column before": "Вставить столбец слева",
"Insert row after": "Вставить строку снизу",
"Insert row before": "Вставить строку сверху",
"Align center": "Выровнять по центру",
"Align left": "Выровнять по левому краю",
"Align right": "Выровнять по правому краю",
"Bulleted list": "Маркированный список",
"Todo list": "Список дел",
"Code block": "Блок кода",
"Copied to clipboard": "Скопировано в буфер обмена",
"Code": "Код",
"Create link": "Создать ссылку",
"New doc": "New doc",
"More options": "More options",
"Insert column after": "Insert column after",
"Insert column before": "Insert column before",
"Insert row after": "Insert row after",
"Insert row before": "Insert row before",
"Align center": "Align center",
"Align left": "Align left",
"Align right": "Align right",
"Bulleted list": "Bulleted list",
"Todo list": "Todo list",
"Code block": "Code block",
"Copied to clipboard": "Copied to clipboard",
"Code": "Code",
"Create link": "Create link",
"Sorry, an error occurred creating the link": "К сожалению, при создании ссылки возникла ошибка",
"Create a new doc": "Создать новый документ",
"Delete column": "Удалить столбец",
"Create a new doc": "Create a new doc",
"Delete column": "Удалить колонку",
"Delete row": "Удалить строку",
"Delete table": "Удалить таблицу",
"Italic": "Курсив",
"Sorry, that link wont work for this embed type": "К сожалению, эта ссылка не работает для такого типа встраивания",
"Find or create a doc": "Find or create a doc",
"Big heading": "Большой заголовок",
"Medium heading": "Средний заголовок",
"Small heading": "Малый заголовок",
"Heading": "Заголовок",
"Divider": "Разделитель",
"Image": "Изображение",
"Sorry, an error occurred uploading the image": "К сожалению, при загрузке изображения произошла ошибка",
"Info": "Информация",
"Info notice": "Информационное уведомление",
"Link": "Ссылка",
"Link copied to clipboard": "Ссылка скопирована в буфер обмена",
"Highlight": "Выделение",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"No results": "Ничего не найденo",
"Open link": "Перейти по ссылке",
"Ordered list": "Нумерованный список",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "Вставить ссылку {{service}}…",
"Placeholder": "Поле для заполнения",
"Sorry, that link wont work for this embed type": "Sorry, that link wont work for this embed type",
"Find or create a doc": "Find or create a doc",
"Big heading": "Big heading",
"Medium heading": "Medium heading",
"Small heading": "Small heading",
"Heading": "Heading",
"Divider": "Divider",
"Image": "Image",
"Sorry, an error occurred uploading the image": "Sorry, an error occurred uploading the image",
"Info": "Info",
"Info notice": "Info notice",
"Link": "Link",
"Link copied to clipboard": "Link copied to clipboard",
"Highlight": "Highlight",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"No results": "No results",
"Open link": "Open link",
"Ordered list": "Ordered list",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "Paste a {{service}} link…",
"Placeholder": "Placeholder",
"Quote": "Цитата",
"Remove link": "Удалить ссылку",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "Зачеркнуто",
"Bold": "Жирный",
"Subheading": "Подзаголовок",
"Table": "Таблица",
"Tip": "Подсказка",
"Tip notice": "Подсказка",
"Warning": "Предупреждение",
"Warning notice": "Предупреждение",
"Icon": "Значок",
"Loading": "Loading",
"Search": "Поиск",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline доступен на Вашем языке {{optionLabel}}, хотите изменить?",
"Change Language": "Сменить язык",
"Dismiss": "Убрать",
"Keyboard shortcuts": "Горячие клавиши",
"New collection": "New collection",
"Collections": "Коллекции",
"Untitled": "Без названия",
"Home": "Домашняя страница",
"Starred": "Избранное",
"Invite people": "Пригласить людей…",
"Invite people": "Пригласить людей",
"Create a collection": "Создать коллекцию",
"Return to App": "Вернуться в приложение",
"Profile": "Профиль",
"Notifications": "Уведомления",
"API Tokens": "Токены API",
"Details": "Подробнее",
"Security": "Безопасность",
"People": "Люди",
"Groups": "Группы",
"Share Links": "Ссылки общего доступа",
"Export Data": "Экспорт данных",
"Integrations": "Интеграции",
"Installation": "Установка",
"Settings": "Настройки",
"API documentation": "Документация по API",
"Changelog": "История изменений",
"Send us feedback": "Отправьте нам отзыв",
"Report a bug": "Сообщить об ошибке",
"Appearance": "Оформление",
"System": "Система",
"Light": "Светлая",
"Dark": "Темная",
"Log out": "Выйти из системы",
"Collection permissions": "Права доступа к коллекциям",
"New document": "Новый документ",
"Import document": "Импорт документа",
"Edit": "Редактировать",
"Permissions": "Права доступа",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "Редактировать коллекцию",
"Delete collection": "Удалить коллекцию",
"Export collection": "Экспорт коллекции",
"Document duplicated": "Документ скопирован",
"Document archived": "Документ архивирован",
"Document restored": "Документ восстановлен",
"Document unpublished": "Документ снят с публикации",
"Restore": "Восстановить",
"Choose a collection": "Выберите коллекцию",
"Unpin": "Открепить",
"Pin to collection": "Прикрепить к коллекции",
"Unstar": "Убрать из избранного",
"Star": "Добавить в избранное",
"Share link": "Share link",
"Enable embeds": "Включить встраивание",
"Disable embeds": "Отключить встраивание",
"New nested document": "Новый вложенный документ",
"Create template": "Создать шаблон",
"Duplicate": "Сделать копию",
"Unpublish": "Снять с публикации",
"Move": "Move",
"History": "История",
"Download": "Скачать",
"Print": "Распечатать",
"Delete {{ documentName }}": "Удалить {{ documentName }}",
"Share document": "Поделиться документом",
"Edit group": "Редактировать группу",
"Delete group": "Удалить группу",
"Members": "Members",
"collection": "коллекция",
"New document in <1>{{collectionName}}</1>": "New document in <1>{{collectionName}}</1>",
"New template": "New template",
"Link copied": "Ссылка скопирована",
"Restore version": "Восстановить версию",
"Copy link": "Скопировать ссылку",
"Share link revoked": "Ссылка общего доступа отозвана",
"Share link copied": "Ссылка общего доступа скопирована",
"Go to document": "Перейти к документу",
"Revoke link": "Отозвать ссылку",
"By {{ author }}": "По {{ author }}",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Вы уверены, что хотите сделать {{ userName }} администратором? Администраторы могут изменять информацию о команде и платежную информацию.",
"Are you sure you want to make {{ userName }} a member?": "Вы уверены, что хотите сделать {{ userName }} участником?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Вы уверены, что хотите заблокировать эту учетную запись? Заблокированным пользователям будет запрещено входить в систему.",
"Make {{ userName }} a member…": "Сделать {{ userName }} участником…",
"Make {{ userName }} an admin…": "Сделать {{ userName }} администратором…",
"Revoke invite": "Revoke invite",
"Activate account": "Активировать аккаунт",
"Suspend account": "Suspend account",
"Documents": "Документы",
"The document archive is empty at the moment.": "Архив документов на данный момент пуст.",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> пока не содержит документов.",
"Get started by creating a new one!": "Начните с создания нового!",
"Create a document": "Создать документ",
"Manage members": "Manage members",
"Pinned": "Прикреплено",
"Recently updated": "Недавно обновлено",
"Recently published": "Недавно опубликовано",
"Least recently updated": "Наиболее давно обновлено",
"AZ": "А–Я",
"The collection was updated": "Коллекция обновлена",
"You can edit the name and other details at any time, however doing so often might confuse your team mates.": "Вы можете изменить имя и прочие подробности в любое время, однако зачастую это может сбить с толку членов вашей команды.",
"Name": "Имя",
"Description": "Описание",
"More details about this collection": "Подробнее об этой коллекции…",
"Private collection": "Частная коллекция",
"A private collection will only be visible to invited team members.": "Частная коллекция будет видна только приглашенным членам команды.",
"Saving": "Saving",
"Save": "Сохранить",
"{{ groupName }} was added to the collection": "{{ groupName }} добавлен в коллекцию",
"Could not add user": "Не удалось добавить пользователя",
"Cant find the group youre looking for?": "Не можете найти интересующую Вас группу?",
"Create a group": "Создать группу",
"Search by group name": "Search by group name",
"Search groups": "Поиск групп",
"No groups matching your search": "Нет групп, соответствующих вашему запросу",
"No groups left to add": "Не осталось групп для добавления",
"Add": "Добавить",
"{{ userName }} was added to the collection": "{{ userName }} добавлен в коллекцию",
"Need to add someone whos not yet on the team yet?": "Нужно добавить кого-то, кого еще нет в команде?",
"Invite people to {{ teamName }}": "Пригласить людей в {{ teamName }}",
"Search by name": "Search by name",
"Search people": "Поиск людей",
"No people matching your search": "Нет людей, соответствующих вашему запросу",
"No people left to add": "Не осталось людей для добавления",
"Read only": "Только для чтения",
"Read & Edit": "Читать и редактировать",
"Remove": "Удалить",
"Active <1></1> ago": "Active <1></1> ago",
"Never signed in": "Никогда не входил",
"Invited": "Приглашенные",
"Admin": "Администратор",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Коллекции предназначены для группирования вашей базы знаний. Они работают лучше всего, когда организованы вокруг определенной темы или внутренней команды — например, Продукта или Разработки.",
"Creating": "Creating",
"Create": "Создать",
"Recently viewed": "Недавно просмотренные",
"Created by me": "Созданные мной",
"Hide contents": "Скрыть содержимое",
"Show contents": "Показать содержимое",
"Archived": "Архивировано",
"Anyone with the link <1></1>can view this document": "Все, у кого есть ссылка <1></1> могут просмотреть этот документ",
"Share": "Поделиться",
"Save Draft": "Сохранить черновик",
"Done Editing": "Правки внесены",
"Edit {{noun}}": "Редактировать {{noun}}",
"New from template": "Создать из шаблона",
"Publish": "Опубликовать",
"Publish document": "Опубликовать документ",
"Publishing": "Publishing",
"No documents found for your filters.": "По вашему запросу ничего не найдено.",
"Youve not got any drafts at the moment.": "На данный момент у вас нет черновиков.",
"Not found": "Не найдено",
"We were unable to find the page youre looking for. Go to the <2>homepage</2>?": "Нам не удалось найти страницу, которую вы ищете. Перейти на <2>домашнюю страницу</2>?",
"Offline": "Оффлайн",
"We were unable to load the document while offline.": "Нам не удалось загрузить документ в режиме оффлайн.",
"Your account has been suspended": "Ваш аккаунт был заблокирован",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "Администратор команды (<1>{{suspendedContactEmail}}</1>) заблокировал Вашу учетную запись. Чтобы возобновить действие аккаунта, свяжитесь с ним напрямую.",
"{{userName}} was added to the group": "{{userName}} добавлен в группу",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "Добавьте ниже членов команды, чтобы предоставить им доступ к группе. Нужно добавить кого-то, кого еще нет в команде?",
"Invite them to {{teamName}}": "Пригласить их в {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} удален из группы",
"Could not remove user": "Не удалось удалить пользователя",
"Add people": "Add people",
"This group has no members.": "В этой группе нет участников.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline разработан, чтобы быть быстрым и простым в использовании. Здесь работают все привычные сочетания клавиш, а также есть Markdown.",
"Navigation": "Навигация",
"New document in current collection": "Новый документ в текущей коллекции",
"Edit current document": "Редактировать текущий документ",
"Move current document": "Переместить текущий документ",
"Jump to search": "Перейти к поиску",
"Jump to dashboard": "Перейти к панели управления",
"Table of contents": "Содержание",
"Open this guide": "Открыть эту инструкцию",
"Editor": "Редактор",
"Save and exit document edit mode": "Сохранить и закончить редактирование документа",
"Publish and exit document edit mode": "Опубликовать и закончить редактирование документа",
"Save document and continue editing": "Сохранить документ и продолжить редактирование",
"Cancel editing": "Отменить редактирование",
"Underline": "Подчеркивание",
"Undo": "Отменить",
"Redo": "Повторить",
"Remove link": "Remove link",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "Strikethrough",
"Bold": "Bold",
"Subheading": "Subheading",
"Table": "Table",
"Tip": "Tip",
"Tip notice": "Tip notice",
"Warning": "Warning",
"Warning notice": "Warning notice",
"Search…": "Search…",
"Keyboard shortcuts": "Keyboard shortcuts",
"New collection…": "New collection…",
"Collections": "Collections",
"Untitled": "Untitled",
"Home": "Home",
"Search": "Search",
"Starred": "Starred",
"Invite people…": "Invite people…",
"Invite people": "Invite people",
"Create a collection": "Create a collection",
"Return to App": "Return to App",
"Profile": "Profile",
"Notifications": "Notifications",
"API Tokens": "API Tokens",
"Details": "Details",
"Security": "Security",
"People": "People",
"Groups": "Groups",
"Share Links": "Share Links",
"Export Data": "Export Data",
"Integrations": "Integrations",
"Installation": "Installation",
"Settings": "Settings",
"API documentation": "API documentation",
"Changelog": "Changelog",
"Send us feedback": "Send us feedback",
"Report a bug": "Report a bug",
"Appearance": "Appearance",
"System": "System",
"Light": "Light",
"Dark": "Dark",
"Log out": "Log out",
"Collection permissions": "Collection permissions",
"New document": "New document",
"Import document": "Import document",
"Edit…": "Edit…",
"Permissions": "Permissions…",
"Export…": "Export…",
"Delete…": "Delete…",
"Edit collection": "Edit collection",
"Delete collection": "Delete collection",
"Export collection": "Export collection",
"Document duplicated": "Document duplicated",
"Document archived": "Document archived",
"Document restored": "Document restored",
"Document unpublished": "Document unpublished",
"Restore": "Restore",
"Restore…": "Restore…",
"Choose a collection": "Choose a collection",
"Unpin": "Unpin",
"Pin to collection": "Pin to collection",
"Unstar": "Unstar",
"Star": "Star",
"Share link…": "Share link…",
"Enable embeds": "Enable embeds",
"Disable embeds": "Disable embeds",
"New nested document": "New nested document",
"Create template…": "Create template…",
"Edit": "Edit",
"Duplicate": "Duplicate",
"Unpublish": "Unpublish",
"Move…": "Move…",
"History": "History",
"Download": "Download",
"Print": "Print",
"Delete {{ documentName }}": "Delete {{ documentName }}",
"Create template": "Create template",
"Share document": "Share document",
"Edit group": "Edit group",
"Delete group": "Delete group",
"Members…": "Members…",
"New document in": "New document in",
"collection": "collection",
"New template…": "New template…",
"Link copied": "Link copied",
"Restore version": "Restore version",
"Copy link": "Copy link",
"Share link revoked": "Share link revoked",
"Share link copied": "Share link copied",
"Go to document": "Go to document",
"Revoke link": "Revoke link",
"By {{ author }}": "By {{ author }}",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.",
"Are you sure you want to make {{ userName }} a member?": "Are you sure you want to make {{ userName }} a member?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Are you sure you want to suspend this account? Suspended users will be prevented from logging in.",
"Make {{ userName }} a member…": "Make {{ userName }} a member…",
"Make {{ userName }} an admin…": "Make {{ userName }} an admin…",
"Revoke invite…": "Revoke invite…",
"Activate account": "Activate account",
"Suspend account": "Suspend account…",
"Documents": "Documents",
"The document archive is empty at the moment.": "The document archive is empty at the moment.",
"Search in collection…": "Search in collection…",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> doesnt contain any documents yet.",
"Get started by creating a new one!": "Get started by creating a new one!",
"Create a document": "Create a document",
"Manage members…": "Manage members…",
"Pinned": "Pinned",
"Recently updated": "Recently updated",
"Recently published": "Recently published",
"Least recently updated": "Least recently updated",
"AZ": "AZ",
"The collection was updated": "The collection was updated",
"You can edit the name and other details at any time, however doing so often might confuse your team mates.": "You can edit the name and other details at any time, however doing so often might confuse your team mates.",
"Name": "Name",
"Description": "Description",
"More details about this collection": "More details about this collection…",
"Private collection": "Private collection",
"A private collection will only be visible to invited team members.": "A private collection will only be visible to invited team members.",
"Saving…": "Saving…",
"Save": "Save",
"{{ groupName }} was added to the collection": "{{ groupName }} was added to the collection",
"Could not add user": "Could not add user",
"Cant find the group youre looking for?": "Cant find the group youre looking for?",
"Create a group": "Create a group",
"Search by group name…": "Search by group name…",
"Search groups": "Search groups",
"No groups matching your search": "No groups matching your search",
"No groups left to add": "No groups left to add",
"Add": "Add",
"{{ userName }} was added to the collection": "{{ userName }} was added to the collection",
"Need to add someone whos not yet on the team yet?": "Need to add someone whos not yet on the team yet?",
"Invite people to {{ teamName }}": "Invite people to {{ teamName }}",
"Search by name…": "Search by name…",
"Search people": "Search people",
"No people matching your search": "No people matching your search",
"No people left to add": "No people left to add",
"Read only": "Read only",
"Read & Edit": "Read & Edit",
"Permissions": "Permissions",
"Remove": "Remove",
"Active {{ lastActiveAt }} ago": "Active {{ lastActiveAt }} ago",
"Never signed in": "Never signed in",
"Invited": "Invited",
"Admin": "Admin",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.",
"Creating": "Creating",
"Create": "Create",
"Recently viewed": "Recently viewed",
"Created by me": "Created by me",
"Hide contents": "Hide contents",
"Show contents": "Show contents",
"Archived": "Archived",
"Anyone with the link <1></1>can view this document": "Anyone with the link <1></1>can view this document",
"Share": "Share",
"Save Draft": "Save Draft",
"Done Editing": "Done Editing",
"Edit {{noun}}": "Edit {{noun}}",
"New from template": "New from template",
"Publish": "Publish",
"Publish document": "Publish document",
"Publishing": "Publishing",
"No documents found for your filters.": "No documents found for your filters.",
"Youve not got any drafts at the moment.": "Youve not got any drafts at the moment.",
"Not found": "Not found",
"We were unable to find the page youre looking for. Go to the <2>homepage</2>?": "We were unable to find the page youre looking for. Go to the <2>homepage</2>?",
"Offline": "Offline",
"We were unable to load the document while offline.": "We were unable to load the document while offline.",
"Your account has been suspended": "Your account has been suspended",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.",
"{{userName}} was added to the group": "{{userName}} was added to the group",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?",
"Invite them to {{teamName}}": "Invite them to {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} was removed from the group",
"Could not remove user": "Could not remove user",
"Add people": "Add people",
"This group has no members.": "This group has no members.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.",
"Navigation": "Navigation",
"New document in current collection": "New document in current collection",
"Edit current document": "Edit current document",
"Move current document": "Move current document",
"Jump to search": "Jump to search",
"Jump to dashboard": "Jump to dashboard",
"Table of contents": "Table of contents",
"Open this guide": "Open this guide",
"Editor": "Editor",
"Save and exit document edit mode": "Save and exit document edit mode",
"Publish and exit document edit mode": "Publish and exit document edit mode",
"Save document and continue editing": "Save document and continue editing",
"Cancel editing": "Cancel editing",
"Underline": "Underline",
"Undo": "Undo",
"Redo": "Redo",
"Markdown": "Markdown",
"Large header": "Большой заголовок",
"Medium header": "Средний заголовок",
"Small header": "Малый заголовок",
"Numbered list": "Нумерованный список",
"Blockquote": "Цитата",
"Horizontal divider": "Горизонтальный разделитель",
"Inline code": "Встроенный код",
"Not Found": "Не найдено",
"We were unable to find the page youre looking for.": "Нам не удалось найти нужную вам страницу.",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "Используйте сочетание клавиш <1>{{meta}}+K</1> для поиска в базе знаний, находясь где угодно",
"No documents found for your search filters. <1></1>Create a new document?": "Не найдено документов для ваших поисковых фильтров. <1></1>Создать новый документ?",
"Clear filters": "Сбросить фильтры",
"Profile saved": "Профиль сохранен",
"Profile picture updated": "Фото профиля обновлено",
"Unable to upload new profile picture": "Невозможно загрузить новое фото профиля",
"Photo": "Фото",
"Upload": "Загрузить",
"Full name": "Полное имя",
"Language": "Язык",
"Please note that translations are currently in early access.<1></1>Community contributions are accepted though our <4>translation portal</4>": "Обратите внимание, что в настоящее время переводы находятся в раннем доступе.<1></1>Вклады сообщества принимаются через наш <4>портал переводов</4>",
"Delete Account": "Удалить аккаунт",
"You may delete your account at any time, note that this is unrecoverable": "Вы можете удалить свой аккаунт в любое время, обратите внимание, что это необратимо",
"Delete account": "Удалить аккаунт",
"Alphabetical": "По алфавиту",
"Youve not starred any documents yet.": "Вы еще не добавили ни одного документа в избранное.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "Шаблонов пока нет. Вы можете создавать шаблоны, которые помогут вашей команде создать последовательную и точную документацию.",
"Trash is empty at the moment.": "Корзина пока пуста.",
"You joined": "Вы присоединились",
"Joined": "Присоединились",
"{{ time }} ago.": "{{ time }} назад.",
"Suspended": "Заблокированы",
"Edit Profile": "Редактировать профиль",
"{{ userName }} hasnt updated any documents yet.": "{{ userName }} еще не обновил ни одного документа."
"Large header": "Large header",
"Medium header": "Medium header",
"Small header": "Small header",
"Numbered list": "Numbered list",
"Blockquote": "Blockquote",
"Horizontal divider": "Horizontal divider",
"Inline code": "Inline code",
"Not Found": "Not Found",
"We were unable to find the page youre looking for.": "We were unable to find the page youre looking for.",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base",
"No documents found for your search filters. <1></1>Create a new document?": "No documents found for your search filters. <1></1>Create a new document?",
"Clear filters": "Clear filters",
"Profile saved": "Profile saved",
"Profile picture updated": "Profile picture updated",
"Unable to upload new profile picture": "Unable to upload new profile picture",
"Photo": "Photo",
"Upload": "Upload",
"Full name": "Full name",
"Language": "Language",
"Please note that translations are currently in early access.<1></1>Community contributions are accepted though our <4>translation portal</4>": "Please note that translations are currently in early access.<1></1>Community contributions are accepted though our <4>translation portal</4>",
"Delete Account": "Delete Account",
"You may delete your account at any time, note that this is unrecoverable": "You may delete your account at any time, note that this is unrecoverable",
"Delete account": "Delete account",
"Recently Updated": "Recently Updated",
"Alphabetical": "Alphabetical",
"Youve not starred any documents yet.": "Youve not starred any documents yet.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.",
"Trash is empty at the moment.": "Trash is empty at the moment.",
"You joined": "You joined",
"Joined": "Joined",
"{{ time }} ago.": "{{ time }} ago.",
"Suspended": "Suspended",
"Edit Profile": "Edit Profile",
"{{ userName }} hasnt updated any documents yet.": "{{ userName }} hasnt updated any documents yet."
}
+223 -232
View File
@@ -1,218 +1,208 @@
{
"currently editing": "正在编辑:",
"currently viewing": "目前查看",
"viewed {{ timeAgo }} ago": "{{ timeAgo }} 前浏览",
"You": "",
"Trash": "回收站",
"Archive": "归档",
"Drafts": "草稿",
"Templates": "文档模板",
"Deleted Collection": "删除文档集",
"deleted": "已删除",
"archived": "已归档",
"created": "已创建",
"published": "已发布",
"saved": "保存成功",
"updated": "更新成功",
"Never viewed": "未被浏览",
"Viewed": "已浏览",
"in": "在",
"New": "新",
"Only visible to you": "只对您可见",
"Draft": "草稿",
"Template": "模板",
"New doc": "新文档",
"More options": "更多选项",
"Insert column after": "向后插入列",
"Insert column before": "向前插入列",
"Insert row after": "上方插入行",
"Insert row before": "下方插入行",
"Align center": "居中对齐",
"Align left": "左对齐",
"Align right": "右对齐",
"Bulleted list": "无序列表",
"Todo list": "待办事项列表",
"Code block": "代码块",
"Copied to clipboard": "已复制到剪切板",
"Code": "代码",
"Create link": "创建链接",
"Sorry, an error occurred creating the link": "抱歉,创建链接时发生错误",
"Create a new doc": "新建文档",
"Delete column": "删除列",
"Delete row": "删除行",
"Delete table": "删除表格",
"Italic": "斜体",
"Sorry, that link wont work for this embed type": "抱歉,该链接不适用于此嵌入类型",
"Find or create a doc": "Find or create a doc",
"Big heading": "主标题",
"Medium heading": "次标题",
"Small heading": "小标题",
"Heading": "标题",
"Divider": "分割线",
"Image": "图片",
"Sorry, an error occurred uploading the image": "抱歉,上传图片时发生错误",
"Info": "信息",
"Info notice": "信息提示",
"Link": "链接",
"Link copied to clipboard": "链接已经复制到剪贴板",
"Highlight": "高亮",
"Type '/' to insert": "Type '/' to insert",
"Keep typing to filter": "Keep typing to filter",
"No results": "没有找到结果",
"Open link": "打开链接",
"Ordered list": "有序列表",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "粘贴 {{service}} 链接…",
"Placeholder": "占位符",
"Quote": "引用",
"Remove link": "移除链接",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "删除线",
"Bold": "加粗",
"Subheading": "副标题",
"Table": "表格",
"Tip": "提示",
"Tip notice": "提示信息",
"Warning": "警告",
"Warning notice": "警告信息",
"Icon": "图标",
"Loading": "Loading",
"Search": "搜索",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline 当前支持 {{optionLabel}},您想要更改吗?",
"Change Language": "更改界面语言",
"Dismiss": "忽略",
"Keyboard shortcuts": "快捷键",
"New collection": "New collection",
"Collections": "文档集",
"Untitled": "无标题文档",
"Home": "主页",
"Starred": "已加星标",
"Invite people…": "邀请其他人…",
"Invite people": "邀请其他人",
"Create a collection": "创建文档集",
"Return to App": "返回应用",
"Profile": "基本资料",
"Notifications": "通知",
"currently editing": "currently editing",
"currently viewing": "currently viewing",
"viewed {{ timeAgo }} ago": "viewed {{ timeAgo }} ago",
"You": "You",
"Trash": "Trash",
"Archive": "Archive",
"Drafts": "Drafts",
"Templates": "Templates",
"New": "New",
"Only visible to you": "Only visible to you",
"Draft": "Draft",
"Template": "Template",
"New doc": "New doc",
"More options": "More options",
"Insert column after": "Insert column after",
"Insert column before": "Insert column before",
"Insert row after": "Insert row after",
"Insert row before": "Insert row before",
"Align center": "Align center",
"Align left": "Align left",
"Align right": "Align right",
"Bulleted list": "Bulleted list",
"Todo list": "Todo list",
"Code block": "Code block",
"Copied to clipboard": "Copied to clipboard",
"Code": "Code",
"Create link": "Create link",
"Sorry, an error occurred creating the link": "Sorry, an error occurred creating the link",
"Create a new doc": "Create a new doc",
"Delete column": "Delete column",
"Delete row": "Delete row",
"Delete table": "Delete table",
"Italic": "Italic",
"Sorry, that link wont work for this embed type": "Sorry, that link wont work for this embed type",
"Find or create a doc…": "Find or create a doc…",
"Big heading": "Big heading",
"Medium heading": "Medium heading",
"Small heading": "Small heading",
"Heading": "Heading",
"Divider": "Divider",
"Image": "Image",
"Sorry, an error occurred uploading the image": "Sorry, an error occurred uploading the image",
"Info": "Info",
"Info notice": "Info notice",
"Link": "Link",
"Link copied to clipboard": "Link copied to clipboard",
"Highlight": "Highlight",
"Type '/' to insert…": "Type '/' to insert…",
"Keep typing to filter…": "Keep typing to filter…",
"No results": "No results",
"Open link": "Open link",
"Ordered list": "Ordered list",
"Paste a link…": "Paste a link…",
"Paste a {{service}} link…": "Paste a {{service}} link…",
"Placeholder": "Placeholder",
"Quote": "Quote",
"Remove link": "Remove link",
"Search or paste a link…": "Search or paste a link…",
"Strikethrough": "Strikethrough",
"Bold": "Bold",
"Subheading": "Subheading",
"Table": "Table",
"Tip": "Tip",
"Tip notice": "Tip notice",
"Warning": "Warning",
"Warning notice": "Warning notice",
"Search…": "Search…",
"Keyboard shortcuts": "Keyboard shortcuts",
"New collection…": "New collection…",
"Collections": "Collections",
"Untitled": "Untitled",
"Home": "Home",
"Search": "Search",
"Starred": "Starred",
"Invite people…": "Invite people…",
"Invite people": "Invite people",
"Create a collection": "Create a collection",
"Return to App": "Return to App",
"Profile": "Profile",
"Notifications": "Notifications",
"API Tokens": "API Tokens",
"Details": "详细信息",
"Security": "安全性",
"People": "用户",
"Groups": "用户组",
"Details": "Details",
"Security": "Security",
"People": "People",
"Groups": "Groups",
"Share Links": "Share Links",
"Export Data": "Export Data",
"Integrations": "Integrations",
"Installation": "Installation",
"Settings": "Settings",
"API documentation": "API 文档",
"Changelog": "更新日志",
"Send us feedback": "发送反馈",
"API documentation": "API documentation",
"Changelog": "Changelog",
"Send us feedback": "Send us feedback",
"Report a bug": "Report a bug",
"Appearance": "界面外观",
"System": "系统信息",
"Appearance": "Appearance",
"System": "System",
"Light": "Light",
"Dark": "Dark",
"Log out": "退出登录",
"Collection permissions": "文档集权限",
"New document": "新建文档",
"Import document": "导入文档",
"Edit": "编辑",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "编辑文档集",
"Delete collection": "删除文档集",
"Export collection": "导出文档集",
"Log out": "Log out",
"Collection permissions": "Collection permissions",
"New document": "New document",
"Import document": "Import document",
"Edit": "Edit…",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "Edit collection",
"Delete collection": "Delete collection",
"Export collection": "Export collection",
"Document duplicated": "Document duplicated",
"Document archived": "文件已封存",
"Document restored": "文档已恢复",
"Document archived": "Document archived",
"Document restored": "Document restored",
"Document unpublished": "Document unpublished",
"Restore": "恢复",
"Choose a collection": "选择一个文档集",
"Unpin": "取消置顶",
"Pin to collection": "置顶文档集",
"Unstar": "取消星标",
"Star": "加星标",
"Share link": "Share link",
"Enable embeds": "启用嵌入",
"Disable embeds": "禁用嵌入",
"New nested document": "新的嵌套文档",
"Create template": "创建模板",
"Duplicate": "复制项目",
"Unpublish": "取消发布",
"Move": "Move",
"History": "历史记录",
"Download": "下载",
"Print": "打印",
"Delete {{ documentName }}": "删除 {{ documentName }}",
"Share document": "共享文档",
"Edit group": "编辑群组",
"Delete group": "刪除群組",
"Members": "Members",
"collection": "文档集",
"New document in <1>{{collectionName}}</1>": "New document in <1>{{collectionName}}</1>",
"New template": "New template",
"Link copied": "链接已复制",
"Restore version": "恢复此版本",
"Copy link": "复制链接",
"Share link revoked": "已撤销分享链接",
"Share link copied": "分享链接已复制",
"Go to document": "转到文档",
"Revoke link": "撤消链接",
"By {{ author }}": "作者 {{ author }}",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "您确定要设置 {{ userName }} 为管理员吗?管理员可以修改团队和帐单信息。",
"Are you sure you want to make {{ userName }} a member?": "您确定要设置 {{ userName }} 为成员吗?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "您确定要冻结此帐户吗?被冻结的用户将无法登录。",
"Make {{ userName }} a member…": "将 {{ userName }} 设为成员…",
"Make {{ userName }} an admin…": "将 {{ userName }} 设为管理员…",
"Revoke invite": "Revoke invite",
"Activate account": "激活帐号",
"Suspend account": "Suspend account",
"Documents": "文档",
"The document archive is empty at the moment.": "目前没有被归档的文档",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0>目前还没有任何文档",
"Get started by creating a new one!": "从创建一个新文档集开始!",
"Create a document": "创建文档",
"Manage members": "Manage members",
"Pinned": "已置顶",
"Recently updated": "最近更新",
"Recently published": "最近发布",
"Least recently updated": "最旧未更新",
"AZ": "字母序",
"The collection was updated": "文档集已更新",
"Restore": "Restore",
"Restore…": "Restore…",
"Choose a collection": "Choose a collection",
"Unpin": "Unpin",
"Pin to collection": "Pin to collection",
"Unstar": "Unstar",
"Star": "Star",
"Share link…": "Share link…",
"Enable embeds": "Enable embeds",
"Disable embeds": "Disable embeds",
"New nested document": "New nested document",
"Create template": "Create template…",
"Edit": "Edit",
"Duplicate": "Duplicate",
"Unpublish": "Unpublish",
"Move…": "Move…",
"History": "History",
"Download": "Download",
"Print": "Print",
"Delete {{ documentName }}": "Delete {{ documentName }}",
"Create template": "Create template",
"Share document": "Share document",
"Edit group": "Edit group",
"Delete group": "Delete group",
"Members…": "Members…",
"New document in": "New document in",
"collection": "collection",
"New template…": "New template…",
"Link copied": "Link copied",
"Restore version": "Restore version",
"Copy link": "Copy link",
"Share link revoked": "Share link revoked",
"Share link copied": "Share link copied",
"Go to document": "Go to document",
"Revoke link": "Revoke link",
"By {{ author }}": "By {{ author }}",
"Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.",
"Are you sure you want to make {{ userName }} a member?": "Are you sure you want to make {{ userName }} a member?",
"Are you sure you want to suspend this account? Suspended users will be prevented from logging in.": "Are you sure you want to suspend this account? Suspended users will be prevented from logging in.",
"Make {{ userName }} a member…": "Make {{ userName }} a member…",
"Make {{ userName }} an admin…": "Make {{ userName }} an admin…",
"Revoke invite…": "Revoke invite…",
"Activate account": "Activate account",
"Suspend account…": "Suspend account…",
"Documents": "Documents",
"The document archive is empty at the moment.": "The document archive is empty at the moment.",
"Search in collection…": "Search in collection…",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0> doesnt contain any documents yet.",
"Get started by creating a new one!": "Get started by creating a new one!",
"Create a document": "Create a document",
"Manage members…": "Manage members…",
"Pinned": "Pinned",
"Recently updated": "Recently updated",
"Recently published": "Recently published",
"Least recently updated": "Least recently updated",
"AZ": "AZ",
"The collection was updated": "The collection was updated",
"You can edit the name and other details at any time, however doing so often might confuse your team mates.": "You can edit the name and other details at any time, however doing so often might confuse your team mates.",
"Name": "Name",
"Description": "Description",
"More details about this collection…": "有关此文档集的更多详细信息…",
"Private collection": "私密文档集",
"A private collection will only be visible to invited team members.": "私密文档集仅对受邀团队成员可见。",
"Saving": "Saving",
"More details about this collection…": "More details about this collection…",
"Private collection": "Private collection",
"A private collection will only be visible to invited team members.": "A private collection will only be visible to invited team members.",
"Saving": "Saving",
"Save": "Save",
"{{ groupName }} was added to the collection": "{{ groupName }} 已添加到文档集",
"{{ groupName }} was added to the collection": "{{ groupName }} was added to the collection",
"Could not add user": "Could not add user",
"Cant find the group youre looking for?": "Cant find the group youre looking for?",
"Create a group": "Create a group",
"Search by group name": "Search by group name",
"Search by group name": "Search by group name",
"Search groups": "Search groups",
"No groups matching your search": "No groups matching your search",
"No groups left to add": "No groups left to add",
"Add": "Add",
"{{ userName }} was added to the collection": "{{ userName }} 已添加到文档集",
"{{ userName }} was added to the collection": "{{ userName }} was added to the collection",
"Need to add someone whos not yet on the team yet?": "Need to add someone whos not yet on the team yet?",
"Invite people to {{ teamName }}": "Invite people to {{ teamName }}",
"Search by name": "Search by name",
"Search by name": "Search by name",
"Search people": "Search people",
"No people matching your search": "No people matching your search",
"No people left to add": "No people left to add",
"Read only": "Read only",
"Read & Edit": "Read & Edit",
"Permissions": "Permissions",
"Remove": "Remove",
"Active <1></1> ago": "Active <1></1> ago",
"Active {{ lastActiveAt }} ago": "Active {{ lastActiveAt }} ago",
"Never signed in": "Never signed in",
"Invited": "Invited",
"Admin": "Admin",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "文档集用于对文档进行分组。建议使用文档集管理同一主题或固定团队(比如产品团队或工程师团队)的文档。",
"Creating": "Creating",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.",
"Creating": "Creating",
"Create": "Create",
"Recently viewed": "Recently viewed",
"Created by me": "Created by me",
@@ -225,57 +215,57 @@
"Done Editing": "Done Editing",
"Edit {{noun}}": "Edit {{noun}}",
"New from template": "New from template",
"Publish": "发布",
"Publish document": "发布文档",
"Publishing": "Publishing",
"No documents found for your filters.": "没有找到相关文档。",
"Youve not got any drafts at the moment.": "您目前还没有任何草稿。",
"Not found": "没有找到",
"We were unable to find the page youre looking for. Go to the <2>homepage</2>?": "我们找不到您要查找的页面。转到<2>主页</2>",
"Offline": "离线",
"We were unable to load the document while offline.": "离线时我们无法加载文档。",
"Your account has been suspended": "您的账户已被停用",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "团队管理员(<1>{{suspendedContactEmail}}</1> )已暂停您的帐户。要重新激活您的帐户,请直接与他们联系。",
"{{userName}} was added to the group": "{{userName}} 已添加到群组",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "在下方添加团队成员以便让他们访问群组。需要添加尚未加入团队的人吗?",
"Invite them to {{teamName}}": "邀请他们加入 {{teamName}}",
"{{userName}} was removed from the group": "从群组中移除 {{userName}}",
"Could not remove user": "无法删除用户",
"Add people": "Add people",
"This group has no members.": "这个群组没有任何成员",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline 旨在快速且易于使用。您常用的键盘快捷键都可使用,还支持 Markdown 语法。",
"Navigation": "导航",
"New document in current collection": "在当前文档集中创建新文档",
"Edit current document": "编辑当前文档",
"Move current document": "移动当前文档",
"Jump to search": "跳转到搜索",
"Jump to dashboard": "跳转到仪表板",
"Table of contents": "目录",
"Open this guide": "打开本指南",
"Editor": "编辑器",
"Save and exit document edit mode": "保存并退出文档编辑模式",
"Publish and exit document edit mode": "发布并退出文档编辑模式",
"Save document and continue editing": "保存文档并继续编辑",
"Cancel editing": "取消编辑",
"Underline": "下划线",
"Undo": "撤销",
"Redo": "重做",
"Markdown": "Markdown 语法",
"Large header": "大标题",
"Medium header": "中标题",
"Small header": "小标题",
"Numbered list": "编号列表",
"Blockquote": "块引用",
"Horizontal divider": "水平分隔线",
"Inline code": "行内代码",
"Not Found": "没找到",
"We were unable to find the page youre looking for.": "我们找不到您要查找的页面。",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "在知识库的任何位置,按下 <1>{{meta}}+K</1> 快捷键就可以启动搜索",
"No documents found for your search filters. <1></1>Create a new document?": "找不到相关文档。<1></1>创建一个新文档?",
"Clear filters": "清除筛选",
"Profile saved": "配置文件已保存",
"Profile picture updated": "个人图片已更新",
"Unable to upload new profile picture": "不能上传个人资料照片",
"Publish": "Publish",
"Publish document": "Publish document",
"Publishing": "Publishing",
"No documents found for your filters.": "No documents found for your filters.",
"Youve not got any drafts at the moment.": "Youve not got any drafts at the moment.",
"Not found": "Not found",
"We were unable to find the page youre looking for. Go to the <2>homepage</2>?": "We were unable to find the page youre looking for. Go to the <2>homepage</2>?",
"Offline": "Offline",
"We were unable to load the document while offline.": "We were unable to load the document while offline.",
"Your account has been suspended": "Your account has been suspended",
"A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.": "A team admin (<1>{{suspendedContactEmail}}</1>) has suspended your account. To re-activate your account, please reach out to them directly.",
"{{userName}} was added to the group": "{{userName}} was added to the group",
"Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?": "Add team members below to give them access to the group. Need to add someone whos not yet on the team yet?",
"Invite them to {{teamName}}": "Invite them to {{teamName}}",
"{{userName}} was removed from the group": "{{userName}} was removed from the group",
"Could not remove user": "Could not remove user",
"Add people": "Add people",
"This group has no members.": "This group has no members.",
"Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.": "Outline is designed to be fast and easy to use. All of your usual keyboard shortcuts work here, and theres Markdown too.",
"Navigation": "Navigation",
"New document in current collection": "New document in current collection",
"Edit current document": "Edit current document",
"Move current document": "Move current document",
"Jump to search": "Jump to search",
"Jump to dashboard": "Jump to dashboard",
"Table of contents": "Table of contents",
"Open this guide": "Open this guide",
"Editor": "Editor",
"Save and exit document edit mode": "Save and exit document edit mode",
"Publish and exit document edit mode": "Publish and exit document edit mode",
"Save document and continue editing": "Save document and continue editing",
"Cancel editing": "Cancel editing",
"Underline": "Underline",
"Undo": "Undo",
"Redo": "Redo",
"Markdown": "Markdown",
"Large header": "Large header",
"Medium header": "Medium header",
"Small header": "Small header",
"Numbered list": "Numbered list",
"Blockquote": "Blockquote",
"Horizontal divider": "Horizontal divider",
"Inline code": "Inline code",
"Not Found": "Not Found",
"We were unable to find the page youre looking for.": "We were unable to find the page youre looking for.",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base",
"No documents found for your search filters. <1></1>Create a new document?": "No documents found for your search filters. <1></1>Create a new document?",
"Clear filters": "Clear filters",
"Profile saved": "Profile saved",
"Profile picture updated": "Profile picture updated",
"Unable to upload new profile picture": "Unable to upload new profile picture",
"Photo": "Photo",
"Upload": "Upload",
"Full name": "Full name",
@@ -284,6 +274,7 @@
"Delete Account": "Delete Account",
"You may delete your account at any time, note that this is unrecoverable": "You may delete your account at any time, note that this is unrecoverable",
"Delete account": "Delete account",
"Recently Updated": "Recently Updated",
"Alphabetical": "Alphabetical",
"Youve not starred any documents yet.": "Youve not starred any documents yet.",
"There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.": "There are no templates just yet. You can create templates to help your team create consistent and accurate documentation.",
-1
View File
@@ -48,7 +48,6 @@ const spacing = {
vpadding: "1.5vw",
hpadding: "1.875vw",
sidebarWidth: "280px",
sidebarCollapsedWidth: "16px",
sidebarMinWidth: "250px",
sidebarMaxWidth: "350px",
};
+8 -88
View File
@@ -1365,21 +1365,6 @@
dependencies:
"@types/node" ">= 8"
"@react-dnd/asap@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.0.tgz#b300eeed83e9801f51bd66b0337c9a6f04548651"
integrity sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==
"@react-dnd/invariant@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e"
integrity sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==
"@react-dnd/shallowequal@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a"
integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==
"@rehooks/window-scroll-position@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@rehooks/window-scroll-position/-/window-scroll-position-1.0.1.tgz#3cb80f22cbf9cdbd2041b5236ae1fce8245b2f1c"
@@ -1570,14 +1555,6 @@
dependencies:
"@types/unist" "*"
"@types/hoist-non-react-statics@^3.3.1":
version "3.3.1"
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
dependencies:
"@types/react" "*"
hoist-non-react-statics "^3.3.0"
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
@@ -1627,19 +1604,6 @@
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.5.tgz#b6ab3bba29e16b821d84e09ecfaded462b816b00"
integrity sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==
"@types/prop-types@*":
version "15.7.3"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
"@types/react@*":
version "17.0.0"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.0.tgz#5af3eb7fad2807092f0046a1302b7823e27919b8"
integrity sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
"@types/stack-utils@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff"
@@ -3801,11 +3765,6 @@ cssstyle@^2.2.0:
dependencies:
cssom "~0.3.6"
csstype@^3.0.2:
version "3.0.5"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.5.tgz#7fdec6a28a67ae18647c51668a9ff95bb2fa7bb8"
integrity sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==
cyclist@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
@@ -4043,15 +4002,6 @@ direction@^0.1.5:
resolved "https://registry.yarnpkg.com/direction/-/direction-0.1.5.tgz#ce5d797f97e26f8be7beff53f7dc40e1c1a9ec4c"
integrity sha1-zl15f5fib4vnvv9T99xA4cGp7Ew=
dnd-core@^11.1.3:
version "11.1.3"
resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-11.1.3.tgz#f92099ba7245e49729d2433157031a6267afcc98"
integrity sha512-QugF55dNW+h+vzxVJ/LSJeTeUw9MCJ2cllhmVThVPEtF16ooBkxj0WBE5RB+AceFxMFo1rO6bJKXtqKl+JNnyA==
dependencies:
"@react-dnd/asap" "^4.0.0"
"@react-dnd/invariant" "^2.0.0"
redux "^4.0.4"
doctrine@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
@@ -5803,7 +5753,7 @@ hmac-drbg@^1.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -6162,9 +6112,9 @@ inherits@2.0.3:
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.7"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
internal-slot@^1.0.2:
version "1.0.2"
@@ -9809,23 +9759,6 @@ react-color@^2.17.3:
reactcss "^1.2.0"
tinycolor2 "^1.4.1"
react-dnd-html5-backend@^11.1.3:
version "11.1.3"
resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-11.1.3.tgz#2749f04f416ec230ea193f5c1fbea2de7dffb8f7"
integrity sha512-/1FjNlJbW/ivkUxlxQd7o3trA5DE33QiRZgxent3zKme8DwF4Nbw3OFVhTRFGaYhHFNL1rZt6Rdj1D78BjnNLw==
dependencies:
dnd-core "^11.1.3"
react-dnd@^11.1.3:
version "11.1.3"
resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-11.1.3.tgz#f9844f5699ccc55dfc81462c2c19f726e670c1af"
integrity sha512-8rtzzT8iwHgdSC89VktwhqdKKtfXaAyC4wiqp0SywpHG12TTLvfOoL6xNEIUWXwIEWu+CFfDn4GZJyynCEuHIQ==
dependencies:
"@react-dnd/shallowequal" "^2.0.0"
"@types/hoist-non-react-statics" "^3.3.1"
dnd-core "^11.1.3"
hoist-non-react-statics "^3.3.0"
react-dom@^16.8.6:
version "16.14.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89"
@@ -10094,14 +10027,6 @@ redis@^3.0.0:
redis-errors "^1.2.0"
redis-parser "^3.0.0"
redux@^4.0.4:
version "4.0.5"
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
dependencies:
loose-envify "^1.4.0"
symbol-observable "^1.2.0"
referrer-policy@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.2.0.tgz#b99cfb8b57090dc454895ef897a4cc35ef67a98e"
@@ -10414,10 +10339,10 @@ retry-as-promised@^3.2.0:
dependencies:
any-promise "^1.3.0"
rich-markdown-editor@^11.0.11:
version "11.0.11"
resolved "https://registry.yarnpkg.com/rich-markdown-editor/-/rich-markdown-editor-11.0.11.tgz#7f29f0956a81618966866d4c05219910e317a7d1"
integrity sha512-2p7kETZSDCene8DqV0WgGNeSgaK3V8uRIXUK9gJAORl6zaieuY0TQu3GKIYkblxxeJYeMGp/kQeDJRrBYnRDBg==
rich-markdown-editor@^11.0.7:
version "11.0.7"
resolved "https://registry.yarnpkg.com/rich-markdown-editor/-/rich-markdown-editor-11.0.7.tgz#0788d5517325f4d6322860735ce104d48b4388f3"
integrity sha512-w4EFqjikopkx3ynyJl1pZLBY2f9A+idIpTPhlJuE4/kn9JMQWEKdYaxucKOmpHaSRmwCMt9ZkbadJxbgMJtPIg==
dependencies:
copy-to-clipboard "^3.0.8"
lodash "^4.17.11"
@@ -11462,11 +11387,6 @@ supports-hyperlinks@^2.0.0:
has-flag "^4.0.0"
supports-color "^7.0.0"
symbol-observable@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"