Compare commits

...

71 Commits

Author SHA1 Message Date
Tom Moor 929bbc8af5 chore: Investigating impact of increasing browserslist coverage 2020-12-21 21:20:55 -08:00
Tom Moor ea57cef89c fix: Reduce double reporting of errors 2020-12-21 21:10:25 -08:00
Translate-O-Tron 7d44e1aeeb New Crowdin updates (#1725)
* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Russian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]
2020-12-21 19:28:41 -08:00
Tom Moor 25d5ad8a7e chore: Enable automatic generation of email server in non production environments (#1731) 2020-12-21 19:27:14 -08:00
dependabot[bot] e34ba1457e chore(deps): bump node-notifier from 8.0.0 to 8.0.1 (#1734)
Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 8.0.0 to 8.0.1.
- [Release notes](https://github.com/mikaelbr/node-notifier/releases)
- [Changelog](https://github.com/mikaelbr/node-notifier/blob/v8.0.1/CHANGELOG.md)
- [Commits](https://github.com/mikaelbr/node-notifier/compare/v8.0.0...v8.0.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-21 19:26:12 -08:00
Tom Moor e966eb8c9a fix: Error notice not displayed to user when exceeding rate limit on signin attempt 2020-12-20 13:05:16 -08:00
Tom Moor 4684b3a3f3 fix: Server error when invalid JSON passed to API endpoint
Fix is to ensure that the errorHandling middleware is mounted before the body parser so that it can catch and return an error response
2020-12-20 12:08:47 -08:00
Tom Moor 47ce8afcc5 fix: Server Error when requesting invalid locale 2020-12-20 11:53:09 -08:00
Tom Moor decbe4f643 fix: Allow deleting attachments not linked to documents when owned by user
closes #1729
2020-12-20 11:39:09 -08:00
Tom Moor 117d278d16 fix: Deprecated Buffer usage, closes #1726 2020-12-19 15:58:21 -08:00
Tom Moor 40ca73e684 feat: Collapsible sidebar (#1721)
* wip

* styling, add keyboard shortcut

* tweak styling
2020-12-17 22:26:04 -08:00
Nan Yu 051ecab0fc feat: Moving documents via drag and drop in sidebar (#1717)
* wip: added some basic drag and drop UI for combining items

* refactor: pathToDocument to accept only id

* fix: Multiple drop backends error
fix: Incorrect styling dragging over active collection
fix: Stay in disabled state until save is complete

* Improving display while moving doc

* fix: update by user should be changed when moving a doc

* add move guard to drag

Co-authored-by: Tom Moor <tom.moor@gmail.com>
2020-12-15 19:07:29 -08:00
Tom Moor 3469b82beb feat: Add Korean as available language choice 2020-12-15 08:11:50 -08:00
Tom Moor f2c3481670 test 2020-12-14 23:04:39 -08:00
Tom Moor bc141dc40c New Crowdin updates (#1718)
* fix: New French translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Russian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Spanish translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Japanese translations from Crowdin [ci skip]

* fix: New Portuguese translations from Crowdin [ci skip]

* fix: New Russian translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New Korean translations from Crowdin [ci skip]
2020-12-14 22:28:47 -08:00
Translate-O-Tron 99814f6e2f fix: New Korean translations from Crowdin [ci skip] 2020-12-14 22:19:57 -08:00
Translate-O-Tron 3737f0b42c fix: New Portuguese translations from Crowdin [ci skip] 2020-12-14 22:19:53 -08:00
Translate-O-Tron 9ef27cb436 fix: New German translations from Crowdin [ci skip] 2020-12-14 22:19:50 -08:00
Translate-O-Tron c9fa3f93f2 fix: New Spanish translations from Crowdin [ci skip] 2020-12-14 22:19:48 -08:00
Translate-O-Tron 24ed96c9a5 fix: New French translations from Crowdin [ci skip] 2020-12-14 22:19:46 -08:00
Translate-O-Tron 956cf401bd fix: New Korean translations from Crowdin [ci skip] 2020-12-14 21:17:46 -08:00
Translate-O-Tron 7cb837f478 fix: New Portuguese, Brazilian translations from Crowdin [ci skip] 2020-12-14 21:17:44 -08:00
Translate-O-Tron a3209e9d23 fix: New Chinese Simplified translations from Crowdin [ci skip] 2020-12-14 21:17:43 -08:00
Translate-O-Tron 29582a1bb1 fix: New Russian translations from Crowdin [ci skip] 2020-12-14 21:17:41 -08:00
Translate-O-Tron 4084c91769 fix: New Portuguese translations from Crowdin [ci skip] 2020-12-14 21:17:39 -08:00
Translate-O-Tron 6772f28226 fix: New Japanese translations from Crowdin [ci skip] 2020-12-14 21:17:37 -08:00
Translate-O-Tron c6b110d339 fix: New German translations from Crowdin [ci skip] 2020-12-14 21:17:35 -08:00
Translate-O-Tron 0a43b50c66 fix: New Spanish translations from Crowdin [ci skip] 2020-12-14 21:17:33 -08:00
Translate-O-Tron 4a82cb0658 fix: New French translations from Crowdin [ci skip] 2020-12-14 21:17:31 -08:00
Tom Moor 2f7fca6106 chore: Move formatting out of translation strings 2020-12-14 21:16:02 -08:00
Translate-O-Tron 8f83cfef25 fix: New Korean translations from Crowdin [ci skip] 2020-12-14 20:39:04 -08:00
Tom Moor e2e66954b5 fix: Attachments should not always be deleted with their original document (#1715)
* fix: Attachments should not be deleted when their original document is deleted when referenced elsewhere

* fix: Attachments deleted prematurely when docs are placed in trash

* mock

* restore hook, cascading delete was the issue
2020-12-14 19:55:22 -08:00
Tom Moor 3dbe54ac1e fix: Bump RME, closes #1719 2020-12-14 19:18:46 -08:00
Translate-O-Tron 50577f6f2f fix: New Korean translations from Crowdin [ci skip] 2020-12-14 09:40:18 -08:00
Translate-O-Tron 16d504703d fix: New Korean translations from Crowdin [ci skip] 2020-12-14 08:42:26 -08:00
Translate-O-Tron 173febcaa1 fix: New Korean translations from Crowdin [ci skip] 2020-12-14 07:40:07 -08:00
Translate-O-Tron f92f4cde7a fix: New Korean translations from Crowdin [ci skip] 2020-12-14 06:45:01 -08:00
Translate-O-Tron 23bec75bd0 fix: New Korean translations from Crowdin [ci skip] 2020-12-14 05:49:49 -08:00
Translate-O-Tron 4dd667f68b fix: New Korean translations from Crowdin [ci skip] 2020-12-14 04:47:25 -08:00
Translate-O-Tron 4b3cb77cc7 fix: New Korean translations from Crowdin [ci skip] 2020-12-14 03:48:01 -08:00
Translate-O-Tron 0e83d54f93 fix: New German translations from Crowdin [ci skip] 2020-12-13 23:30:53 -08:00
Translate-O-Tron d867d9fea5 fix: New Spanish translations from Crowdin [ci skip] 2020-12-13 23:30:51 -08:00
Translate-O-Tron 28c8b8acfe fix: New French translations from Crowdin [ci skip] 2020-12-13 23:30:49 -08:00
Translate-O-Tron 51efffe2ce fix: New Korean translations from Crowdin [ci skip] 2020-12-13 22:34:18 -08:00
Tom Moor 4e9ee7249f Update LICENSE 2020-12-13 17:48:15 -08:00
Tom Moor 574fcc4bb3 0.51.0 2020-12-13 17:43:58 -08:00
Tom Moor 5c3000d5cf Bump RME, fixes table after list and image captions in Safari 2020-12-13 17:20:38 -08:00
Translate-O-Tron c0216cbb8d fix: New Portuguese, Brazilian translations from Crowdin [ci skip] 2020-12-12 22:40:33 -08:00
Translate-O-Tron cf12301077 fix: New Chinese Simplified translations from Crowdin [ci skip] 2020-12-12 22:40:31 -08:00
Translate-O-Tron 1eb7da8742 fix: New Russian translations from Crowdin [ci skip] 2020-12-12 22:40:29 -08:00
Translate-O-Tron b3c548382f fix: New Portuguese translations from Crowdin [ci skip] 2020-12-12 22:40:27 -08:00
Translate-O-Tron 7ebac53b43 fix: New Japanese translations from Crowdin [ci skip] 2020-12-12 22:40:25 -08:00
Translate-O-Tron 64428a6894 fix: New German translations from Crowdin [ci skip] 2020-12-12 22:40:23 -08:00
Translate-O-Tron d536af5269 fix: New Spanish translations from Crowdin [ci skip] 2020-12-12 22:40:22 -08:00
Translate-O-Tron 1726a88a60 fix: New French translations from Crowdin [ci skip] 2020-12-12 22:40:20 -08:00
Tom Moor 3fe807a10a fix: Object printed in UI 2020-12-12 22:29:20 -08:00
Tom Moor 72189e041b feat: attachments.delete (#1714)
* feat: Add endpoint for manually deleting attachments

* mock
2020-12-10 21:40:03 -08:00
Translate-O-Tron bc156f4cc8 New Crowdin updates (#1707)
* fix: New German translations from Crowdin [ci skip]

* fix: New German translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Chinese Simplified translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]

* fix: New French translations from Crowdin [ci skip]

* fix: New Portuguese, Brazilian translations from Crowdin [ci skip]
2020-12-10 19:03:01 -08:00
dependabot[bot] 26693c60df chore(deps): bump ini from 1.3.5 to 1.3.7 (#1713)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-10 18:43:50 -08:00
Nan Yu 9e1f31e14c fix: dropzone error on image upload component (#1711) 2020-12-08 19:32:41 -08:00
Nan Yu 63d926e196 slightly nicer color definitions (#1705) 2020-12-07 08:56:07 -08:00
Reid Beels 3f9f1f0bed docs: Add note to .env.sample about Google OAuth URI (#1706) 2020-12-07 08:55:37 -08:00
Tom Moor b2bdc7f1d4 chore: Add user and auth context to server side error reports (#1693) 2020-12-06 17:59:44 -08:00
Translate-O-Tron 2e798c698d chore: New Crowdin updates (#1691) 2020-12-06 17:54:16 -08:00
Nan Yu aa59f5fe09 chore: React-Dropzone version bump (#1699)
* update dropzone to new version

* remove global styles import

* change bg on active item on drag as well

* add back background
2020-12-06 17:50:59 -08:00
Tom Moor ac2060b166 fix: Migrate attachment columns to incease available length (#1704)
closes #1703
2020-12-06 16:51:25 -08:00
Tom Moor 424c29536d chore: Bump RME (SQL language support) 2020-12-04 10:18:30 -08:00
Tom Moor 6c1ecde4e7 fix: Server error when attempting to update team with identical details to previous 2020-12-04 10:18:30 -08:00
Tom Moor aa6fc45097 Add localization status to README 2020-12-04 08:22:43 -08:00
Tom Moor 9478944718 fix: Account for non-recorded views, closes #1700 2020-12-02 20:50:54 -08:00
Tom Moor 9e1c5d1db3 fix: JS error in UserProfile introduced in refactoring to functional component 2020-12-02 20:48:24 -08:00
82 changed files with 2588 additions and 1248 deletions
+6 -1
View File
@@ -18,12 +18,17 @@ PORT=3000
FORCE_HTTPS=true
ENABLE_UPDATES=true
DEBUG=cache,presenters,events
DEBUG=cache,presenters,events,emails,mailer,utils,multiplayer,server,services
# Third party signin credentials (at least one is required)
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.50.0
Licensed Work: Outline 0.51.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-11-14
Change Date: 2023-12-13
Change License: Apache License, Version 2.0
+1
View File
@@ -12,6 +12,7 @@
<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).slice(0, -1)
? collection.pathToDocument(document.id).slice(0, -1)
: [];
if (onlyText === true) {
+32 -32
View File
@@ -5,7 +5,7 @@ import { observer, inject } from "mobx-react";
import * as React from "react";
import Dropzone from "react-dropzone";
import { withRouter, type RouterHistory, type Match } from "react-router-dom";
import { createGlobalStyle } from "styled-components";
import styled, { css } from "styled-components";
import DocumentsStore from "stores/DocumentsStore";
import UiStore from "stores/UiStore";
import LoadingIndicator from "components/LoadingIndicator";
@@ -17,8 +17,6 @@ type Props = {
children: React.Node,
collectionId: string,
documentId?: string,
activeClassName?: string,
rejectClassName?: string,
ui: UiStore,
documents: DocumentsStore,
disabled: boolean,
@@ -28,18 +26,6 @@ type Props = {
staticContext: Object,
};
export const GlobalStyles = createGlobalStyle`
.activeDropZone {
border-radius: 4px;
background: ${(props) => props.theme.slateDark};
svg { fill: ${(props) => props.theme.white}; }
}
.activeDropZone a {
color: ${(props) => props.theme.white} !important;
}
`;
@observer
class DropToImport extends React.Component<Props> {
@observable isImporting: boolean = false;
@@ -82,18 +68,7 @@ class DropToImport extends React.Component<Props> {
};
render() {
const {
documentId,
collectionId,
documents,
disabled,
location,
match,
history,
staticContext,
ui,
...rest
} = this.props;
const { documents } = this.props;
if (this.props.disabled) return this.props.children;
@@ -102,16 +77,41 @@ class DropToImport extends React.Component<Props> {
accept={documents.importFileTypes.join(", ")}
onDropAccepted={this.onDropAccepted}
style={EMPTY_OBJECT}
disableClick
disablePreview
noClick
multiple
{...rest}
>
{this.isImporting && <LoadingIndicator />}
{this.props.children}
{({
getRootProps,
getInputProps,
isDragActive,
isDragAccept,
isDragReject,
}) => (
<DropzoneContainer {...getRootProps()} {...{ isDragActive }}>
<input {...getInputProps()} />
{this.isImporting && <LoadingIndicator />}
{this.props.children}
</DropzoneContainer>
)}
</Dropzone>
);
}
}
const DropzoneContainer = styled("div")`
border-radius: 4px;
${({ isDragActive, theme }) =>
isDragActive &&
css`
background: ${theme.slateDark};
a {
color: ${theme.white} !important;
}
svg {
fill: ${theme.white};
}
`}
`;
export default inject("documents", "ui")(withRouter(DropToImport));
+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
+14 -4
View File
@@ -15,7 +15,6 @@ import ErrorSuspended from "scenes/ErrorSuspended";
import KeyboardShortcuts from "scenes/KeyboardShortcuts";
import Analytics from "components/Analytics";
import DocumentHistory from "components/DocumentHistory";
import { GlobalStyles } from "components/DropToImport";
import Flex from "components/Flex";
import { LoadingIndicatorBar } from "components/LoadingIndicator";
@@ -66,6 +65,11 @@ 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;
@@ -120,7 +124,11 @@ class Layout extends React.Component<Props> {
</Switch>
)}
<Content auto justify="center" editMode={ui.editMode}>
<Content
auto
justify="center"
sidebarCollapsed={ui.editMode || ui.sidebarCollapsed}
>
{this.props.children}
</Content>
@@ -138,7 +146,6 @@ class Layout extends React.Component<Props> {
>
<KeyboardShortcuts />
</Modal>
<GlobalStyles />
</Container>
);
}
@@ -161,7 +168,10 @@ const Content = styled(Flex)`
}
${breakpoint("tablet")`
margin-left: ${(props) => (props.editMode ? 0 : props.theme.sidebarWidth)};
margin-left: ${(props) =>
props.sidebarCollapsed
? props.theme.sidebarCollapsedWidth
: props.theme.sidebarWidth};
`};
`;
+31 -3
View File
@@ -8,6 +8,7 @@ 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";
@@ -30,10 +31,14 @@ 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}
@@ -63,7 +68,7 @@ const Container = styled(Flex)`
bottom: 0;
width: 100%;
background: ${(props) => props.theme.sidebarBackground};
transition: left 100ms ease-out,
transition: box-shadow, 100ms, ease-in-out, left 100ms ease-out,
${(props) => props.theme.backgroundTransition};
margin-left: ${(props) => (props.mobileSidebarVisible ? 0 : "-100%")};
z-index: ${(props) => props.theme.depths.sidebar};
@@ -90,10 +95,33 @@ const Container = styled(Flex)`
}
${breakpoint("tablet")`
left: ${(props) => (props.editMode ? `-${props.theme.sidebarWidth}` : 0)};
left: ${(props) =>
props.collapsed
? `calc(-${props.theme.sidebarWidth} + ${props.theme.sidebarCollapsedWidth})`
: 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;
}
`};
`;
@@ -0,0 +1,59 @@
// @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,6 +10,7 @@ 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 = {|
@@ -20,32 +21,45 @@ type Props = {|
prefetchDocument: (id: string) => Promise<void>,
|};
@observer
class CollectionLink extends React.Component<Props> {
@observable menuOpen = false;
function CollectionLink({
collection,
activeDocument,
prefetchDocument,
canUpdate,
ui,
}: Props) {
const [menuOpen, setMenuOpen] = React.useState(false);
handleTitleChange = async (name: string) => {
await this.props.collection.save({ name });
};
const handleTitleChange = React.useCallback(
async (name: string) => {
await collection.save({ name });
},
[collection]
);
render() {
const {
collection,
activeDocument,
prefetchDocument,
canUpdate,
ui,
} = this.props;
const { documents, policies } = useStores();
const expanded = collection.id === ui.activeCollectionId;
const expanded = collection.id === ui.activeCollectionId;
// 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(),
}),
});
return (
<>
<DropToImport
key={collection.id}
collectionId={collection.id}
activeClassName="activeDropZone"
>
return (
<>
<div ref={drop}>
<DropToImport key={collection.id} collectionId={collection.id}>
<SidebarLink
key={collection.id}
to={collection.url}
@@ -54,11 +68,12 @@ class CollectionLink extends React.Component<Props> {
}
iconColor={collection.color}
expanded={expanded}
menuOpen={this.menuOpen}
menuOpen={menuOpen}
isActiveDrop={isOver && canDrop}
label={
<EditableTitle
title={collection.name}
onSubmit={this.handleTitleChange}
onSubmit={handleTitleChange}
canUpdate={canUpdate}
/>
}
@@ -67,28 +82,28 @@ class CollectionLink extends React.Component<Props> {
<CollectionMenu
position="right"
collection={collection}
onOpen={() => (this.menuOpen = true)}
onClose={() => (this.menuOpen = false)}
onOpen={() => setMenuOpen(true)}
onClose={() => setMenuOpen(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 CollectionLink;
export default observer(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,6 +2,7 @@
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";
@@ -33,7 +34,7 @@ function DocumentLink({
depth,
canUpdate,
}: Props) {
const { documents } = useStores();
const { documents, policies } = useStores();
const { t } = useTranslation();
const isActiveDocument = activeDocument && activeDocument.id === node.id;
@@ -48,13 +49,19 @@ 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)
.pathToDocument(activeDocument.id)
.map((entry) => entry.id)
.includes(node.id) ||
isActiveDocument)
@@ -100,51 +107,88 @@ 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 (
<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>
<>
<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>
{expanded && (
{expanded && !isDragging && (
<>
{node.children.map((childNode) => (
<ObservedDocumentLink
@@ -159,10 +203,15 @@ 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: 16px 24px;
padding: 20px 24px;
position: relative;
background: none;
line-height: inherit;
@@ -17,6 +17,7 @@ type Props = {
menuOpen?: boolean,
iconColor?: string,
active?: boolean,
isActiveDrop?: boolean,
theme: Theme,
exact?: boolean,
depth?: number,
@@ -30,6 +31,7 @@ function SidebarLink({
to,
label,
active,
isActiveDrop,
menu,
menuOpen,
theme,
@@ -47,14 +49,15 @@ function SidebarLink({
const activeStyle = {
color: theme.text,
background: theme.sidebarItemBackground,
fontWeight: 600,
background: theme.sidebarItemBackground,
...style,
};
return (
<StyledNavLink
activeStyle={activeStyle}
$isActiveDrop={isActiveDrop}
activeStyle={isActiveDrop ? undefined : activeStyle}
style={active ? activeStyle : style}
onClick={onClick}
onMouseEnter={onMouseEnter}
@@ -103,12 +106,20 @@ const StyledNavLink = styled(NavLink)`
text-overflow: ellipsis;
padding: 4px 16px;
border-radius: 4px;
color: ${(props) => props.theme.sidebarText};
background: ${(props) =>
props.$isActiveDrop ? props.theme.slateDark : "inherit"};
color: ${(props) =>
props.$isActiveDrop ? props.theme.white : props.theme.sidebarText};
font-size: 15px;
cursor: pointer;
svg {
${(props) => (props.$isActiveDrop ? `fill: ${props.theme.white};` : "")}
}
&:hover {
color: ${(props) => props.theme.text};
color: ${(props) =>
props.$isActiveDrop ? props.theme.white : props.theme.text};
}
&:focus {
+12 -9
View File
@@ -3,9 +3,10 @@ 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";
@@ -24,14 +25,16 @@ if (element) {
<ErrorBoundary>
<Provider {...stores}>
<Theme>
<Router>
<>
<ScrollToTop>
<Routes />
</ScrollToTop>
<Toasts />
</>
</Router>
<DndProvider backend={HTML5Backend}>
<Router>
<>
<ScrollToTop>
<Routes />
</ScrollToTop>
<Toasts />
</>
</Router>
</DndProvider>
</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),
},
+5 -7
View File
@@ -2,7 +2,7 @@
import { observable } from "mobx";
import { observer, inject } from "mobx-react";
import * as React from "react";
import { withTranslation, type TFunction } from "react-i18next";
import { Trans, withTranslation, type TFunction } from "react-i18next";
import { Redirect } from "react-router-dom";
import CollectionsStore from "stores/CollectionsStore";
@@ -43,6 +43,7 @@ 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}>
@@ -50,12 +51,9 @@ class NewChildDocumentMenu extends React.Component<Props> {
items={[
{
title: (
<span>
{t("New document in")}{" "}
<strong>
{collection ? collection.name : t("collection")}
</strong>
</span>
<Trans>
New document in <strong>{{ collectionName }}</strong>
</Trans>
),
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(document: Document) {
pathToDocument(documentId: string) {
let path;
const traveler = (nodes, previousPath) => {
nodes.forEach((childNode) => {
const newPath = [...previousPath, childNode];
if (childNode.id === document.id) {
if (childNode.id === documentId) {
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) {
if (this.isDeleted || !this.publishedAt) {
return;
}
@@ -268,7 +268,7 @@ export default class Document extends BaseModel {
};
move = (collectionId: string, parentDocumentId: ?string) => {
return this.store.move(this, collectionId, parentDocumentId);
return this.store.move(this.id, 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 { useTranslation } from "react-i18next";
import { Trans, useTranslation } from "react-i18next";
import styled from "styled-components";
import Membership from "models/Membership";
import User from "models/User";
@@ -46,11 +46,9 @@ const MemberListItem = ({
subtitle={
<>
{user.lastActiveAt ? (
<>
{t("Active {{ lastActiveAt }} ago", {
lastActiveAt: <Time dateTime={user.lastActiveAt} />,
})}
</>
<Trans>
Active <Time dateTime={user.lastActiveAt} /> ago
</Trans>
) : (
t("Never signed in")
)}
@@ -1,7 +1,7 @@
// @flow
import { PlusIcon } from "outline-icons";
import * as React from "react";
import { useTranslation } from "react-i18next";
import { Trans, useTranslation } from "react-i18next";
import User from "models/User";
import Avatar from "components/Avatar";
import Badge from "components/Badge";
@@ -25,11 +25,9 @@ const UserListItem = ({ user, onAdd, canEdit }: Props) => {
subtitle={
<>
{user.lastActiveAt ? (
<>
{t("Active {{ lastActiveAt }} ago", {
lastActiveAt: <Time dateTime={user.lastActiveAt} />,
})}
</>
<Trans>
Active <Time dateTime={user.lastActiveAt} /> ago
</Trans>
) : (
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,8 +16,9 @@ class MarkAsViewed extends React.Component<Props> {
const { document } = this.props;
this.viewTimeout = setTimeout(async () => {
if (document.publishedAt) {
const view = await document.view();
const view = await document.view();
if (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;
file: File;
@observable file: File;
avatarEditorRef: AvatarEditor;
static defaultProps = {
@@ -128,7 +128,12 @@ class ImageUpload extends React.Component<Props> {
style={EMPTY_OBJECT}
disablePreview
>
{this.props.children}
{({ getRootProps, getInputProps, isDragActive }) => (
<div {...getRootProps()} {...{ isDragActive }}>
<input {...getInputProps()} />
{this.props.children}
</div>
)}
</Dropzone>
);
}
-1
View File
@@ -28,7 +28,6 @@ class UserDelete extends React.Component<Props> {
this.props.auth.logout();
} catch (error) {
this.props.ui.showToast(error.message);
throw error;
} finally {
this.isDeleting = false;
}
+10 -9
View File
@@ -1,14 +1,12 @@
// @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now";
import { inject, observer } from "mobx-react";
import { 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";
@@ -18,20 +16,23 @@ 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 { user, auth, documents, ...rest } = props;
const { documents } = useStores();
const currentUser = useCurrentUser();
const { user, ...rest } = props;
if (!user) return null;
const isCurrentUser = auth.user && auth.user.id === user.id;
const isCurrentUser = currentUser.id === user.id;
return (
<Modal
@@ -60,7 +61,7 @@ function UserProfile(props: Props) {
{isCurrentUser && (
<Edit>
<Button
onClick={() => this.props.history.push(settings())}
onClick={() => props.history.push(settings())}
icon={<EditIcon />}
neutral
>
@@ -103,4 +104,4 @@ const Meta = styled(HelpText)`
margin-top: -12px;
`;
export default inject("documents", "auth")(withRouter(observer(UserProfile)));
export default withRouter(observer(UserProfile));
+17 -10
View File
@@ -19,6 +19,7 @@ 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",
@@ -450,20 +451,26 @@ export default class DocumentsStore extends BaseStore<Document> {
@action
move = async (
document: Document,
documentId: string,
collectionId: string,
parentDocumentId: ?string
) => {
const res = await client.post("/documents.move", {
id: document.id,
collectionId,
parentDocumentId,
});
invariant(res && res.data, "Data not available");
this.movingDocumentId = documentId;
res.data.documents.forEach(this.add);
res.data.collections.forEach(this.rootStore.collections.add);
this.addPolicies(res.policies);
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;
}
};
@action
+18
View File
@@ -23,6 +23,7 @@ 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() {
@@ -51,6 +52,7 @@ class UiStore {
// persisted keys
this.languagePromptDismissed = data.languagePromptDismissed;
this.sidebarCollapsed = data.sidebarCollapsed;
this.tocVisible = data.tocVisible;
this.theme = data.theme || "system";
@@ -107,6 +109,21 @@ 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;
@@ -190,6 +207,7 @@ class UiStore {
get asJson(): string {
return JSON.stringify({
tocVisible: this.tocVisible,
sidebarCollapsed: this.sidebarCollapsed,
languagePromptDismissed: this.languagePromptDismissed,
theme: this.theme,
});
+10
View File
@@ -5,10 +5,12 @@ import stores from "stores";
import download from "./download";
import {
AuthorizationError,
BadRequestError,
NetworkError,
NotFoundError,
OfflineError,
RequestError,
ServiceUnavailableError,
UpdateRequiredError,
} from "./errors";
@@ -141,6 +143,10 @@ class ApiClient {
throw new UpdateRequiredError(error.message);
}
if (response.status === 400) {
throw new BadRequestError(error.message);
}
if (response.status === 403) {
throw new AuthorizationError(error.message);
}
@@ -149,6 +155,10 @@ class ApiClient {
throw new NotFoundError(error.message);
}
if (response.status === 503) {
throw new ServiceUnavailableError(error.message);
}
throw new RequestError(error.message);
};
+2
View File
@@ -2,8 +2,10 @@
import ExtendableError from "es6-error";
export class AuthorizationError extends ExtendableError {}
export class BadRequestError extends ExtendableError {}
export class NetworkError extends ExtendableError {}
export class NotFoundError extends ExtendableError {}
export class OfflineError extends ExtendableError {}
export class ServiceUnavailableError extends ExtendableError {}
export class RequestError extends ExtendableError {}
export class UpdateRequiredError extends ExtendableError {}
-56
View File
@@ -1,56 +0,0 @@
// 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;
}
+6 -4
View File
@@ -56,7 +56,7 @@
"type": "git",
"url": "git+ssh://git@github.com/outline/outline.git"
},
"browserslist": "> 0.25%, not dead",
"browserslist": "> 0.2%, not dead",
"dependencies": {
"@babel/core": "^7.11.1",
"@babel/plugin-proposal-decorators": "^7.10.5",
@@ -137,8 +137,10 @@
"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": "4.2.1",
"react-dropzone": "^11.2.4",
"react-helmet": "^5.2.0",
"react-i18next": "^11.7.3",
"react-keydown": "^1.7.3",
@@ -148,7 +150,7 @@
"react-virtualized-auto-sizer": "^1.0.2",
"react-waypoint": "^9.0.2",
"react-window": "^1.8.6",
"rich-markdown-editor": "^11.0.7",
"rich-markdown-editor": "^11.0.11",
"semver": "^7.3.2",
"sequelize": "^6.3.4",
"sequelize-cli": "^6.2.0",
@@ -204,5 +206,5 @@
"dot-prop": "^5.2.0",
"js-yaml": "^3.13.1"
},
"version": "0.50.0"
"version": "0.51.0"
}
+32
View File
@@ -92,6 +92,38 @@ 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,6 +1,7 @@
/* eslint-disable flowtype/require-valid-file-annotation */
import TestServer from "fetch-test-server";
import app from "../app";
import { Attachment } from "../models";
import {
buildUser,
buildCollection,
@@ -11,9 +12,127 @@ 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());
+12 -10
View File
@@ -37,17 +37,19 @@ router.post("team.update", auth(), async (ctx) => {
await team.save();
for (const change of changes) {
data[change] = team[change];
}
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,
});
await Event.create({
name: "teams.update",
actorId: user.id,
teamId: user.teamId,
data,
ip: ctx.request.ip,
});
}
ctx.body = {
data: presentTeam(team),
+11
View File
@@ -21,6 +21,17 @@ 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", {
+54 -18
View File
@@ -4,44 +4,80 @@ import debug from "debug";
import Router from "koa-router";
import { AuthenticationError } from "../errors";
import { Document, Attachment } from "../models";
import { Op } from "../sequelize";
import { Op, sequelize } from "../sequelize";
import parseAttachmentIds from "../utils/parseAttachmentIds";
const router = new Router();
const log = debug("utils");
router.post("utils.gc", async (ctx) => {
const { token } = ctx.body;
const { token, limit = 500 } = ctx.body;
if (process.env.UTILS_SECRET !== token) {
throw new AuthenticationError("Invalid secret token");
}
log("Permanently deleting documents older than 30 days…");
const where = {
deletedAt: {
[Op.lt]: subDays(new Date(), 30),
},
};
log(`Permanently destroying upto ${limit} documents older than 30 days…`);
const documents = await Document.scope("withUnpublished").findAll({
attributes: ["id"],
where,
});
const documentIds = documents.map((d) => d.id);
await Attachment.destroy({
attributes: ["id", "teamId", "text"],
where: {
documentId: documentIds,
deletedAt: {
[Op.lt]: subDays(new Date(), 30),
},
},
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,
where: {
id: documents.map((document) => document.id),
},
force: true,
});
log(`Deleted ${documentIds.length} documents`);
log(`Destroyed ${documents.length} documents`);
ctx.body = {
success: true,
+105 -33
View File
@@ -2,69 +2,141 @@
import subDays from "date-fns/sub_days";
import TestServer from "fetch-test-server";
import app from "../app";
import { Document } from "../models";
import { sequelize } from "../sequelize";
import { buildDocument } from "../test/factories";
import { Attachment, Document } from "../models";
import { buildAttachment, 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 () => {
const document = await buildDocument({
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,
},
});
const reloaded = await Document.scope().findOne({
where: {
id: document.id,
},
paranoid: false,
});
expect(res.status).toEqual(200);
expect(reloaded).toBe(null);
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,
},
});
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);
});
it("should destroy draft documents deleted more than 30 days ago", async () => {
const document = await buildDocument({
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(reloaded).toBe(null);
expect(await Document.scope().count()).toEqual(0);
});
it("should require authentication", async () => {
+12
View File
@@ -119,6 +119,18 @@ 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);
});
+5 -1
View File
@@ -45,7 +45,11 @@ router.post("email", async (ctx) => {
user.lastSigninEmailSentAt &&
user.lastSigninEmailSentAt > subMinutes(new Date(), 2)
) {
ctx.redirect(`${team.url}?notice=email-auth-ratelimit`);
ctx.body = {
redirect: `${team.url}?notice=email-auth-ratelimit`,
message: "Rate limit exceeded",
success: false,
};
return;
}
+4
View File
@@ -28,6 +28,8 @@ 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);
@@ -54,6 +56,8 @@ 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 })
+29 -1
View File
@@ -26,6 +26,8 @@ import { baseStyles } from "./emails/components/EmailLayout";
import { createQueue } from "./utils/queue";
const log = debug("emails");
const useTestEmailService =
process.env.NODE_ENV !== "production" && !process.env.SMTP_USERNAME;
type Emails = "welcome" | "export";
@@ -73,7 +75,7 @@ export class Mailer {
try {
log(`Sending email "${data.title}" to ${data.to}`);
await transporter.sendMail({
const info = await transporter.sendMail({
from: process.env.SMTP_FROM_EMAIL,
replyTo: process.env.SMTP_REPLY_EMAIL || process.env.SMTP_FROM_EMAIL,
to: data.to,
@@ -82,6 +84,10 @@ export class Mailer {
text: data.text,
attachments: data.attachments,
});
if (useTestEmailService) {
log("Email Preview URL: %s", nodemailer.getTestMessageUrl(info));
}
} catch (err) {
if (process.env.SENTRY_DSN) {
Sentry.captureException(err);
@@ -159,6 +165,10 @@ export class Mailer {
};
constructor() {
this.loadTransport();
}
async loadTransport() {
if (process.env.SMTP_HOST) {
let smtpConfig = {
host: process.env.SMTP_HOST,
@@ -174,6 +184,24 @@ export class Mailer {
};
}
this.transporter = nodemailer.createTransport(smtpConfig);
return;
}
if (useTestEmailService) {
log("SMTP_USERNAME not provided, generating test account…");
let testAccount = await nodemailer.createTestAccount();
const smtpConfig = {
host: "smtp.ethereal.email",
port: 587,
secure: false,
auth: {
user: testAccount.user,
pass: testAccount.pass,
},
};
this.transporter = nodemailer.createTransport(smtpConfig);
}
}
@@ -0,0 +1,29 @@
'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, }
);
}
};
@@ -0,0 +1,37 @@
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
@@ -0,0 +1,14 @@
// @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;
});
+3 -2
View File
@@ -1,7 +1,8 @@
// @flow
import { Team, User, Collection, Document, Group } from "../models";
import { Attachment, Team, User, Collection, Document, Group } from "../models";
import policy from "./policy";
import "./apiKey";
import "./attachment";
import "./collection";
import "./document";
import "./integration";
@@ -24,7 +25,7 @@ type Policy = {
*/
export function serialize(
model: User,
target: Team | Collection | Document | Group
target: Attachment | Team | Collection | Document | Group
): Policy {
let output = {};
+3 -6
View File
@@ -1,6 +1,7 @@
// @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";
@@ -8,13 +9,9 @@ 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) {
const attachmentIds = [...text.matchAll(attachmentRegex)].map(
(match) => match.groups && match.groups.id
);
async function replaceImageAttachments(text: string) {
const attachmentIds = parseAttachmentIds(text);
for (const id of attachmentIds) {
const attachment = await Attachment.findByPk(id);
+2 -2
View File
@@ -8,7 +8,6 @@ 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";
@@ -78,7 +77,8 @@ router.get("/locales/:lng.json", async (ctx) => {
let { lng } = ctx.params;
if (!languages.includes(lng)) {
throw new NotFoundError();
ctx.status = 404;
return;
}
if (process.env.NODE_ENV === "production") {
+2
View File
@@ -54,9 +54,11 @@
ignoreErrors: [
"ResizeObserver loop limit exceeded",
"AuthorizationError",
"BadRequestError",
"NetworkError",
"NotFoundError",
"OfflineError",
"ServiceUnavailableError",
"UpdateRequiredError",
"ChunkLoadError",
],
+8
View File
@@ -0,0 +1,8 @@
// @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 new Buffer(JSON.stringify(policy)).toString("base64");
return Buffer.from(JSON.stringify(policy)).toString("base64");
};
export const getSignature = (policy: any) => {
+1
View File
@@ -36,6 +36,7 @@ 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");
});
});
+51 -40
View File
@@ -7,6 +7,16 @@
"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",
@@ -33,7 +43,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",
@@ -46,17 +56,17 @@
"Link": "Link",
"Link copied to clipboard": "Link in die Zwischenablage kopiert",
"Highlight": "Hervorheben",
"Type '/' to insert": "Geben Sie '/' zum Einzufügen ein",
"Keep typing to filter": "Tippen Sie weiter um zu filtern",
"Type '/' to insert": "Geben Sie '/' zum einfügen",
"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 fügen Sie ein Link ein",
"Strikethrough": "Durchstreichen",
"Bold": "Fett",
"Subheading": "Untertitel",
@@ -65,13 +75,19 @@
"Tip notice": "Tipp Hinweis",
"Warning": "Warnung",
"Warning notice": "Warnhinweis",
"Search…": "Suche…",
"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",
"Keyboard shortcuts": "Tastaturkürzel",
"New collection…": "Neue Sammlung…",
"Expand": "Ausklappen",
"Collapse": "Zusammenklappen",
"New collection": "Neue Sammlung",
"Collections": "Sammlungen",
"Untitled": "Ohne Titel",
"Home": "Startseite",
"Search": "Suche",
"Starred": "Favoriten",
"Invite people…": "Personen einladen…",
"Invite people": "Personen einladen",
@@ -92,8 +108,8 @@
"API documentation": "API Dokumentation",
"Changelog": "Änderungsprotokoll",
"Send us feedback": "Schicken Sie uns Feedback",
"Report a bug": "Ein technischen Fehler melden",
"Appearance": "Aussehen",
"Report a bug": "Ein technischer Fehler melden",
"Appearance": "Darstellung",
"System": "System",
"Light": "Hell",
"Dark": "Dunkel",
@@ -101,10 +117,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",
@@ -113,33 +129,30 @@
"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",
"Edit": "Bearbeiten",
"Create template": "Vorlage erstellen",
"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",
"New document in": "Neues Dokument in",
"Members": "Mitglieder",
"collection": "Sammlung",
"New template…": "Neue Vorlage…",
"New document in <1>{{collectionName}}</1>": "Neues Dokument in <1>{{collectionName}}</1>",
"New template": "Neue Vorlage",
"Link copied": "Link wurde kopiert",
"Restore version": "Version wiederherstellen",
"Copy link": "Link kopieren",
@@ -147,22 +160,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",
@@ -173,15 +186,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",
@@ -189,22 +202,21 @@
"{{ 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 {{ lastActiveAt }} ago": "Aktiv vor {{ lastActiveAt }}",
"Active <1></1> ago": "Aktiv vor <1></1>",
"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": "Wird erstellt",
"Creating": "Wird erstellt",
"Create": "Erstellen",
"Recently viewed": "Vor Kurzem angesehen",
"Recently viewed": "Zuletzt angesehen",
"Created by me": "Von mir erstellt",
"Hide contents": "Inhalt ausblenden",
"Show contents": "Inhalt anzeigen",
@@ -217,7 +229,7 @@
"New from template": "Neu aus Vorlage",
"Publish": "Veröffentlichen",
"Publish document": "Dokument veröffentlichen",
"Publishing": "Am Veröffentlichen…",
"Publishing": "Wird publiziert",
"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",
@@ -225,13 +237,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 Teamadministrator (<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 Administrator (<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",
@@ -274,7 +286,6 @@
"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.",
+31 -34
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,17 +76,18 @@
"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",
"New collection…": "New collection…",
"Expand": "Expand",
"Collapse": "Collapse",
"New collection": "New collection",
"Collections": "Collections",
"Untitled": "Untitled",
"Home": "Home",
"Search": "Search",
"Starred": "Starred",
"Invite people…": "Invite people…",
"Invite people": "Invite people",
@@ -116,10 +117,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",
@@ -128,33 +129,30 @@
"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",
"Edit": "Edit",
"Create template": "Create template",
"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",
"New document in": "New document in",
"Members": "Members",
"collection": "collection",
"New template…": "New template…",
"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",
@@ -168,16 +166,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",
@@ -190,13 +188,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",
@@ -204,20 +202,19 @@
"{{ 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 {{ lastActiveAt }} ago": "Active {{ lastActiveAt }} ago",
"Active <1></1> ago": "Active <1></1> 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",
@@ -232,7 +229,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",
@@ -246,7 +243,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",
+50 -39
View File
@@ -7,6 +7,16 @@
"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",
@@ -33,7 +43,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",
@@ -46,32 +56,38 @@
"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",
"Table": "Tabla",
"Tip": "Sugerencia",
"Tip notice": "Aviso de sugerencia",
"Warning": "Advertencia",
"Warning notice": "Aviso de advertencia",
"Search…": "Buscar…",
"Warning": "Atención",
"Warning notice": "Aviso",
"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",
"Keyboard shortcuts": "Atajos del teclado",
"New collection…": "Nueva colección…",
"Expand": "Expandir",
"Collapse": "Colapso",
"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",
@@ -101,45 +117,42 @@
"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",
"Document duplicated": "Documento Duplicado",
"Document duplicated": "Documento duplicado",
"Document archived": "Documento archivado",
"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",
"Edit": "Editar",
"Create template": "Crear plantilla",
"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",
"New document in": "Nuevo documento en",
"Members": "Miembros",
"collection": "colección",
"New template…": "Nueva plantilla…",
"New document in <1>{{collectionName}}</1>": "Nuevo documento en <1>{{collectionName}}</1>",
"New template": "Nueva plantilla",
"Link copied": "Enlace copiado",
"Restore version": "Restaurar versión",
"Copy link": "Copiar enlace",
@@ -153,16 +166,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",
"Create a document": "Crear documento",
"Manage members": "Administrar miembros",
"Pinned": "Fijado",
"Recently updated": "Recientemente actualizado",
"Recently published": "Recientemente publicado",
@@ -175,13 +188,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",
@@ -189,20 +202,19 @@
"{{ 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 {{ lastActiveAt }} ago": "Activo hace {{ lastActiveAt }}",
"Active <1></1> ago": "Activo hace <1></1>",
"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í",
@@ -217,7 +229,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",
@@ -231,7 +243,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",
@@ -258,7 +270,7 @@
"Blockquote": "Bloque de cita",
"Horizontal divider": "Divisor horizontal",
"Inline code": "Código en línea",
"Not Found": "No Encontrado",
"Not Found": "No encontrado",
"We were unable to find the page youre looking for.": "No pudimos encontrar la página que buscabas.",
"Use the <1>{{meta}}+K</1> shortcut to search from anywhere in your knowledge base": "Usa el atajo <1>{{meta}}+K</1> para buscar desde cualquier lugar de tu base de conocimientos",
"No documents found for your search filters. <1></1>Create a new document?": "No se encontraron documentos para sus filtros de búsqueda. <1></1> ¿Crear un nuevo documento?",
@@ -274,7 +286,6 @@
"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.",
+45 -34
View File
@@ -7,6 +7,16 @@
"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",
@@ -33,7 +43,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",
@@ -46,17 +56,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",
@@ -65,13 +75,19 @@
"Tip notice": "Astuce",
"Warning": "Avertissement",
"Warning notice": "Avertissement",
"Search…": "Recherche…",
"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",
"Keyboard shortcuts": "Raccourcis clavier",
"New collection…": "Nouvelle collection…",
"Expand": "Expand",
"Collapse": "Collapse",
"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",
@@ -101,10 +117,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",
@@ -113,33 +129,30 @@
"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",
"Edit": "Modifier",
"Create template": "Créer un modèle",
"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",
"New document in": "Nouveau document",
"Members": "Membres",
"collection": "collection",
"New template…": "Nouveau modèle…",
"New document in <1>{{collectionName}}</1>": "Nouveau document dans <1>{{collectionName}}</1>",
"New template": "Nouveau modèle",
"Link copied": "Lien copié",
"Restore version": "Restaurer cette version",
"Copy link": "Copier le lien",
@@ -153,16 +166,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",
@@ -175,13 +188,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",
@@ -189,20 +202,19 @@
"{{ 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 {{ lastActiveAt }} ago": "Actif il y a {{ lastActiveAt }}",
"Active <1></1> ago": "Active il y a <1></1>",
"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",
@@ -217,7 +229,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é",
@@ -231,7 +243,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",
@@ -274,7 +286,6 @@
"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.",
+175 -164
View File
@@ -1,16 +1,26 @@
{
"currently editing": "currently editing",
"currently viewing": "currently viewing",
"viewed {{ timeAgo }} ago": "viewed {{ timeAgo }} ago",
"You": "You",
"Trash": "Trash",
"currently editing": "現在編集中",
"currently viewing": "閲覧中",
"viewed {{ timeAgo }} ago": "{{ timeAgo }}前に見た",
"You": "あなた",
"Trash": "ゴミ箱",
"Archive": "Archive",
"Drafts": "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": "見た",
"in": "in",
"New": "New",
"Only visible to you": "Only visible to you",
"Only visible to you": "あなたにしか見えない",
"Draft": "Draft",
"Template": "Template",
"Template": "テンプレート",
"New doc": "New doc",
"More options": "More options",
"Insert column after": "Insert column after",
@@ -20,269 +30,270 @@
"Align center": "Align center",
"Align left": "Align left",
"Align right": "Align right",
"Bulleted list": "Bulleted list",
"Todo list": "Todo list",
"Bulleted list": "順不同リスト",
"Todo list": "チェックリスト",
"Code block": "Code block",
"Copied to clipboard": "Copied to clipboard",
"Code": "Code",
"Code": "コード",
"Create link": "Create link",
"Sorry, an error occurred creating the 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",
"Italic": "斜体",
"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",
"Medium heading": "中見出し",
"Small heading": "小見出し",
"Heading": "見出し",
"Divider": "Divider",
"Image": "Image",
"Sorry, an error occurred uploading the image": "Sorry, an error occurred uploading the image",
"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",
"Link": "リンク",
"Link copied to clipboard": "リンクをクリップボードにコピーしました。",
"Highlight": "ハイライト",
"Type '/' to insert": "タイプ 「/」…",
"Keep typing to filter": "Keep typing to filter",
"No results": "検索結果はありません",
"Open link": "Open link",
"Ordered list": "Ordered list",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "Paste a {{service}} link…",
"Paste a link": "Paste a link",
"Paste a {{service}} link…": "{{service}}のリンクに貼り付けます。",
"Placeholder": "Placeholder",
"Quote": "Quote",
"Remove link": "Remove link",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "Strikethrough",
"Bold": "Bold",
"Search or paste a link": "Search or paste a link",
"Strikethrough": "取り消し線",
"Bold": "太字",
"Subheading": "Subheading",
"Table": "Table",
"Tip": "Tip",
"Tip": "ヒント",
"Tip notice": "Tip notice",
"Warning": "Warning",
"Warning": "警告",
"Warning notice": "Warning notice",
"Search…": "Search…",
"Icon": "アイコン",
"Loading": "ローディング...",
"Search": "検索",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outlineは、{{optionLabel}}で利用できます。言語を切り替えてみませんか?",
"Change Language": "言語の変更",
"Dismiss": "Dismiss",
"Keyboard shortcuts": "Keyboard shortcuts",
"New collection…": "New collection…",
"Expand": "Expand",
"Collapse": "Collapse",
"New collection": "New collection",
"Collections": "Collections",
"Untitled": "Untitled",
"Home": "Home",
"Search": "Search",
"Starred": "Starred",
"Untitled": "文書",
"Home": "ホーム",
"Starred": "スター文書",
"Invite people…": "Invite people…",
"Invite people": "Invite people",
"Create a collection": "Create a collection",
"Create a collection": "コレクションを作る",
"Return to App": "Return to App",
"Profile": "Profile",
"Notifications": "Notifications",
"API Tokens": "API Tokens",
"Notifications": "通知",
"API Tokens": "APIトークン",
"Details": "Details",
"Security": "Security",
"People": "People",
"Groups": "Groups",
"People": "人々",
"Groups": "グループ",
"Share Links": "Share Links",
"Export Data": "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",
"Settings": "設定",
"API documentation": "API ドキュメント",
"Changelog": "変更履歴",
"Send us feedback": "フィードバック",
"Report a bug": "バグ報告",
"Appearance": "外観",
"System": "システム",
"Light": "ライトモード",
"Dark": "ダークモード",
"Log out": "ログアウト",
"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",
"Import document": "ドキュメントのインポート",
"Edit": "編集",
"Permissions": "Permissions",
"Export": "エクスポート",
"Delete": "削除",
"Edit collection": "編集コレクション",
"Delete collection": "コレクションの削除",
"Export collection": "エクスポート(コレクション)",
"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",
"Choose a collection": "コレクションを選ぶ",
"Unpin": "固定しない",
"Pin to collection": "Pin to collection",
"Unstar": "Unstar",
"Star": "Star",
"Share link": "Share link",
"Unstar": "スター解除",
"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",
"New nested document": "新しい入れ子になった文書",
"Create template": "テンプレートの作成",
"Duplicate": "文書の複製",
"Unpublish": "未発表",
"Move": "Move",
"History": "時間旅行",
"Download": "ダウンロード",
"Print": "プリント",
"Delete {{ documentName }}": "{{ documentName }}を削除します。",
"Share document": "共有文書",
"Edit group": "Edit group",
"Delete group": "Delete group",
"Members": "Members…",
"New document in": "New document in",
"collection": "collection",
"New template": "New template",
"Members": "メンバー",
"collection": "コレクション",
"New document in <1>{{collectionName}}</1>": "<1>「{{collectionName}}」</1>コレクションに新規ドキュメントを作成しました。",
"New template": "New template",
"Link copied": "Link copied",
"Restore version": "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…",
"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": "アカウントの一時停止",
"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.",
"Search in collection": "Search in collection",
"<0>{{collectionName}}</0> doesnt contain any documents yet.": "<0>{{collectionName}}</0>には文書は含まれていません。",
"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",
"Create a document": "ドキュメントの作成",
"Manage members": "Manage members",
"Pinned": "固定",
"Recently updated": "最近の更新",
"Recently published": "Recently published",
"Least recently updated": "Least recently updated",
"AZ": "AZ",
"The collection was updated": "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",
"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",
"Saving": "保存文書...",
"Save": "セーブ",
"{{ groupName }} was added to the collection": "コレクションに{{ groupName }}を追加しました。",
"Could not add user": "Could not add user",
"Cant find the group youre looking for?": "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 }} was added to the collection",
"{{ userName }} was added to the collection": "コレクションに{{ userName }}を追加しました。",
"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 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",
"Remove": "削除",
"Active <1></1> ago": "Active <1></1> 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",
"Admin": "アドミン",
"Collections are for grouping your knowledge base. They work best when organized around a topic or internal team — Product or Engineering for example.": "コレクションは、知識ベースを整理するために使用されます。ドキュメントをトピックにグループ化します。e.g. 1つのコレクションは、研究開発に関連するすべての文書を保持することができます。",
"Creating": "Creating",
"Create": "作る",
"Recently viewed": "Recently viewed",
"Created by me": "Created by me",
"Hide contents": "Hide contents",
"Show contents": "Show contents",
"Archived": "Archived",
"Archived": "アーカイブ",
"Anyone with the link <1></1>can view this document": "Anyone with the link <1></1>can view this document",
"Share": "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",
"Publish": "公開",
"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",
"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?": "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.",
"{{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": "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",
"Table of contents": "目次",
"Open this guide": "Open this guide",
"Editor": "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",
"Underline": "下線",
"Undo": "元に戻す",
"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",
"Large header": "大見出し",
"Medium header": "中見出し",
"Small header": "小見出し",
"Numbered list": "順序付きのリスト",
"Blockquote": "引用",
"Horizontal divider": "区切り線",
"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",
"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?": "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",
"Profile picture updated": "プロフィール写真の更新に成功しました。",
"Unable to upload new profile picture": "プロフィール写真をアップロードできません。",
"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",
"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": "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.",
"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": "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."
"{{ userName }} hasnt updated any documents yet.": "{{ userName }}はまだ文書を更新していません"
}
+299
View File
@@ -0,0 +1,299 @@
{
"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": "단축키",
"Expand": "Expand",
"Collapse": "Collapse",
"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 }} 가 문서를 업데이트하지 않았습니다."
}
+299
View File
@@ -0,0 +1,299 @@
{
"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",
"Expand": "Expand",
"Collapse": "Collapse",
"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": "Remover estrela",
"Star": "Adicionar aos favoritos",
"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."
}
+45 -34
View File
@@ -7,6 +7,16 @@
"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",
@@ -33,7 +43,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": "Pesquise ou crie um documento",
"Big heading": "Cabeçalho grande",
"Medium heading": "Cabeçalho médio",
"Small heading": "Cabeçalho pequeno",
@@ -46,17 +56,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 a escrever 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",
@@ -65,13 +75,19 @@
"Tip notice": "Aviso de dica",
"Warning": "Aviso",
"Warning notice": "Aviso de alerta",
"Search…": "Pesquisa…",
"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",
"Keyboard shortcuts": "Atalhos do teclado",
"New collection…": "Nova coleção…",
"Expand": "Expandir",
"Collapse": "Fechar",
"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",
@@ -101,10 +117,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",
@@ -113,33 +129,30 @@
"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",
"Edit": "Editar",
"Create template": "Criar template",
"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",
"New document in": "Novo documento em",
"Members": "Membros",
"collection": "coleção",
"New template…": "Novo template…",
"New document in <1>{{collectionName}}</1>": "Novo documento em <1>{{collectionName}}</1>",
"New template": "Novo template",
"Link copied": "Link copiado",
"Restore version": "Restaurar versão",
"Copy link": "Copiar link",
@@ -153,16 +166,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",
@@ -175,13 +188,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",
@@ -189,20 +202,19 @@
"{{ 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 {{ lastActiveAt }} ago": "Ativo há {{ lastActiveAt }}",
"Active <1></1> ago": "Ativo <1></1> atrás",
"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",
@@ -217,7 +229,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",
@@ -231,7 +243,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",
@@ -274,7 +286,6 @@
"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.",
+284 -273
View File
@@ -1,288 +1,299 @@
{
"currently editing": "редактируется",
"currently viewing": "просматривается",
"currently editing": "сейчас редактируется",
"currently viewing": "сейчас просматривается",
"viewed {{ timeAgo }} ago": "просмотрено {{ timeAgo }} назад",
"You": "You",
"You": "Вы",
"Trash": "Корзина",
"Archive": "Архив",
"Drafts": "Черновики",
"Templates": "Шаблоны",
"New": "New",
"Only visible to you": "Only visible to you",
"Deleted Collection": "Удаленная коллекция",
"deleted": "удален",
"archived": "архивирован",
"created": "создан",
"published": "опубликован",
"saved": "сохранен",
"updated": "обновлен",
"Never viewed": "Не просмотрено",
"Viewed": "Просмотрено",
"in": "в",
"New": "Новое",
"Only visible to you": "Видно только вам",
"Draft": "Черновик",
"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",
"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": "Create a new doc",
"Delete column": "Удалить колонку",
"Create a new doc": "Создать новый документ",
"Delete column": "Удалить столбец",
"Delete row": "Удалить строку",
"Delete table": "Удалить таблицу",
"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",
"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": "Поле для заполнения",
"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": "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",
"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": "Горячие клавиши",
"Expand": "Expand",
"Collapse": "Collapse",
"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": "Повторить",
"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",
"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."
"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 }} еще не обновил ни одного документа."
}
+234 -223
View File
@@ -1,208 +1,220 @@
{
"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",
"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": "快捷键",
"Expand": "Expand",
"Collapse": "Collapse",
"New collection": "New collection",
"Collections": "文档集",
"Untitled": "无标题文档",
"Home": "主页",
"Starred": "已加星标",
"Invite people…": "邀请其他人…",
"Invite people": "邀请其他人",
"Create a collection": "创建文档集",
"Return to App": "返回应用",
"Profile": "基本资料",
"Notifications": "通知",
"API Tokens": "API Tokens",
"Details": "Details",
"Security": "Security",
"People": "People",
"Groups": "Groups",
"Details": "详细信息",
"Security": "安全性",
"People": "用户",
"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",
"API documentation": "API 文档",
"Changelog": "更新日志",
"Send us feedback": "发送反馈",
"Report a bug": "Report a bug",
"Appearance": "Appearance",
"System": "System",
"Appearance": "界面外观",
"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",
"Log out": "退出登录",
"Collection permissions": "文档集权限",
"New document": "新建文档",
"Import document": "导入文档",
"Edit": "编辑",
"Permissions": "Permissions",
"Export": "Export",
"Delete": "Delete",
"Edit collection": "编辑文档集",
"Delete collection": "删除文档集",
"Export collection": "导出文档集",
"Document duplicated": "Document duplicated",
"Document archived": "Document archived",
"Document restored": "Document restored",
"Document archived": "文件已封存",
"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",
"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.": "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",
"More details about this collection…": "有关此文档集的更多详细信息…",
"Private collection": "私密文档集",
"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",
"{{ groupName }} was added to the collection": "{{ groupName }} 已添加到文档集",
"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 }} was added to the collection",
"{{ userName }} was added to the collection": "{{ userName }} 已添加到文档集",
"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 {{ lastActiveAt }} ago": "Active {{ lastActiveAt }} ago",
"Active <1></1> ago": "Active <1></1> 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",
"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",
@@ -215,57 +227,57 @@
"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",
"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": "不能上传个人资料照片",
"Photo": "Photo",
"Upload": "Upload",
"Full name": "Full name",
@@ -274,7 +286,6 @@
"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.",
+3 -1
View File
@@ -2,6 +2,7 @@
import { darken, lighten } from "polished";
const colors = {
transparent: "transparent",
almostBlack: "#111319",
lightBlack: "#2F3336",
almostWhite: "#E6E6E6",
@@ -47,6 +48,7 @@ const spacing = {
vpadding: "1.5vw",
hpadding: "1.875vw",
sidebarWidth: "280px",
sidebarCollapsedWidth: "16px",
sidebarMinWidth: "250px",
sidebarMaxWidth: "350px",
};
@@ -183,7 +185,7 @@ export const dark = {
placeholder: colors.slateDark,
sidebarBackground: colors.veryDarkBlue,
sidebarItemBackground: colors.veryDarkBlue,
sidebarItemBackground: colors.transparent,
sidebarText: colors.slate,
shadow: "rgba(0, 0, 0, 0.6)",
+124 -31
View File
@@ -1365,6 +1365,21 @@
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"
@@ -1555,6 +1570,14 @@
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"
@@ -1604,6 +1627,19 @@
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"
@@ -2149,12 +2185,10 @@ atob@^2.1.2:
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
attr-accept@^1.0.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-1.1.3.tgz#48230c79f93790ef2775fcec4f0db0f5db41ca52"
integrity sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==
dependencies:
core-js "^2.5.0"
attr-accept@^2.2.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b"
integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==
auto-bind@^1.1.0:
version "1.2.1"
@@ -3593,7 +3627,7 @@ core-js-pure@^3.0.0:
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.7.0.tgz#28a57c861d5698e053f0ff36905f7a3301b4191e"
integrity sha512-EZD2ckZysv8MMt4J6HSvS9K2GdtlZtdBncKAmF9lr2n0c9dJUaUN88PSTjvgwCgQPWKTkERXITgS6JJRAnljtg==
core-js@2, core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
core-js@2, core-js@^2.4.0, core-js@^2.6.5:
version "2.6.11"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
@@ -3767,6 +3801,11 @@ 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"
@@ -4004,6 +4043,15 @@ 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"
@@ -4942,6 +4990,13 @@ file-loader@^1.1.6:
loader-utils "^1.0.2"
schema-utils "^0.4.5"
file-selector@^0.2.2:
version "0.2.4"
resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.2.4.tgz#7b98286f9dbb9925f420130ea5ed0a69238d4d80"
integrity sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==
dependencies:
tslib "^2.0.3"
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
@@ -5748,7 +5803,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.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.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==
@@ -6107,9 +6162,9 @@ inherits@2.0.3:
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
version "1.3.7"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
internal-slot@^1.0.2:
version "1.0.2"
@@ -8469,9 +8524,9 @@ node-modules-regexp@^1.0.0:
integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
node-notifier@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620"
integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==
version "8.0.1"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1"
integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==
dependencies:
growly "^1.3.0"
is-wsl "^2.2.0"
@@ -9404,7 +9459,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.5"
prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2:
prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -9754,6 +9809,23 @@ 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"
@@ -9764,13 +9836,14 @@ react-dom@^16.8.6:
prop-types "^15.6.2"
scheduler "^0.19.1"
react-dropzone@4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-4.2.1.tgz#695e80bd0b065f1181e69f2d0f6d1d5cc72664c9"
integrity sha512-qKZRMYAU5tOAI/olSp8DNnmKtoG9PmU1g+Z+TR7/QV0q9rK/zLn7hVyFKU8BSJt9q+Z9umLKJrS9DuxyBiIDMA==
react-dropzone@^11.2.4:
version "11.2.4"
resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-11.2.4.tgz#391a8d2e41a8a974340f83524d306540192e3313"
integrity sha512-EGSvK2CxFTuc28WxwuJCICyuYFX8b+sRumwU6Bs6sTbElV2HtQkT0d6C+HEee6XfbjiLIZ+Th9uji27rvo2wGw==
dependencies:
attr-accept "^1.0.3"
prop-types "^15.5.7"
attr-accept "^2.2.1"
file-selector "^0.2.2"
prop-types "^15.7.2"
react-fast-compare@^2.0.2:
version "2.0.4"
@@ -10021,6 +10094,14 @@ 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"
@@ -10333,10 +10414,10 @@ retry-as-promised@^3.2.0:
dependencies:
any-promise "^1.3.0"
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==
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==
dependencies:
copy-to-clipboard "^3.0.8"
lodash "^4.17.11"
@@ -10586,9 +10667,11 @@ semver@^6.0.0, semver@^6.3.0:
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.2.1, semver@^7.3.2:
version "7.3.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
version "7.3.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
dependencies:
lru-cache "^6.0.0"
sequelize-cli@^6.2.0:
version "6.2.0"
@@ -11381,6 +11464,11 @@ 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"
@@ -11747,6 +11835,11 @@ tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
tsscmp@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
@@ -12202,9 +12295,9 @@ uuid@^3.3.2:
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
uuid@^8.1.0, uuid@^8.3.0:
version "8.3.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1:
version "2.2.0"