From 52643c511c8142a8e3aa7fe2030ca3cbb4489785 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 08:31:22 -0700 Subject: [PATCH 001/129] chore(deps): bump vite from 5.0.12 to 5.0.13 (#6758) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.12 to 5.0.13. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.0.13/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.0.13/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d4e59c2a210d..19b2c77e216a 100644 --- a/package.json +++ b/package.json @@ -229,7 +229,7 @@ "utility-types": "^3.10.0", "uuid": "^8.3.2", "validator": "13.11.0", - "vite": "^5.0.12", + "vite": "^5.0.13", "vite-plugin-pwa": "^0.17.4", "winston": "^3.10.0", "ws": "^7.5.9", diff --git a/yarn.lock b/yarn.lock index 56e832bdb6f9..66843ccbe38b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13643,9 +13643,10 @@ vite-plugin-static-copy@^0.17.0: fs-extra "^11.1.0" picocolors "^1.0.0" -vite@^5.0.12: - version "5.0.12" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47" +vite@^5.0.13: + version "5.0.13" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.13.tgz#605865b0e482506163e3f04f91665238f3be8cf1" + integrity sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg== dependencies: esbuild "^0.19.3" postcss "^8.4.32" From 3f209101e69b5f8cf8ee79cf37ba4f9615bd1112 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 6 Apr 2024 07:32:15 -0600 Subject: [PATCH 002/129] Add `updateRole` endpoint (#6771) --- server/commands/userDemoter.test.ts | 33 ---- server/commands/userDemoter.ts | 41 ----- server/models/User.ts | 106 ++++++----- server/policies/apiKey.ts | 3 +- server/policies/webhookSubscription.ts | 3 +- .../queues/processors/UserDeletedProcessor.ts | 2 +- .../queues/processors/UserDemotedProcessor.ts | 11 ++ server/queues/tasks/CleanupDemotedUserTask.ts | 11 +- .../users/__snapshots__/users.test.ts.snap | 6 +- server/routes/api/users/schema.ts | 11 +- server/routes/api/users/users.test.ts | 50 ++++++ server/routes/api/users/users.ts | 164 +++++++++++------- shared/i18n/locales/en_US/translation.json | 3 + shared/utils/UserRoleHelper.ts | 61 +++++++ 14 files changed, 306 insertions(+), 199 deletions(-) delete mode 100644 server/commands/userDemoter.test.ts delete mode 100644 server/commands/userDemoter.ts create mode 100644 server/queues/processors/UserDemotedProcessor.ts create mode 100644 shared/utils/UserRoleHelper.ts diff --git a/server/commands/userDemoter.test.ts b/server/commands/userDemoter.test.ts deleted file mode 100644 index b91e6c44da62..000000000000 --- a/server/commands/userDemoter.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { CollectionPermission, UserRole } from "@shared/types"; -import { UserMembership } from "@server/models"; -import { buildUser, buildAdmin, buildCollection } from "@server/test/factories"; -import userDemoter from "./userDemoter"; - -describe("userDemoter", () => { - const ip = "127.0.0.1"; - - it("should change role and associated collection permissions", async () => { - const admin = await buildAdmin(); - const user = await buildUser({ teamId: admin.teamId }); - const collection = await buildCollection({ teamId: admin.teamId }); - - const membership = await UserMembership.create({ - createdById: admin.id, - userId: user.id, - collectionId: collection.id, - permission: CollectionPermission.ReadWrite, - }); - - await userDemoter({ - user, - actorId: admin.id, - to: UserRole.Viewer, - ip, - }); - - expect(user.isViewer).toEqual(true); - - await membership.reload(); - expect(membership.permission).toEqual(CollectionPermission.Read); - }); -}); diff --git a/server/commands/userDemoter.ts b/server/commands/userDemoter.ts deleted file mode 100644 index e841e50dfb74..000000000000 --- a/server/commands/userDemoter.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Transaction } from "sequelize"; -import { UserRole } from "@shared/types"; -import { ValidationError } from "@server/errors"; -import { Event, User } from "@server/models"; -import CleanupDemotedUserTask from "@server/queues/tasks/CleanupDemotedUserTask"; - -type Props = { - user: User; - actorId: string; - to: UserRole; - transaction?: Transaction; - ip: string; -}; - -export default async function userDemoter({ - user, - actorId, - to, - transaction, - ip, -}: Props) { - if (user.id === actorId) { - throw ValidationError("Unable to demote the current user"); - } - - await user.demote(to, { transaction }); - await Event.create( - { - name: "users.demote", - actorId, - userId: user.id, - teamId: user.teamId, - data: { - name: user.name, - }, - ip, - }, - { transaction } - ); - await CleanupDemotedUserTask.schedule({ userId: user.id }); -} diff --git a/server/models/User.ts b/server/models/User.ts index 6961aaa2dbe0..90eeb5d4954d 100644 --- a/server/models/User.ts +++ b/server/models/User.ts @@ -10,8 +10,8 @@ import { FindOptions, InferAttributes, InferCreationAttributes, - InstanceUpdateOptions, } from "sequelize"; +import { type InstanceUpdateOptions } from "sequelize"; import { Table, Column, @@ -29,6 +29,7 @@ import { IsDate, AllowNull, AfterUpdate, + BeforeUpdate, } from "sequelize-typescript"; import { UserPreferenceDefaults } from "@shared/constants"; import { languages } from "@shared/i18n"; @@ -42,9 +43,9 @@ import { UserRole, DocumentPermission, } from "@shared/types"; +import { UserRoleHelper } from "@shared/utils/UserRoleHelper"; import { stringToColor } from "@shared/utils/color"; import env from "@server/env"; -import Model from "@server/models/base/Model"; import DeleteAttachmentTask from "@server/queues/tasks/DeleteAttachmentTask"; import parseAttachmentIds from "@server/utils/parseAttachmentIds"; import { ValidationError } from "../errors"; @@ -567,51 +568,6 @@ class User extends ParanoidModel< ], }); - demote: ( - to: UserRole, - options?: InstanceUpdateOptions> - ) => Promise = async (to, options) => { - const res = await (this.constructor as typeof User).findAndCountAll({ - where: { - teamId: this.teamId, - role: UserRole.Admin, - id: { - [Op.ne]: this.id, - }, - }, - limit: 1, - ...options, - }); - - if (res.count >= 1) { - if (to === UserRole.Member) { - await this.update({ role: to }, options); - } else if (to === UserRole.Viewer) { - await this.update({ role: to }, options); - await UserMembership.update( - { - permission: CollectionPermission.Read, - }, - { - ...options, - where: { - userId: this.id, - }, - } - ); - } - - return undefined; - } else { - throw ValidationError("At least one admin is required"); - } - }; - - promote: ( - options?: InstanceUpdateOptions> - ) => Promise = (options) => - this.update({ role: UserRole.Admin }, options); - // hooks @BeforeDestroy @@ -638,6 +594,62 @@ class User extends ParanoidModel< model.jwtSecret = crypto.randomBytes(64).toString("hex"); }; + @BeforeUpdate + static async checkRoleChange( + model: User, + options: InstanceUpdateOptions> + ) { + const previousRole = model.previous("role"); + + if ( + model.changed("role") && + previousRole === UserRole.Admin && + UserRoleHelper.isRoleLower(model.role, UserRole.Admin) + ) { + const { count } = await this.findAndCountAll({ + where: { + teamId: model.teamId, + role: UserRole.Admin, + id: { + [Op.ne]: model.id, + }, + }, + limit: 1, + transaction: options.transaction, + }); + if (count === 0) { + throw ValidationError("At least one admin is required"); + } + } + } + + @AfterUpdate + static async updateMembershipPermissions( + model: User, + options: InstanceUpdateOptions> + ) { + const previousRole = model.previous("role"); + + if ( + previousRole && + model.changed("role") && + UserRoleHelper.isRoleLower(model.role, UserRole.Member) && + UserRoleHelper.isRoleHigher(previousRole, UserRole.Viewer) + ) { + await UserMembership.update( + { + permission: CollectionPermission.Read, + }, + { + transaction: options.transaction, + where: { + userId: model.id, + }, + } + ); + } + } + @AfterUpdate static deletePreviousAvatar = async (model: User) => { const previousAvatarUrl = model.previous("avatarUrl"); diff --git a/server/policies/apiKey.ts b/server/policies/apiKey.ts index b128d698f64c..14f642672e6a 100644 --- a/server/policies/apiKey.ts +++ b/server/policies/apiKey.ts @@ -8,7 +8,8 @@ allow(User, "createApiKey", Team, (actor, team) => isTeamModel(actor, team), isTeamMutable(actor), !actor.isViewer, - !actor.isGuest + !actor.isGuest, + !actor.isSuspended ) ); diff --git a/server/policies/webhookSubscription.ts b/server/policies/webhookSubscription.ts index 95f71ebb5469..7ea1e64d8f59 100644 --- a/server/policies/webhookSubscription.ts +++ b/server/policies/webhookSubscription.ts @@ -6,7 +6,8 @@ allow(User, "createWebhookSubscription", Team, (actor, team) => and( // isTeamAdmin(actor, team), - isTeamMutable(actor) + isTeamMutable(actor), + !actor.isSuspended ) ); diff --git a/server/queues/processors/UserDeletedProcessor.ts b/server/queues/processors/UserDeletedProcessor.ts index d2cb39492d14..d6dcef76fd3d 100644 --- a/server/queues/processors/UserDeletedProcessor.ts +++ b/server/queues/processors/UserDeletedProcessor.ts @@ -10,7 +10,7 @@ import { sequelize } from "@server/storage/database"; import { Event as TEvent, UserEvent } from "@server/types"; import BaseProcessor from "./BaseProcessor"; -export default class UsersDeletedProcessor extends BaseProcessor { +export default class UserDeletedProcessor extends BaseProcessor { static applicableEvents: TEvent["name"][] = ["users.delete"]; async perform(event: UserEvent) { diff --git a/server/queues/processors/UserDemotedProcessor.ts b/server/queues/processors/UserDemotedProcessor.ts new file mode 100644 index 000000000000..a2bc23c56132 --- /dev/null +++ b/server/queues/processors/UserDemotedProcessor.ts @@ -0,0 +1,11 @@ +import { Event as TEvent, UserEvent } from "@server/types"; +import CleanupDemotedUserTask from "../tasks/CleanupDemotedUserTask"; +import BaseProcessor from "./BaseProcessor"; + +export default class UserDemotedProcessor extends BaseProcessor { + static applicableEvents: TEvent["name"][] = ["users.demote"]; + + async perform(event: UserEvent) { + await CleanupDemotedUserTask.schedule({ userId: event.userId }); + } +} diff --git a/server/queues/tasks/CleanupDemotedUserTask.ts b/server/queues/tasks/CleanupDemotedUserTask.ts index 5fd16e843ce5..9255a45e6a0a 100644 --- a/server/queues/tasks/CleanupDemotedUserTask.ts +++ b/server/queues/tasks/CleanupDemotedUserTask.ts @@ -1,5 +1,6 @@ import Logger from "@server/logging/Logger"; import { WebhookSubscription, ApiKey, User } from "@server/models"; +import { cannot } from "@server/policies"; import { sequelize } from "@server/storage/database"; import BaseTask, { TaskPriority } from "./BaseTask"; @@ -13,10 +14,12 @@ type Props = { */ export default class CleanupDemotedUserTask extends BaseTask { public async perform(props: Props) { - await sequelize.transaction(async (transaction) => { - const user = await User.findByPk(props.userId, { rejectOnEmpty: true }); + const user = await User.scope("withTeam").findByPk(props.userId, { + rejectOnEmpty: true, + }); - if (user.isSuspended || !user.isAdmin) { + await sequelize.transaction(async (transaction) => { + if (cannot(user, "createWebhookSubscription", user.team)) { const subscriptions = await WebhookSubscription.findAll({ where: { createdById: props.userId, @@ -36,7 +39,7 @@ export default class CleanupDemotedUserTask extends BaseTask { ); } - if (user.isSuspended || user.isViewer) { + if (cannot(user, "createApiKey", user.team)) { const apiKeys = await ApiKey.findAll({ where: { userId: props.userId, diff --git a/server/routes/api/users/__snapshots__/users.test.ts.snap b/server/routes/api/users/__snapshots__/users.test.ts.snap index b2929a4176f6..3ab141b7025a 100644 --- a/server/routes/api/users/__snapshots__/users.test.ts.snap +++ b/server/routes/api/users/__snapshots__/users.test.ts.snap @@ -21,7 +21,7 @@ exports[`#users.delete should require authentication 1`] = ` exports[`#users.demote should not allow demoting self 1`] = ` { "error": "validation_error", - "message": "Unable to demote the current user", + "message": "You cannot change your own role", "ok": false, "status": 400, } @@ -30,7 +30,7 @@ exports[`#users.demote should not allow demoting self 1`] = ` exports[`#users.demote should require admin 1`] = ` { "error": "authorization_error", - "message": "Authorization error", + "message": "Admin role required", "ok": false, "status": 403, } @@ -39,7 +39,7 @@ exports[`#users.demote should require admin 1`] = ` exports[`#users.promote should require admin 1`] = ` { "error": "authorization_error", - "message": "Authorization error", + "message": "Admin role required", "ok": false, "status": 403, } diff --git a/server/routes/api/users/schema.ts b/server/routes/api/users/schema.ts index 706b70f05adb..79f7c9134a78 100644 --- a/server/routes/api/users/schema.ts +++ b/server/routes/api/users/schema.ts @@ -110,6 +110,14 @@ export const UsersActivateSchema = BaseSchema.extend({ export type UsersActivateReq = z.infer; +export const UsersChangeRoleSchema = BaseSchema.extend({ + body: BaseIdSchema.extend({ + role: z.nativeEnum(UserRole), + }), +}); + +export type UsersChangeRoleReq = z.infer; + export const UsersPromoteSchema = BaseSchema.extend({ body: BaseIdSchema, }); @@ -117,8 +125,7 @@ export const UsersPromoteSchema = BaseSchema.extend({ export type UsersPromoteReq = z.infer; export const UsersDemoteSchema = BaseSchema.extend({ - body: z.object({ - id: z.string().uuid(), + body: BaseIdSchema.extend({ to: z.nativeEnum(UserRole).default(UserRole.Member), }), }); diff --git a/server/routes/api/users/users.test.ts b/server/routes/api/users/users.test.ts index 07b438428704..4f4f15ec247f 100644 --- a/server/routes/api/users/users.test.ts +++ b/server/routes/api/users/users.test.ts @@ -555,6 +555,55 @@ describe("#users.update", () => { }); }); +describe("#users.updateRole", () => { + it("should promote", async () => { + const team = await buildTeam(); + const admin = await buildAdmin({ teamId: team.id }); + const user = await buildUser({ teamId: team.id }); + + const res = await server.post("/api/users.updateRole", { + body: { + token: admin.getJwtToken(), + id: user.id, + role: UserRole.Admin, + }, + }); + expect(res.status).toEqual(200); + expect((await user.reload()).role).toEqual(UserRole.Admin); + }); + + it("should demote", async () => { + const team = await buildTeam(); + const admin = await buildAdmin({ teamId: team.id }); + const user = await buildAdmin({ teamId: team.id }); + + const res = await server.post("/api/users.updateRole", { + body: { + token: admin.getJwtToken(), + id: user.id, + role: UserRole.Viewer, + }, + }); + expect(res.status).toEqual(200); + expect((await user.reload()).role).toEqual(UserRole.Viewer); + }); + + it("should error on same role", async () => { + const team = await buildTeam(); + const admin = await buildAdmin({ teamId: team.id }); + const user = await buildAdmin({ teamId: team.id }); + + const res = await server.post("/api/users.updateRole", { + body: { + token: admin.getJwtToken(), + id: user.id, + role: UserRole.Admin, + }, + }); + expect(res.status).toEqual(400); + }); +}); + describe("#users.promote", () => { it("should promote a new admin", async () => { const team = await buildTeam(); @@ -631,6 +680,7 @@ describe("#users.demote", () => { it("should not allow demoting self", async () => { const admin = await buildAdmin(); + await buildAdmin({ teamId: admin.teamId }); const res = await server.post("/api/users.demote", { body: { token: admin.getJwtToken(), diff --git a/server/routes/api/users/users.ts b/server/routes/api/users/users.ts index 9bd932c77742..e9bf18b38356 100644 --- a/server/routes/api/users/users.ts +++ b/server/routes/api/users/users.ts @@ -1,8 +1,8 @@ import Router from "koa-router"; import { Op, WhereOptions } from "sequelize"; import { UserPreference, UserRole } from "@shared/types"; +import { UserRoleHelper } from "@shared/utils/UserRoleHelper"; import { UserValidation } from "@shared/validations"; -import userDemoter from "@server/commands/userDemoter"; import userDestroyer from "@server/commands/userDestroyer"; import userInviter from "@server/commands/userInviter"; import userSuspender from "@server/commands/userSuspender"; @@ -255,91 +255,123 @@ router.post( ); // Admin specific + +/** + * Promote a user to an admin. + * + * @deprecated Use `users.updateRole` instead. + */ router.post( "users.promote", - auth(), + auth({ admin: true }), validate(T.UsersPromoteSchema), transaction(), - async (ctx: APIContext) => { - const { transaction } = ctx.state; - const userId = ctx.input.body.id; - const actor = ctx.state.auth.user; - const teamId = actor.teamId; - const user = await User.findByPk(userId, { - rejectOnEmpty: true, - transaction, - lock: transaction.LOCK.UPDATE, - }); - authorize(actor, "promote", user); - - await user.promote({ - transaction, - }); - await Event.create( - { - name: "users.promote", - actorId: actor.id, - userId, - teamId, - data: { - name: user.name, - }, - ip: ctx.request.ip, + (ctx: APIContext) => { + const forward = ctx as unknown as APIContext; + forward.input = { + body: { + id: ctx.input.body.id, + role: UserRole.Admin, }, - { - transaction, - } - ); - const includeDetails = can(actor, "readDetails", user); - - ctx.body = { - data: presentUser(user, { - includeDetails, - }), - policies: presentPolicies(actor, [user]), }; + + return updateRole(forward); } ); +/** + * Demote a user to another role. + * + * @deprecated Use `users.updateRole` instead. + */ router.post( "users.demote", - auth(), + auth({ admin: true }), validate(T.UsersDemoteSchema), transaction(), - async (ctx: APIContext) => { - const { transaction } = ctx.state; - const { to, id: userId } = ctx.input.body; - const actor = ctx.state.auth.user; + (ctx: APIContext) => { + const forward = ctx as unknown as APIContext; + forward.input = { + body: { + id: ctx.input.body.id, + role: ctx.input.body.to, + }, + }; - const user = await User.findByPk(userId, { - rejectOnEmpty: true, - transaction, - lock: transaction.LOCK.UPDATE, - }); + return updateRole(forward); + } +); + +router.post( + "users.updateRole", + auth({ admin: true }), + validate(T.UsersChangeRoleSchema), + transaction(), + updateRole +); + +async function updateRole(ctx: APIContext) { + const { transaction } = ctx.state; + const userId = ctx.input.body.id; + const role = ctx.input.body.role; + const actor = ctx.state.auth.user; + + const user = await User.findByPk(userId, { + rejectOnEmpty: true, + transaction, + lock: transaction.LOCK.UPDATE, + }); + await Team.findByPk(user.teamId, { + transaction, + lock: transaction.LOCK.UPDATE, + }); + + let name; + + if (user.role === role) { + throw ValidationError("User is already in that role"); + } + if (user.id === actor.id) { + throw ValidationError("You cannot change your own role"); + } + + if (UserRoleHelper.canDemote(user, role)) { + name = "users.demote"; authorize(actor, "demote", user); + } + if (UserRoleHelper.canPromote(user, role)) { + name = "users.promote"; + authorize(actor, "promote", user); + } - await Team.findByPk(user.teamId, { - transaction, - lock: transaction.LOCK.UPDATE, - }); + await user.update({ role }, { transaction }); - await userDemoter({ - to, - user, + await Event.create( + { + name, + userId, actorId: actor.id, - transaction, + teamId: actor.teamId, + data: { + name: user.name, + role, + }, ip: ctx.request.ip, - }); - const includeDetails = can(actor, "readDetails", user); + }, + { + transaction, + } + ); - ctx.body = { - data: presentUser(user, { - includeDetails, - }), - policies: presentPolicies(actor, [user]), - }; - } -); + const includeDetails = can(actor, "readDetails", user); + + ctx.body = { + data: presentUser(user, { + includeDetails, + }), + policies: presentPolicies(actor, [user]), + }; +} router.post( "users.suspend", diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index b7d87d5eed4e..b18df5af769d 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -460,6 +460,9 @@ "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "User options", + "Change role": "Change role", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", "Resend invite": "Resend invite", "Revoke invite": "Revoke invite", "Activate user": "Activate user", diff --git a/shared/utils/UserRoleHelper.ts b/shared/utils/UserRoleHelper.ts new file mode 100644 index 000000000000..f70a8df9becc --- /dev/null +++ b/shared/utils/UserRoleHelper.ts @@ -0,0 +1,61 @@ +import { UserRole } from "../types"; + +interface User { + role: UserRole; +} + +export class UserRoleHelper { + /** + * Check if the first role is higher than the second role. + * + * @param role The role to check + * @param otherRole The role to compare against + * @returns `true` if the first role is higher than the second role, `false` otherwise + */ + static isRoleHigher(role: UserRole, otherRole: UserRole): boolean { + return this.roles.indexOf(role) > this.roles.indexOf(otherRole); + } + + /** + * Check if the first role is lower than the second role. + * + * @param role The role to check + * @param otherRole The role to compare against + * @returns `true` if the first role is lower than the second role, `false` otherwise + */ + static isRoleLower(role: UserRole, otherRole: UserRole): boolean { + return this.roles.indexOf(role) < this.roles.indexOf(otherRole); + } + + /** + * Check if the users role is lower than the given role. This does not authorize the operation. + * + * @param user The user to check + * @param role The role to compare against + * @returns `true` if the users role is lower than the given role, `false` otherwise + */ + static canPromote(user: User, role: UserRole): boolean { + return this.isRoleHigher(role, user.role); + } + + /** + * Check if the users role is higher than the given role. This does not authorize the operation. + * + * @param user The user to check + * @param role The role to compare against + * @returns `true` if the users role is higher than the given role, `false` otherwise + */ + static canDemote(user: User, role: UserRole): boolean { + return this.isRoleLower(role, user.role); + } + + /** + * List of all roles in order from lowest to highest. + */ + private static roles = [ + UserRole.Guest, + UserRole.Viewer, + UserRole.Member, + UserRole.Admin, + ]; +} From 79899d051c145314d8535236e75a7fb1f56d31a5 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 6 Apr 2024 21:16:44 -0400 Subject: [PATCH 003/129] updateRole -> update_role --- server/routes/api/users/users.test.ts | 8 ++++---- server/routes/api/users/users.ts | 6 +++--- shared/i18n/locales/en_US/translation.json | 3 --- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/server/routes/api/users/users.test.ts b/server/routes/api/users/users.test.ts index 4f4f15ec247f..f7f211782db1 100644 --- a/server/routes/api/users/users.test.ts +++ b/server/routes/api/users/users.test.ts @@ -555,13 +555,13 @@ describe("#users.update", () => { }); }); -describe("#users.updateRole", () => { +describe("#users.update_role", () => { it("should promote", async () => { const team = await buildTeam(); const admin = await buildAdmin({ teamId: team.id }); const user = await buildUser({ teamId: team.id }); - const res = await server.post("/api/users.updateRole", { + const res = await server.post("/api/users.update_role", { body: { token: admin.getJwtToken(), id: user.id, @@ -577,7 +577,7 @@ describe("#users.updateRole", () => { const admin = await buildAdmin({ teamId: team.id }); const user = await buildAdmin({ teamId: team.id }); - const res = await server.post("/api/users.updateRole", { + const res = await server.post("/api/users.update_role", { body: { token: admin.getJwtToken(), id: user.id, @@ -593,7 +593,7 @@ describe("#users.updateRole", () => { const admin = await buildAdmin({ teamId: team.id }); const user = await buildAdmin({ teamId: team.id }); - const res = await server.post("/api/users.updateRole", { + const res = await server.post("/api/users.update_role", { body: { token: admin.getJwtToken(), id: user.id, diff --git a/server/routes/api/users/users.ts b/server/routes/api/users/users.ts index e9bf18b38356..9c1f26686c97 100644 --- a/server/routes/api/users/users.ts +++ b/server/routes/api/users/users.ts @@ -259,7 +259,7 @@ router.post( /** * Promote a user to an admin. * - * @deprecated Use `users.updateRole` instead. + * @deprecated Use `users.update_role` instead. */ router.post( "users.promote", @@ -282,7 +282,7 @@ router.post( /** * Demote a user to another role. * - * @deprecated Use `users.updateRole` instead. + * @deprecated Use `users.update_role` instead. */ router.post( "users.demote", @@ -303,7 +303,7 @@ router.post( ); router.post( - "users.updateRole", + "users.update_role", auth({ admin: true }), validate(T.UsersChangeRoleSchema), transaction(), diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index b18df5af769d..b7d87d5eed4e 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -460,9 +460,6 @@ "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "User options", - "Change role": "Change role", - "Promote to {{ role }}": "Promote to {{ role }}", - "Demote to {{ role }}": "Demote to {{ role }}", "Resend invite": "Resend invite", "Revoke invite": "Revoke invite", "Activate user": "Activate user", From b458bb3af96759812e43087318b6c453d2eff8bd Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 6 Apr 2024 21:43:15 -0400 Subject: [PATCH 004/129] Refactor required route role --- .../server/api/webhookSubscriptions.ts | 9 ++++---- server/middlewares/authentication.ts | 21 +++++++------------ server/routes/api/apiKeys/apiKeys.ts | 7 ++++--- .../authenticationProviders.ts | 7 ++++--- server/routes/api/documents/documents.ts | 10 ++++----- .../api/fileOperations/fileOperations.ts | 11 +++++----- .../routes/api/integrations/integrations.ts | 6 +++--- server/routes/api/users/users.ts | 6 +++--- 8 files changed, 37 insertions(+), 40 deletions(-) diff --git a/plugins/webhooks/server/api/webhookSubscriptions.ts b/plugins/webhooks/server/api/webhookSubscriptions.ts index 4c5337a0c438..f8c383259bd6 100644 --- a/plugins/webhooks/server/api/webhookSubscriptions.ts +++ b/plugins/webhooks/server/api/webhookSubscriptions.ts @@ -1,6 +1,7 @@ import Router from "koa-router"; import compact from "lodash/compact"; import isEmpty from "lodash/isEmpty"; +import { UserRole } from "@shared/types"; import auth from "@server/middlewares/authentication"; import validate from "@server/middlewares/validate"; import { WebhookSubscription, Event } from "@server/models"; @@ -14,7 +15,7 @@ const router = new Router(); router.post( "webhookSubscriptions.list", - auth({ admin: true }), + auth({ role: UserRole.Admin }), pagination(), async (ctx: APIContext) => { const { user } = ctx.state.auth; @@ -37,7 +38,7 @@ router.post( router.post( "webhookSubscriptions.create", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.WebhookSubscriptionsCreateSchema), async (ctx: APIContext) => { const { user } = ctx.state.auth; @@ -78,7 +79,7 @@ router.post( router.post( "webhookSubscriptions.delete", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.WebhookSubscriptionsDeleteSchema), async (ctx: APIContext) => { const { id } = ctx.input.body; @@ -111,7 +112,7 @@ router.post( router.post( "webhookSubscriptions.update", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.WebhookSubscriptionsUpdateSchema), async (ctx: APIContext) => { const { id, name, url, secret } = ctx.input.body; diff --git a/server/middlewares/authentication.ts b/server/middlewares/authentication.ts index 35fb6e2f2dd1..5e80b8b1ab8b 100644 --- a/server/middlewares/authentication.ts +++ b/server/middlewares/authentication.ts @@ -1,4 +1,7 @@ import { Next } from "koa"; +import capitalize from "lodash/capitalize"; +import { UserRole } from "@shared/types"; +import { UserRoleHelper } from "@shared/utils/UserRoleHelper"; import Logger from "@server/logging/Logger"; import tracer, { addTags, @@ -14,10 +17,8 @@ import { } from "../errors"; type AuthenticationOptions = { - /** An admin user role is required to access the route. */ - admin?: boolean; - /** A member or admin user role is required to access the route. */ - member?: boolean; + /** Role requuired to access the route. */ + role?: UserRole; /** Authentication is parsed, but optional. */ optional?: boolean; }; @@ -110,16 +111,8 @@ export default function auth(options: AuthenticationOptions = {}) { }); } - if (options.admin) { - if (!user.isAdmin) { - throw AuthorizationError("Admin role required"); - } - } - - if (options.member) { - if (user.isViewer) { - throw AuthorizationError("Member role required"); - } + if (options.role && UserRoleHelper.isRoleLower(user.role, options.role)) { + throw AuthorizationError(`${capitalize(options.role)} role required`); } // not awaiting the promises here so that the request is not blocked diff --git a/server/routes/api/apiKeys/apiKeys.ts b/server/routes/api/apiKeys/apiKeys.ts index 970eba562378..33affd791ba1 100644 --- a/server/routes/api/apiKeys/apiKeys.ts +++ b/server/routes/api/apiKeys/apiKeys.ts @@ -1,4 +1,5 @@ import Router from "koa-router"; +import { UserRole } from "@shared/types"; import auth from "@server/middlewares/authentication"; import validate from "@server/middlewares/validate"; import { ApiKey, Event } from "@server/models"; @@ -12,7 +13,7 @@ const router = new Router(); router.post( "apiKeys.create", - auth({ member: true }), + auth({ role: UserRole.Member }), validate(T.APIKeysCreateSchema), async (ctx: APIContext) => { const { name } = ctx.input.body; @@ -43,7 +44,7 @@ router.post( router.post( "apiKeys.list", - auth({ member: true }), + auth({ role: UserRole.Member }), pagination(), async (ctx: APIContext) => { const { user } = ctx.state.auth; @@ -65,7 +66,7 @@ router.post( router.post( "apiKeys.delete", - auth({ member: true }), + auth({ role: UserRole.Member }), validate(T.APIKeysDeleteSchema), async (ctx: APIContext) => { const { id } = ctx.input.body; diff --git a/server/routes/api/authenticationProviders/authenticationProviders.ts b/server/routes/api/authenticationProviders/authenticationProviders.ts index 58f7309a0e69..ca4895c5484f 100644 --- a/server/routes/api/authenticationProviders/authenticationProviders.ts +++ b/server/routes/api/authenticationProviders/authenticationProviders.ts @@ -1,4 +1,5 @@ import Router from "koa-router"; +import { UserRole } from "@shared/types"; import auth from "@server/middlewares/authentication"; import { transaction } from "@server/middlewares/transaction"; import validate from "@server/middlewares/validate"; @@ -16,7 +17,7 @@ const router = new Router(); router.post( "authenticationProviders.info", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.AuthenticationProvidersInfoSchema), async (ctx: APIContext) => { const { id } = ctx.input.body; @@ -34,7 +35,7 @@ router.post( router.post( "authenticationProviders.update", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.AuthenticationProvidersUpdateSchema), transaction(), async (ctx: APIContext) => { @@ -79,7 +80,7 @@ router.post( router.post( "authenticationProviders.list", - auth({ admin: true }), + auth({ role: UserRole.Admin }), async (ctx: APIContext) => { const { user } = ctx.state.auth; authorize(user, "read", user.team); diff --git a/server/routes/api/documents/documents.ts b/server/routes/api/documents/documents.ts index ff0ed4857559..8f4581fb3271 100644 --- a/server/routes/api/documents/documents.ts +++ b/server/routes/api/documents/documents.ts @@ -8,7 +8,7 @@ import escapeRegExp from "lodash/escapeRegExp"; import mime from "mime-types"; import { Op, ScopeOptions, Sequelize, WhereOptions } from "sequelize"; import { v4 as uuidv4 } from "uuid"; -import { StatusFilter, TeamPreference } from "@shared/types"; +import { StatusFilter, TeamPreference, UserRole } from "@shared/types"; import { subtractDate } from "@shared/utils/date"; import slugify from "@shared/utils/slugify"; import documentCreator from "@server/commands/documentCreator"; @@ -203,7 +203,7 @@ router.post( router.post( "documents.archived", - auth({ member: true }), + auth({ role: UserRole.Member }), pagination(), validate(T.DocumentsArchivedSchema), async (ctx: APIContext) => { @@ -247,7 +247,7 @@ router.post( router.post( "documents.deleted", - auth({ member: true }), + auth({ role: UserRole.Member }), pagination(), validate(T.DocumentsDeletedSchema), async (ctx: APIContext) => { @@ -629,7 +629,7 @@ router.post( router.post( "documents.restore", - auth({ member: true }), + auth({ role: UserRole.Member }), validate(T.DocumentsRestoreSchema), async (ctx: APIContext) => { const { id, collectionId, revisionId } = ctx.input.body; @@ -904,7 +904,7 @@ router.post( router.post( "documents.templatize", - auth({ member: true }), + auth({ role: UserRole.Member }), rateLimiter(RateLimiterStrategy.TwentyFivePerMinute), validate(T.DocumentsTemplatizeSchema), transaction(), diff --git a/server/routes/api/fileOperations/fileOperations.ts b/server/routes/api/fileOperations/fileOperations.ts index 215c548bd434..c20f2822fd5d 100644 --- a/server/routes/api/fileOperations/fileOperations.ts +++ b/server/routes/api/fileOperations/fileOperations.ts @@ -1,5 +1,6 @@ import Router from "koa-router"; import { WhereOptions } from "sequelize"; +import { UserRole } from "@shared/types"; import fileOperationDeleter from "@server/commands/fileOperationDeleter"; import { ValidationError } from "@server/errors"; import auth from "@server/middlewares/authentication"; @@ -17,7 +18,7 @@ const router = new Router(); router.post( "fileOperations.info", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.FileOperationsInfoSchema), async (ctx: APIContext) => { const { id } = ctx.input.body; @@ -37,7 +38,7 @@ router.post( router.post( "fileOperations.list", - auth({ admin: true }), + auth({ role: UserRole.Admin }), pagination(), validate(T.FileOperationsListSchema), async (ctx: APIContext) => { @@ -91,20 +92,20 @@ const handleFileOperationsRedirect = async ( router.get( "fileOperations.redirect", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.FileOperationsRedirectSchema), handleFileOperationsRedirect ); router.post( "fileOperations.redirect", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.FileOperationsRedirectSchema), handleFileOperationsRedirect ); router.post( "fileOperations.delete", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.FileOperationsDeleteSchema), transaction(), async (ctx: APIContext) => { diff --git a/server/routes/api/integrations/integrations.ts b/server/routes/api/integrations/integrations.ts index 7c2002456738..1ebc523f2cb9 100644 --- a/server/routes/api/integrations/integrations.ts +++ b/server/routes/api/integrations/integrations.ts @@ -1,6 +1,6 @@ import Router from "koa-router"; import { WhereOptions, Op } from "sequelize"; -import { IntegrationType } from "@shared/types"; +import { IntegrationType, UserRole } from "@shared/types"; import auth from "@server/middlewares/authentication"; import { transaction } from "@server/middlewares/transaction"; import validate from "@server/middlewares/validate"; @@ -68,7 +68,7 @@ router.post( router.post( "integrations.create", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.IntegrationsCreateSchema), async (ctx: APIContext) => { const { type, service, settings } = ctx.input.body; @@ -113,7 +113,7 @@ router.post( router.post( "integrations.update", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.IntegrationsUpdateSchema), async (ctx: APIContext) => { const { id, events, settings } = ctx.input.body; diff --git a/server/routes/api/users/users.ts b/server/routes/api/users/users.ts index 9c1f26686c97..cccb85d7d534 100644 --- a/server/routes/api/users/users.ts +++ b/server/routes/api/users/users.ts @@ -263,7 +263,7 @@ router.post( */ router.post( "users.promote", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.UsersPromoteSchema), transaction(), (ctx: APIContext) => { @@ -286,7 +286,7 @@ router.post( */ router.post( "users.demote", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.UsersDemoteSchema), transaction(), (ctx: APIContext) => { @@ -304,7 +304,7 @@ router.post( router.post( "users.update_role", - auth({ admin: true }), + auth({ role: UserRole.Admin }), validate(T.UsersChangeRoleSchema), transaction(), updateRole From 9b45feb9ee924bd2727eeaa63a83d9f0c07db8c3 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Tue, 9 Apr 2024 20:02:40 -0600 Subject: [PATCH 005/129] Improve user role management on members (#6775) --- app/actions/definitions/users.tsx | 49 +++++++- app/components/UserDialogs.tsx | 70 ++++------- app/menus/UserMenu.tsx | 83 +++---------- app/scenes/Settings/Members.tsx | 2 +- app/stores/UsersStore.ts | 136 ++------------------- server/routes/api/users/users.test.ts | 84 ------------- server/routes/api/users/users.ts | 11 -- shared/i18n/locales/en_US/translation.json | 14 ++- 8 files changed, 104 insertions(+), 345 deletions(-) diff --git a/app/actions/definitions/users.tsx b/app/actions/definitions/users.tsx index 95c4f301f14c..a90c461592e4 100644 --- a/app/actions/definitions/users.tsx +++ b/app/actions/definitions/users.tsx @@ -1,8 +1,13 @@ import { PlusIcon } from "outline-icons"; import * as React from "react"; +import { UserRole } from "@shared/types"; +import { UserRoleHelper } from "@shared/utils/UserRoleHelper"; import stores from "~/stores"; import Invite from "~/scenes/Invite"; -import { UserDeleteDialog } from "~/components/UserDialogs"; +import { + UserChangeRoleDialog, + UserDeleteDialog, +} from "~/components/UserDialogs"; import { createAction } from "~/actions"; import { UserSection } from "~/actions/sections"; @@ -22,6 +27,48 @@ export const inviteUser = createAction({ }, }); +export const updateUserRoleActionFactory = (userId: string, role: UserRole) => + createAction({ + name: ({ t }) => { + const user = stores.users.get(userId); + + return UserRoleHelper.isRoleHigher(role, user!.role) + ? `${t("Promote to {{ role }}", { role })}…` + : `${t("Demote to {{ role }}", { role })}…`; + }, + analyticsName: "Update user role", + section: UserSection, + visible: ({ stores }) => { + const can = stores.policies.abilities(userId); + const user = stores.users.get(userId); + if (!user) { + return false; + } + return UserRoleHelper.isRoleHigher(role, user.role) + ? can.promote + : UserRoleHelper.isRoleLower(role, user.role) + ? can.demote + : false; + }, + perform: ({ t }) => { + const user = stores.users.get(userId); + if (!user) { + return; + } + + stores.dialogs.openModal({ + title: t("Update role"), + content: ( + + ), + }); + }, + }); + export const deleteUserActionFactory = (userId: string) => createAction({ name: ({ t }) => `${t("Delete user")}…`, diff --git a/app/components/UserDialogs.tsx b/app/components/UserDialogs.tsx index e7d6fff2fe2d..74aac725ebb7 100644 --- a/app/components/UserDialogs.tsx +++ b/app/components/UserDialogs.tsx @@ -11,42 +11,41 @@ type Props = { onSubmit: () => void; }; -export function UserChangeToViewerDialog({ user, onSubmit }: Props) { +export function UserChangeRoleDialog({ + user, + role, + onSubmit, +}: Props & { + role: UserRole; +}) { const { t } = useTranslation(); const { users } = useStores(); const handleSubmit = async () => { - await users.demote(user, UserRole.Viewer); + await users.updateRole(user, role); onSubmit(); }; - return ( - - {t( - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content", - { - userName: user.name, - } - )} - . - - ); -} - -export function UserChangeToMemberDialog({ user, onSubmit }: Props) { - const { t } = useTranslation(); - const { users } = useStores(); - - const handleSubmit = async () => { - await users.demote(user, UserRole.Member); - onSubmit(); - }; + let accessNote; + switch (role) { + case UserRole.Admin: + accessNote = t("Admins can manage the workspace and access billing."); + break; + case UserRole.Member: + accessNote = t("Editors can create, edit, and comment on documents."); + break; + case UserRole.Viewer: + accessNote = t("Viewers can only view and comment on documents."); + break; + } return ( - {t("Are you sure you want to make {{ userName }} a member?", { + {t("Are you sure you want to make {{ userName }} a {{ role }}?", { + role, userName: user.name, - })} + })}{" "} + {accessNote} ); } @@ -76,27 +75,6 @@ export function UserDeleteDialog({ user, onSubmit }: Props) { ); } -export function UserChangeToAdminDialog({ user, onSubmit }: Props) { - const { t } = useTranslation(); - const { users } = useStores(); - - const handleSubmit = async () => { - await users.promote(user); - onSubmit(); - }; - - return ( - - {t( - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.", - { - userName: user.name, - } - )} - - ); -} - export function UserSuspendDialog({ user, onSubmit }: Props) { const { t } = useTranslation(); const { users } = useStores(); diff --git a/app/menus/UserMenu.tsx b/app/menus/UserMenu.tsx index 717c5c795a08..a331ea74cc4a 100644 --- a/app/menus/UserMenu.tsx +++ b/app/menus/UserMenu.tsx @@ -3,19 +3,20 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { useMenuState } from "reakit/Menu"; import { toast } from "sonner"; +import { UserRole } from "@shared/types"; import User from "~/models/User"; import ContextMenu from "~/components/ContextMenu"; import OverflowMenuButton from "~/components/ContextMenu/OverflowMenuButton"; import Template from "~/components/ContextMenu/Template"; import { - UserChangeToAdminDialog, - UserChangeToMemberDialog, - UserChangeToViewerDialog, UserSuspendDialog, UserChangeNameDialog, } from "~/components/UserDialogs"; import { actionToMenuItem } from "~/actions"; -import { deleteUserActionFactory } from "~/actions/definitions/users"; +import { + deleteUserActionFactory, + updateUserRoleActionFactory, +} from "~/actions/definitions/users"; import useActionContext from "~/hooks/useActionContext"; import usePolicy from "~/hooks/usePolicy"; import useStores from "~/hooks/useStores"; @@ -35,54 +36,6 @@ function UserMenu({ user }: Props) { isContextMenu: true, }); - const handlePromote = React.useCallback( - (ev: React.SyntheticEvent) => { - ev.preventDefault(); - dialogs.openModal({ - title: t("Change role to admin"), - content: ( - - ), - }); - }, - [dialogs, t, user] - ); - - const handleMember = React.useCallback( - (ev: React.SyntheticEvent) => { - ev.preventDefault(); - dialogs.openModal({ - title: t("Change role to editor"), - content: ( - - ), - }); - }, - [dialogs, t, user] - ); - - const handleViewer = React.useCallback( - (ev: React.SyntheticEvent) => { - ev.preventDefault(); - dialogs.openModal({ - title: t("Change role to viewer"), - content: ( - - ), - }); - }, - [dialogs, t, user] - ); - const handleChangeName = React.useCallback( (ev: React.SyntheticEvent) => { ev.preventDefault(); @@ -149,22 +102,16 @@ function UserMenu({ user }: Props) { {...menu} items={[ { - type: "button", - title: `${t("Change role to editor")}…`, - onClick: handleMember, - visible: can.demote && user.role !== "member", - }, - { - type: "button", - title: `${t("Change role to viewer")}…`, - onClick: handleViewer, - visible: can.demote && user.role !== "viewer", - }, - { - type: "button", - title: `${t("Change role to admin")}…`, - onClick: handlePromote, - visible: can.promote && user.role !== "admin", + type: "submenu", + title: t("Change role"), + visible: can.demote || can.promote, + items: [UserRole.Admin, UserRole.Member, UserRole.Viewer].map( + (role) => + actionToMenuItem( + updateUserRoleActionFactory(user.id, role), + context + ) + ), }, { type: "button", diff --git a/app/scenes/Settings/Members.tsx b/app/scenes/Settings/Members.tsx index 01ac6845ff32..c6d3f3f011a0 100644 --- a/app/scenes/Settings/Members.tsx +++ b/app/scenes/Settings/Members.tsx @@ -70,7 +70,7 @@ function Members() { }; void fetchData(); - }, [query, sort, filter, role, page, direction, users, users.counts.all]); + }, [query, sort, filter, role, page, direction, users]); React.useEffect(() => { let filtered = users.orderedData; diff --git a/app/stores/UsersStore.ts b/app/stores/UsersStore.ts index 13a31843ec19..497ec380596a 100644 --- a/app/stores/UsersStore.ts +++ b/app/stores/UsersStore.ts @@ -4,22 +4,13 @@ import deburr from "lodash/deburr"; import differenceWith from "lodash/differenceWith"; import filter from "lodash/filter"; import orderBy from "lodash/orderBy"; -import { observable, computed, action, runInAction } from "mobx"; -import { type JSONObject, UserRole } from "@shared/types"; +import { computed, action, runInAction } from "mobx"; +import { UserRole } from "@shared/types"; import User from "~/models/User"; import { client } from "~/utils/ApiClient"; import RootStore from "./RootStore"; import Store, { RPCAction } from "./base/Store"; -type UserCounts = { - active: number; - admins: number; - all: number; - invited: number; - suspended: number; - viewers: number; -}; - export default class UsersStore extends Store { actions = [ RPCAction.Info, @@ -30,16 +21,6 @@ export default class UsersStore extends Store { RPCAction.Count, ]; - @observable - counts: UserCounts = { - active: 0, - admins: 0, - all: 0, - invited: 0, - suspended: 0, - viewers: 0, - }; - constructor(rootStore: RootStore) { super(rootStore, User); } @@ -98,47 +79,18 @@ export default class UsersStore extends Store { } @action - promote = async (user: User) => { - try { - this.updateCounts(UserRole.Admin, user.role); - await this.actionOnUser("promote", user); - } catch (_e) { - this.updateCounts(user.role, UserRole.Admin); - } - }; - - @action - demote = async (user: User, to: UserRole) => { - try { - this.updateCounts(to, user.role); - await this.actionOnUser("demote", user, to); - } catch (_e) { - this.updateCounts(user.role, to); - } + updateRole = async (user: User, role: UserRole) => { + await this.actionOnUser("update_role", user, role); }; @action suspend = async (user: User) => { - try { - this.counts.suspended += 1; - this.counts.active -= 1; - await this.actionOnUser("suspend", user); - } catch (_e) { - this.counts.suspended -= 1; - this.counts.active += 1; - } + await this.actionOnUser("suspend", user); }; @action activate = async (user: User) => { - try { - this.counts.suspended -= 1; - this.counts.active += 1; - await this.actionOnUser("activate", user); - } catch (_e) { - this.counts.suspended += 1; - this.counts.active -= 1; - } + await this.actionOnUser("activate", user); }; @action @@ -155,8 +107,6 @@ export default class UsersStore extends Store { invariant(res?.data, "Data should be available"); runInAction(`invite`, () => { res.data.users.forEach(this.add); - this.counts.invited += res.data.sent.length; - this.counts.all += res.data.sent.length; }); return res.data; }; @@ -167,20 +117,6 @@ export default class UsersStore extends Store { id: user.id, }); - @action - fetchCounts = async ( - teamId: string - ): Promise<{ - counts: UserCounts; - }> => { - const res = await client.post(`/≈`, { - teamId, - }); - invariant(res?.data, "Data should be available"); - this.counts = res.data.counts; - return res.data; - }; - @action fetchDocumentUsers = async (params: { id: string; @@ -200,62 +136,6 @@ export default class UsersStore extends Store { } }; - @action - async delete(user: User, options: JSONObject = {}) { - await super.delete(user, options); - - if (!user.isSuspended && user.lastActiveAt) { - this.counts.active -= 1; - } - - if (user.isInvited) { - this.counts.invited -= 1; - } - - if (user.isAdmin) { - this.counts.admins -= 1; - } - - if (user.isSuspended) { - this.counts.suspended -= 1; - } - - if (user.isViewer) { - this.counts.viewers -= 1; - } - - this.counts.all -= 1; - } - - @action - updateCounts = (to: UserRole, from: UserRole) => { - if (to === UserRole.Admin) { - this.counts.admins += 1; - - if (from === UserRole.Viewer) { - this.counts.viewers -= 1; - } - } - - if (to === UserRole.Viewer) { - this.counts.viewers += 1; - - if (from === UserRole.Admin) { - this.counts.admins -= 1; - } - } - - if (to === UserRole.Member) { - if (from === UserRole.Viewer) { - this.counts.viewers -= 1; - } - - if (from === UserRole.Admin) { - this.counts.admins -= 1; - } - } - }; - notInDocument = (documentId: string, query = "") => { const document = this.rootStore.documents.get(documentId); const teamMembers = this.activeOrInvited; @@ -318,10 +198,10 @@ export default class UsersStore extends Store { return queriedUsers(users, query); }; - actionOnUser = async (action: string, user: User, to?: UserRole) => { + actionOnUser = async (action: string, user: User, role?: UserRole) => { const res = await client.post(`/users.${action}`, { id: user.id, - to, + role, }); invariant(res?.data, "Data should be available"); runInAction(`UsersStore#${action}`, () => { diff --git a/server/routes/api/users/users.test.ts b/server/routes/api/users/users.test.ts index f7f211782db1..ac36f4fa8406 100644 --- a/server/routes/api/users/users.test.ts +++ b/server/routes/api/users/users.test.ts @@ -781,87 +781,3 @@ describe("#users.activate", () => { expect(body).toMatchSnapshot(); }); }); - -describe("#users.count", () => { - it("should count active users", async () => { - const team = await buildTeam(); - const user = await buildUser({ teamId: team.id }); - const res = await server.post("/api/users.count", { - body: { - token: user.getJwtToken(), - }, - }); - const body = await res.json(); - expect(res.status).toEqual(200); - expect(body.data.counts.all).toEqual(1); - expect(body.data.counts.admins).toEqual(0); - expect(body.data.counts.invited).toEqual(0); - expect(body.data.counts.suspended).toEqual(0); - expect(body.data.counts.active).toEqual(1); - }); - - it("should count admin users", async () => { - const team = await buildTeam(); - const user = await buildAdmin({ - teamId: team.id, - }); - const res = await server.post("/api/users.count", { - body: { - token: user.getJwtToken(), - }, - }); - const body = await res.json(); - expect(res.status).toEqual(200); - expect(body.data.counts.all).toEqual(1); - expect(body.data.counts.admins).toEqual(1); - expect(body.data.counts.invited).toEqual(0); - expect(body.data.counts.suspended).toEqual(0); - expect(body.data.counts.active).toEqual(1); - }); - - it("should count suspended users", async () => { - const team = await buildTeam(); - const user = await buildUser({ teamId: team.id }); - await buildUser({ - teamId: team.id, - suspendedAt: new Date(), - }); - const res = await server.post("/api/users.count", { - body: { - token: user.getJwtToken(), - }, - }); - const body = await res.json(); - expect(res.status).toEqual(200); - expect(body.data.counts.all).toEqual(2); - expect(body.data.counts.admins).toEqual(0); - expect(body.data.counts.invited).toEqual(0); - expect(body.data.counts.suspended).toEqual(1); - expect(body.data.counts.active).toEqual(1); - }); - - it("should count invited users", async () => { - const team = await buildTeam(); - const user = await buildUser({ - teamId: team.id, - lastActiveAt: null, - }); - const res = await server.post("/api/users.count", { - body: { - token: user.getJwtToken(), - }, - }); - const body = await res.json(); - expect(res.status).toEqual(200); - expect(body.data.counts.all).toEqual(1); - expect(body.data.counts.admins).toEqual(0); - expect(body.data.counts.invited).toEqual(1); - expect(body.data.counts.suspended).toEqual(0); - expect(body.data.counts.active).toEqual(0); - }); - - it("should require authentication", async () => { - const res = await server.post("/api/users.count"); - expect(res.status).toEqual(401); - }); -}); diff --git a/server/routes/api/users/users.ts b/server/routes/api/users/users.ts index cccb85d7d534..dbff1ce3c7c9 100644 --- a/server/routes/api/users/users.ts +++ b/server/routes/api/users/users.ts @@ -168,17 +168,6 @@ router.post( } ); -router.post("users.count", auth(), async (ctx: APIContext) => { - const { user } = ctx.state.auth; - const counts = await User.getCounts(user.teamId); - - ctx.body = { - data: { - counts, - }, - }; -}); - router.post( "users.info", auth(), diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index b7d87d5eed4e..cd0fd8e8cfdc 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -103,6 +103,9 @@ "Create a workspace": "Create a workspace", "Invite people": "Invite people", "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Delete user", "Collection": "Collection", "Debug": "Debug", @@ -312,11 +315,12 @@ "No results": "No results", "Previous page": "Previous page", "Next page": "Next page", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content", - "Are you sure you want to make {{ userName }} a member?": "Are you sure you want to make {{ userName }} a member?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "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 suspend {{ userName }}? Suspended users will be prevented from logging in.": "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -453,13 +457,11 @@ "Contents": "Contents", "Headings you add to the document will appear here": "Headings you add to the document will appear here", "Table of contents": "Table of contents", - "Change role to admin": "Change role to admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Change role to viewer", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "User options", + "Change role": "Change role", "Resend invite": "Resend invite", "Revoke invite": "Revoke invite", "Activate user": "Activate user", From fe9a89c060194d161271754819d1fd8f4cfb4310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E9=A2=97=E5=B0=8F=E5=9C=9F=E8=B1=86?= <72010312+potatoone@users.noreply.github.com> Date: Wed, 10 Apr 2024 19:34:02 +0800 Subject: [PATCH 006/129] A sentence that is not properly translated under the member option in Settings (#6785) * Update Members.tsx * Update translation.json --- app/scenes/Settings/Members.tsx | 2 +- shared/i18n/locales/en_US/translation.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scenes/Settings/Members.tsx b/app/scenes/Settings/Members.tsx index c6d3f3f011a0..4dea4e1b569c 100644 --- a/app/scenes/Settings/Members.tsx +++ b/app/scenes/Settings/Members.tsx @@ -186,7 +186,7 @@ function Members() { Everyone that has signed into {{ appName }} is listed here. It’s possible that there are other users who have access through{" "} - {team.signinMethods} but haven’t signed in yet. + {{ signinMethods: team.signinMethods, }}{" "}but haven’t signed in yet. diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index cd0fd8e8cfdc..f35434e37c11 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -858,7 +858,7 @@ "Import pages from a Confluence instance": "Import pages from a Confluence instance", "Enterprise": "Enterprise", "Recent imports": "Recent imports", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", From c1b30b804c46a8676824715160cc061f4399bde2 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Tue, 9 Apr 2024 22:08:38 -0400 Subject: [PATCH 007/129] Add direct link to help docs --- app/actions/definitions/navigation.tsx | 10 ++++++++++ app/menus/AccountMenu.tsx | 4 ++-- shared/i18n/locales/en_US/translation.json | 1 + shared/utils/UrlHelper.ts | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/actions/definitions/navigation.tsx b/app/actions/definitions/navigation.tsx index 45ef5d7283bd..4874074f5593 100644 --- a/app/actions/definitions/navigation.tsx +++ b/app/actions/definitions/navigation.tsx @@ -127,6 +127,15 @@ export const navigateToAccountPreferences = createAction({ perform: () => history.push(settingsPath("preferences")), }); +export const openDocumentation = createAction({ + name: ({ t }) => t("Documentation"), + analyticsName: "Open documentation", + section: NavigationSection, + iconInContextMenu: false, + icon: , + perform: () => window.open(UrlHelper.guide), +}); + export const openAPIDocumentation = createAction({ name: ({ t }) => t("API documentation"), analyticsName: "Open API documentation", @@ -218,6 +227,7 @@ export const rootNavigationActions = [ navigateToArchive, navigateToTrash, downloadApp, + openDocumentation, openAPIDocumentation, openFeedbackUrl, openBugReportUrl, diff --git a/app/menus/AccountMenu.tsx b/app/menus/AccountMenu.tsx index 2608268f1c4d..8ee8b2d1f74d 100644 --- a/app/menus/AccountMenu.tsx +++ b/app/menus/AccountMenu.tsx @@ -9,11 +9,11 @@ import { navigateToAccountPreferences, openKeyboardShortcuts, openChangelog, + openDocumentation, openAPIDocumentation, openBugReportUrl, openFeedbackUrl, logout, - downloadApp, } from "~/actions/definitions/navigation"; import { changeTheme } from "~/actions/definitions/settings"; import usePrevious from "~/hooks/usePrevious"; @@ -43,7 +43,7 @@ const AccountMenu: React.FC = ({ children }: Props) => { const actions = React.useMemo( () => [ openKeyboardShortcuts, - downloadApp, + openDocumentation, openAPIDocumentation, separator(), openChangelog, diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index f35434e37c11..07d94457ca9d 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -79,6 +79,7 @@ "Templates": "Templates", "Notifications": "Notifications", "Preferences": "Preferences", + "Documentation": "Documentation", "API documentation": "API documentation", "Toggle sidebar": "Toggle sidebar", "Send us feedback": "Send us feedback", diff --git a/shared/utils/UrlHelper.ts b/shared/utils/UrlHelper.ts index 69d3cc04d2ad..fea9bdefd9e1 100644 --- a/shared/utils/UrlHelper.ts +++ b/shared/utils/UrlHelper.ts @@ -4,6 +4,7 @@ export class UrlHelper { public static contact = "https://www.getoutline.com/contact"; public static developers = "https://www.getoutline.com/developers"; public static changelog = "https://www.getoutline.com/changelog"; + public static guide = "https://docs.getoutline.com/s/guide"; public static SLUG_URL_REGEX = /^(?:[0-9a-zA-Z-_~]*-)?([a-zA-Z0-9]{10,15})$/; public static SHARE_URL_SLUG_REGEX = /^[0-9a-z-]+$/; From d883ba347b61b38147fe17d1c11dfc74c2b59f5b Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Wed, 10 Apr 2024 07:41:02 -0400 Subject: [PATCH 008/129] lint --- app/scenes/Settings/Members.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scenes/Settings/Members.tsx b/app/scenes/Settings/Members.tsx index 4dea4e1b569c..53b22ecafbaf 100644 --- a/app/scenes/Settings/Members.tsx +++ b/app/scenes/Settings/Members.tsx @@ -186,7 +186,7 @@ function Members() { Everyone that has signed into {{ appName }} is listed here. It’s possible that there are other users who have access through{" "} - {{ signinMethods: team.signinMethods, }}{" "}but haven’t signed in yet. + {{ signinMethods: team.signinMethods }} but haven’t signed in yet. From 9c179fdd3085297e81bb453c69351bc2a8fb2bdf Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Wed, 10 Apr 2024 23:06:30 -0400 Subject: [PATCH 009/129] fix: Editor displayed as member in role menu --- app/actions/definitions/users.tsx | 30 ++++++++++++------------------ app/menus/UserMenu.tsx | 2 +- shared/utils/UserRoleHelper.ts | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/app/actions/definitions/users.tsx b/app/actions/definitions/users.tsx index a90c461592e4..c36182a54472 100644 --- a/app/actions/definitions/users.tsx +++ b/app/actions/definitions/users.tsx @@ -3,6 +3,7 @@ import * as React from "react"; import { UserRole } from "@shared/types"; import { UserRoleHelper } from "@shared/utils/UserRoleHelper"; import stores from "~/stores"; +import User from "~/models/User"; import Invite from "~/scenes/Invite"; import { UserChangeRoleDialog, @@ -27,23 +28,21 @@ export const inviteUser = createAction({ }, }); -export const updateUserRoleActionFactory = (userId: string, role: UserRole) => +export const updateUserRoleActionFactory = (user: User, role: UserRole) => createAction({ - name: ({ t }) => { - const user = stores.users.get(userId); - - return UserRoleHelper.isRoleHigher(role, user!.role) - ? `${t("Promote to {{ role }}", { role })}…` - : `${t("Demote to {{ role }}", { role })}…`; - }, + name: ({ t }) => + UserRoleHelper.isRoleHigher(role, user!.role) + ? `${t("Promote to {{ role }}", { + role: UserRoleHelper.displayName(role, t), + })}…` + : `${t("Demote to {{ role }}", { + role: UserRoleHelper.displayName(role, t), + })}…`, analyticsName: "Update user role", section: UserSection, visible: ({ stores }) => { - const can = stores.policies.abilities(userId); - const user = stores.users.get(userId); - if (!user) { - return false; - } + const can = stores.policies.abilities(user.id); + return UserRoleHelper.isRoleHigher(role, user.role) ? can.promote : UserRoleHelper.isRoleLower(role, user.role) @@ -51,11 +50,6 @@ export const updateUserRoleActionFactory = (userId: string, role: UserRole) => : false; }, perform: ({ t }) => { - const user = stores.users.get(userId); - if (!user) { - return; - } - stores.dialogs.openModal({ title: t("Update role"), content: ( diff --git a/app/menus/UserMenu.tsx b/app/menus/UserMenu.tsx index a331ea74cc4a..8a1026c24e0a 100644 --- a/app/menus/UserMenu.tsx +++ b/app/menus/UserMenu.tsx @@ -108,7 +108,7 @@ function UserMenu({ user }: Props) { items: [UserRole.Admin, UserRole.Member, UserRole.Viewer].map( (role) => actionToMenuItem( - updateUserRoleActionFactory(user.id, role), + updateUserRoleActionFactory(user, role), context ) ), diff --git a/shared/utils/UserRoleHelper.ts b/shared/utils/UserRoleHelper.ts index f70a8df9becc..9787eb7881d7 100644 --- a/shared/utils/UserRoleHelper.ts +++ b/shared/utils/UserRoleHelper.ts @@ -1,3 +1,4 @@ +import { type TFunction } from "i18next"; import { UserRole } from "../types"; interface User { @@ -5,6 +6,26 @@ interface User { } export class UserRoleHelper { + /** + * Get the display name for a role. + * + * @param role The role to get the display name for + * @param t The translation function + * @returns The display name for the role + */ + static displayName(role: UserRole, t: TFunction): string { + switch (role) { + case UserRole.Guest: + return t("Guest"); + case UserRole.Viewer: + return t("Viewer"); + case UserRole.Member: + return t("Editor"); + case UserRole.Admin: + return t("Admin"); + } + } + /** * Check if the first role is higher than the second role. * From 2e427a1e8397b562744c5152516feeec1c8e960a Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Thu, 11 Apr 2024 20:51:56 -0400 Subject: [PATCH 010/129] fix: Menus with accessory in-front of label cannot be navigated with keyboard letters fix: Flash of outline state when focusing menu item with keyboard --- app/components/ContextMenu/MenuItem.tsx | 7 +++---- app/components/ContextMenu/Template.tsx | 4 ++-- app/components/ContextMenu/index.tsx | 6 ++++++ shared/styles/globals.ts | 2 ++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/components/ContextMenu/MenuItem.tsx b/app/components/ContextMenu/MenuItem.tsx index 9fbf7c2bb875..a535fd137bda 100644 --- a/app/components/ContextMenu/MenuItem.tsx +++ b/app/components/ContextMenu/MenuItem.tsx @@ -71,12 +71,11 @@ const MenuItem = ( ])} > {selected !== undefined && ( - <> + {selected ? : } -   - + )} - {icon && {icon}} + {icon && {icon}} {children} ); diff --git a/app/components/ContextMenu/Template.tsx b/app/components/ContextMenu/Template.tsx index 8c79f5b8dd54..fd874ffaa3af 100644 --- a/app/components/ContextMenu/Template.tsx +++ b/app/components/ContextMenu/Template.tsx @@ -126,7 +126,7 @@ function Template({ items, actions, context, ...menu }: Props) { item.type !== "separator" && item.type !== "heading" ) { - item.icon = item.icon || ; + item.icon = item.icon || ; } if (item.type === "route") { @@ -220,7 +220,7 @@ function Title({ }) { return ( - {icon && {icon}} + {icon && {icon}} {title} ); diff --git a/app/components/ContextMenu/index.tsx b/app/components/ContextMenu/index.tsx index 277a420c5c7f..766eb33e225f 100644 --- a/app/components/ContextMenu/index.tsx +++ b/app/components/ContextMenu/index.tsx @@ -223,6 +223,12 @@ export const Position = styled.div` position: absolute; z-index: ${depths.menu}; + &.focus-visible { + transition-delay: 250ms; + transition-property: outline-width; + transition-duration: 0; + } + /* * overrides make mobile-first coding style challenging * so we explicitly define mobile breakpoint here diff --git a/shared/styles/globals.ts b/shared/styles/globals.ts index 60fbafcfc8ba..7fac03c797d9 100644 --- a/shared/styles/globals.ts +++ b/shared/styles/globals.ts @@ -106,10 +106,12 @@ export default createGlobalStyle` .js-focus-visible :focus:not(.focus-visible) { outline: none; + outline-width: 0; } .js-focus-visible .focus-visible { outline-color: ${s("accent")}; outline-offset: -1px; + outline-width: initial; } `; From 5974e5635a55721c2ffb6da94d1f9ff8643c3537 Mon Sep 17 00:00:00 2001 From: Hemachandar <132386067+hmacr@users.noreply.github.com> Date: Fri, 12 Apr 2024 06:23:05 +0530 Subject: [PATCH 011/129] add H3 to editor formatting toolbar (#6791) --- app/editor/menus/formatting.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/editor/menus/formatting.tsx b/app/editor/menus/formatting.tsx index f6aa97f7117f..dcdcb1a257d8 100644 --- a/app/editor/menus/formatting.tsx +++ b/app/editor/menus/formatting.tsx @@ -16,6 +16,7 @@ import { OutdentIcon, IndentIcon, CopyIcon, + Heading3Icon, } from "outline-icons"; import { EditorState } from "prosemirror-state"; import { isInTable } from "prosemirror-tables"; @@ -107,6 +108,14 @@ export default function formattingMenuItems( attrs: { level: 2 }, visible: allowBlocks && !isCode, }, + { + name: "heading", + tooltip: dictionary.subheading, + icon: , + active: isNodeActive(schema.nodes.heading, { level: 3 }), + attrs: { level: 3 }, + visible: allowBlocks && !isCode, + }, { name: "blockquote", tooltip: dictionary.quote, From 65bbf0c45597d45c2dc64734e7571fcf9f5b3b65 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Apr 2024 07:53:45 -0400 Subject: [PATCH 012/129] fix: Mark editor content as unknown language to aid translation/screen readers --- app/components/DocumentMeta.tsx | 8 +++++++- app/components/Sidebar/components/EditableTitle.tsx | 1 + app/editor/index.tsx | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/components/DocumentMeta.tsx b/app/components/DocumentMeta.tsx index f6e9f7fbe8aa..ee347f3a683e 100644 --- a/app/components/DocumentMeta.tsx +++ b/app/components/DocumentMeta.tsx @@ -171,7 +171,13 @@ const DocumentMeta: React.FC = ({ }; return ( - + {to ? ( {content} diff --git a/app/components/Sidebar/components/EditableTitle.tsx b/app/components/Sidebar/components/EditableTitle.tsx index dc05bdda88a0..8a35a0c481e8 100644 --- a/app/components/Sidebar/components/EditableTitle.tsx +++ b/app/components/Sidebar/components/EditableTitle.tsx @@ -96,6 +96,7 @@ function EditableTitle( {this.view && ( Date: Fri, 12 Apr 2024 06:10:09 -0700 Subject: [PATCH 013/129] chore(deps): bump react-avatar-editor from 13.0.0 to 13.0.2 (#6780) Bumps [react-avatar-editor](https://github.com/mosch/react-avatar-editor) from 13.0.0 to 13.0.2. - [Release notes](https://github.com/mosch/react-avatar-editor/releases) - [Commits](https://github.com/mosch/react-avatar-editor/compare/v13.0.0...v13.0.2) --- updated-dependencies: - dependency-name: react-avatar-editor dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 19b2c77e216a..257a05076e33 100644 --- a/package.json +++ b/package.json @@ -181,7 +181,7 @@ "randomstring": "1.3.0", "rate-limiter-flexible": "^2.4.2", "react": "^17.0.2", - "react-avatar-editor": "^13.0.0", + "react-avatar-editor": "^13.0.2", "react-color": "^2.17.3", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", diff --git a/yarn.lock b/yarn.lock index 66843ccbe38b..40bdb81ebc3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11415,10 +11415,10 @@ raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" -react-avatar-editor@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/react-avatar-editor/-/react-avatar-editor-13.0.0.tgz#55013625ee9ae715c1fe2dc553b8079994d8a5f2" - integrity "sha1-VQE2Je6a5xXB/i3FU7gHmZTYpfI= sha512-0xw63MbRRQdDy7YI1IXU9+7tTFxYEFLV8CABvryYOGjZmXRTH2/UA0mafe57ns62uaEFX181kA4XlGlxCaeXKA==" +react-avatar-editor@^13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/react-avatar-editor/-/react-avatar-editor-13.0.2.tgz#7ed5a1fd7a9e7bd4b320a3a65df32d3d0e21eb10" + integrity sha512-a4ajbi7lwDh98kgEtSEeKMu0vs0CHTczkq4Xcxr1EiwMFH1GlgHCEtwGU8q/H5W8SeLnH4KPK8LUjEEaZXklxQ== dependencies: "@babel/plugin-transform-runtime" "^7.12.1" "@babel/runtime" "^7.12.5" From 0b99a88cd7e4f5f649a100b39f73e952e37f917d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 06:10:25 -0700 Subject: [PATCH 014/129] chore(deps): bump semver from 5.7.1 to 7.6.0 (#6769) Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 7.6.0. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v7.6.0) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 40bdb81ebc3a..d9b25506e3df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12175,26 +12175,26 @@ selderee@^0.11.0: parseley "^0.12.0" semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ= sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.0, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity "sha1-SDmG7E7TjhxsSMNIlKkYLb/2im4= sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" semver@~7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity "sha1-XzyjV2HkfgWyBsba/yz4FPAxa44= sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== sequelize-cli@^6.6.1: version "6.6.1" From 581944e75474e53ac9aeb4be2ef62a572f65ff93 Mon Sep 17 00:00:00 2001 From: Hemachandar <132386067+hmacr@users.noreply.github.com> Date: Sat, 13 Apr 2024 06:17:59 +0530 Subject: [PATCH 015/129] feat: duplicate a document as draft (#6782) * feat: duplicate a document as draft * review * Default `publish` toggle to match current document Ensures duplicating a draft does not publish it. --------- Co-authored-by: Tom Moor --- app/components/DuplicateDialog.tsx | 38 +++++++++++++++++----- app/models/Document.ts | 7 ++-- app/stores/DocumentsStore.ts | 1 + server/commands/documentDuplicator.test.ts | 27 +++++++++++++++ shared/i18n/locales/en_US/translation.json | 1 + 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/app/components/DuplicateDialog.tsx b/app/components/DuplicateDialog.tsx index 2a6992ad69c3..95785ec4430e 100644 --- a/app/components/DuplicateDialog.tsx +++ b/app/components/DuplicateDialog.tsx @@ -19,9 +19,17 @@ function DuplicateDialog({ document, onSubmit }: Props) { const defaultTitle = t(`Copy of {{ documentName }}`, { documentName: document.title, }); + const [publish, setPublish] = React.useState(!!document.publishedAt); const [recursive, setRecursive] = React.useState(true); const [title, setTitle] = React.useState(defaultTitle); + const handlePublishChange = React.useCallback( + (ev: React.ChangeEvent) => { + setPublish(ev.target.checked); + }, + [] + ); + const handleRecursiveChange = React.useCallback( (ev: React.ChangeEvent) => { setRecursive(ev.target.checked); @@ -38,6 +46,7 @@ function DuplicateDialog({ document, onSubmit }: Props) { const handleSubmit = async () => { const result = await document.duplicate({ + publish, recursive, title, }); @@ -56,15 +65,26 @@ function DuplicateDialog({ document, onSubmit }: Props) { defaultValue={defaultTitle} /> {document.publishedAt && !document.isTemplate && ( - - - + <> + + + + + + + )} ); diff --git a/app/models/Document.ts b/app/models/Document.ts index c2b465ba728c..048a50a27161 100644 --- a/app/models/Document.ts +++ b/app/models/Document.ts @@ -509,8 +509,11 @@ export default class Document extends ParanoidModel { move = (collectionId: string, parentDocumentId?: string | undefined) => this.store.move(this.id, collectionId, parentDocumentId); - duplicate = (options?: { title?: string; recursive?: boolean }) => - this.store.duplicate(this, options); + duplicate = (options?: { + title?: string; + publish?: boolean; + recursive?: boolean; + }) => this.store.duplicate(this, options); @computed get pinned(): boolean { diff --git a/app/stores/DocumentsStore.ts b/app/stores/DocumentsStore.ts index 0391b824b0c4..6b7a52881023 100644 --- a/app/stores/DocumentsStore.ts +++ b/app/stores/DocumentsStore.ts @@ -567,6 +567,7 @@ export default class DocumentsStore extends Store { document: Document, options?: { title?: string; + publish?: boolean; recursive?: boolean; } ): Promise => { diff --git a/server/commands/documentDuplicator.test.ts b/server/commands/documentDuplicator.test.ts index 4c06e1d9032a..4816c7f82042 100644 --- a/server/commands/documentDuplicator.test.ts +++ b/server/commands/documentDuplicator.test.ts @@ -26,6 +26,7 @@ describe("documentDuplicator", () => { expect(response[0].title).toEqual(original.title); expect(response[0].text).toEqual(original.text); expect(response[0].emoji).toEqual(original.emoji); + expect(response[0].publishedAt).toBeInstanceOf(Date); }); it("should duplicate document with title override", async () => { @@ -51,6 +52,7 @@ describe("documentDuplicator", () => { expect(response[0].title).toEqual("New title"); expect(response[0].text).toEqual(original.text); expect(response[0].emoji).toEqual(original.emoji); + expect(response[0].publishedAt).toBeInstanceOf(Date); }); it("should duplicate child documents with recursive=true", async () => { @@ -81,4 +83,29 @@ describe("documentDuplicator", () => { expect(response).toHaveLength(2); }); + + it("should duplicate existing document as draft", async () => { + const user = await buildUser(); + const original = await buildDocument({ + userId: user.id, + teamId: user.teamId, + }); + + const response = await sequelize.transaction((transaction) => + documentDuplicator({ + document: original, + collection: original.collection, + transaction, + publish: false, + user, + ip, + }) + ); + + expect(response).toHaveLength(1); + expect(response[0].title).toEqual(original.title); + expect(response[0].text).toEqual(original.text); + expect(response[0].emoji).toEqual(original.emoji); + expect(response[0].publishedAt).toBeNull(); + }); }); diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index 07d94457ca9d..3c80f20f342b 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -197,6 +197,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Remove", From 1ee82e780ecabf22d0941c40c162d3f7a18ce405 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Fri, 12 Apr 2024 09:12:34 -0400 Subject: [PATCH 016/129] Update subheader on trash --- app/scenes/Trash.tsx | 2 +- shared/i18n/locales/en_US/translation.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/scenes/Trash.tsx b/app/scenes/Trash.tsx index c3b0ce8e09ae..ee659372e116 100644 --- a/app/scenes/Trash.tsx +++ b/app/scenes/Trash.tsx @@ -18,7 +18,7 @@ function Trash() { {t("Documents")}} + heading={{t("Recently deleted")}} empty={{t("Trash is empty at the moment.")}} showCollection showTemplate diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index 3c80f20f342b..fd1d23a2bbbc 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -948,6 +948,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Trash is empty at the moment.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", From 8490f5d558f37e4755746a27dadf81d0bf02748d Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 13 Apr 2024 07:01:15 -0600 Subject: [PATCH 017/129] Add security preference for workspace creation in cloud (#6801) --- app/models/Team.ts | 4 ++++ app/scenes/Settings/Security.tsx | 14 ++++++++++++++ .../20240413042634-member-team-create.js | 15 +++++++++++++++ server/models/Team.ts | 4 ++++ server/policies/team.ts | 7 ++++--- server/presenters/team.ts | 1 + server/routes/api/teams/schema.ts | 2 ++ shared/i18n/locales/en_US/translation.json | 2 ++ 8 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 server/migrations/20240413042634-member-team-create.js diff --git a/app/models/Team.ts b/app/models/Team.ts index 436fcbe2f3f9..529a2ebf0801 100644 --- a/app/models/Team.ts +++ b/app/models/Team.ts @@ -44,6 +44,10 @@ class Team extends Model { @observable memberCollectionCreate: boolean; + @Field + @observable + memberTeamCreate: boolean; + @Field @observable guestSignin: boolean; diff --git a/app/scenes/Settings/Security.tsx b/app/scenes/Settings/Security.tsx index d584d4463ce5..60715cc1c964 100644 --- a/app/scenes/Settings/Security.tsx +++ b/app/scenes/Settings/Security.tsx @@ -34,6 +34,7 @@ function Security() { guestSignin: team.guestSignin, defaultUserRole: team.defaultUserRole, memberCollectionCreate: team.memberCollectionCreate, + memberTeamCreate: team.memberTeamCreate, inviteRequired: team.inviteRequired, }); @@ -300,6 +301,19 @@ function Security() { onChange={handleChange} /> + {isCloudHosted && ( + + + + )} ); } diff --git a/server/migrations/20240413042634-member-team-create.js b/server/migrations/20240413042634-member-team-create.js new file mode 100644 index 000000000000..ae5844d9c9ac --- /dev/null +++ b/server/migrations/20240413042634-member-team-create.js @@ -0,0 +1,15 @@ +"use strict"; + +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.addColumn("teams", "memberTeamCreate", { + type: Sequelize.BOOLEAN, + defaultValue: true, + allowNull: false, + }); + }, + + down: async (queryInterface) => { + await queryInterface.removeColumn("teams", "memberTeamCreate"); + }, +}; diff --git a/server/models/Team.ts b/server/models/Team.ts index c3d37e340b41..04659f6466ce 100644 --- a/server/models/Team.ts +++ b/server/models/Team.ts @@ -152,6 +152,10 @@ class Team extends ParanoidModel< @Column memberCollectionCreate: boolean; + @Default(true) + @Column + memberTeamCreate: boolean; + @Default(UserRole.Member) @IsIn([[UserRole.Viewer, UserRole.Member]]) @Column(DataType.STRING) diff --git a/server/policies/team.ts b/server/policies/team.ts index 9e50f3bb04b9..fb9593d601c9 100644 --- a/server/policies/team.ts +++ b/server/policies/team.ts @@ -1,6 +1,6 @@ import { Team, User } from "@server/models"; import { allow } from "./cancan"; -import { and, isCloudHosted, isTeamAdmin, isTeamModel } from "./utils"; +import { and, isCloudHosted, isTeamAdmin, isTeamModel, or } from "./utils"; allow(User, "read", Team, isTeamModel); @@ -13,12 +13,13 @@ allow(User, "share", Team, (actor, team) => ) ); -allow(User, "createTeam", Team, (actor) => +allow(User, "createTeam", Team, (actor, team) => and( // isCloudHosted(), !actor.isGuest, - !actor.isViewer + !actor.isViewer, + or(actor.isAdmin, !!team?.memberTeamCreate) ) ); diff --git a/server/presenters/team.ts b/server/presenters/team.ts index e9fa4e6406ad..f756968e09f4 100644 --- a/server/presenters/team.ts +++ b/server/presenters/team.ts @@ -7,6 +7,7 @@ export default function presentTeam(team: Team) { avatarUrl: team.avatarUrl, sharing: team.sharing, memberCollectionCreate: team.memberCollectionCreate, + memberTeamCreate: team.memberTeamCreate, defaultCollectionId: team.defaultCollectionId, documentEmbeds: team.documentEmbeds, guestSignin: team.emailSigninEnabled, diff --git a/server/routes/api/teams/schema.ts b/server/routes/api/teams/schema.ts index 368f3b735c93..cdc7ebef0a12 100644 --- a/server/routes/api/teams/schema.ts +++ b/server/routes/api/teams/schema.ts @@ -18,6 +18,8 @@ export const TeamsUpdateSchema = BaseSchema.extend({ documentEmbeds: z.boolean().optional(), /** Whether team members are able to create new collections */ memberCollectionCreate: z.boolean().optional(), + /** Whether team members are able to create new workspaces */ + memberTeamCreate: z.boolean().optional(), /** The default landing collection for the team */ defaultCollectionId: z.string().uuid().nullish(), /** The default user role */ diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index fd1d23a2bbbc..a5a169ccdfa6 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -930,6 +930,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links to supported services are shown as rich embeds within your documents", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", From 054bddb666b8aebb7aaaf039e5fef974c4c11286 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 13 Apr 2024 07:01:26 -0600 Subject: [PATCH 018/129] fix: Improved phrase matching in search (#6800) * fix: Improved phrase matching in search * test --- app/components/DocumentListItem.tsx | 5 +- server/models/helpers/SearchHelper.test.ts | 22 +++++ server/models/helpers/SearchHelper.ts | 105 +++++++++++++++------ 3 files changed, 99 insertions(+), 33 deletions(-) diff --git a/app/components/DocumentListItem.tsx b/app/components/DocumentListItem.tsx index 5244a46a3b9d..999f28cb572d 100644 --- a/app/components/DocumentListItem.tsx +++ b/app/components/DocumentListItem.tsx @@ -37,9 +37,8 @@ type Props = { const SEARCH_RESULT_REGEX = /]*>(.*?)<\/b>/gi; function replaceResultMarks(tag: string) { - // don't use SEARCH_RESULT_REGEX here as it causes - // an infinite loop to trigger a regex inside it's own callback - return tag.replace(/]*>(.*?)<\/b>/gi, "$1"); + // don't use SEARCH_RESULT_REGEX directly here as it causes an infinite loop + return tag.replace(new RegExp(SEARCH_RESULT_REGEX.source), "$1"); } function DocumentListItem( diff --git a/server/models/helpers/SearchHelper.test.ts b/server/models/helpers/SearchHelper.test.ts index ac9067d83644..4976fdeed288 100644 --- a/server/models/helpers/SearchHelper.test.ts +++ b/server/models/helpers/SearchHelper.test.ts @@ -464,6 +464,28 @@ describe("SearchHelper", () => { ); expect(totalCount).toBe(0); }); + + test("should find extact phrases", async () => { + const team = await buildTeam(); + const user = await buildUser({ teamId: team.id }); + const collection = await buildCollection({ + teamId: team.id, + userId: user.id, + }); + const document = await buildDocument({ + teamId: team.id, + userId: user.id, + collectionId: collection.id, + text: "test number 1", + }); + document.title = "change"; + await document.save(); + const { totalCount } = await SearchHelper.searchForUser( + user, + `"test number"` + ); + expect(totalCount).toBe(1); + }); }); describe("#searchTitlesForUser", () => { diff --git a/server/models/helpers/SearchHelper.ts b/server/models/helpers/SearchHelper.ts index 8d47d1581625..f979a043a9cb 100644 --- a/server/models/helpers/SearchHelper.ts +++ b/server/models/helpers/SearchHelper.ts @@ -1,5 +1,6 @@ import removeMarkdown from "@tommoor/remove-markdown"; import invariant from "invariant"; +import escapeRegExp from "lodash/escapeRegExp"; import find from "lodash/find"; import map from "lodash/map"; import queryParser from "pg-tsquery"; @@ -72,7 +73,7 @@ export default class SearchHelper { offset = 0, } = options; - const where = await this.buildWhere(team, { + const where = await this.buildWhere(team, query, { ...options, statusFilter: [...(options.statusFilter || []), StatusFilter.Published], }); @@ -92,14 +93,6 @@ export default class SearchHelper { }); } - where[Op.and].push( - Sequelize.fn( - `"searchVector" @@ to_tsquery`, - "english", - Sequelize.literal(":query") - ) - ); - const queryReplacements = { query: this.webSearchQuery(query), headlineOptions: `MaxFragments=1, MinWords=${snippetMinWords}, MaxWords=${snippetMaxWords}`, @@ -152,7 +145,7 @@ export default class SearchHelper { ], }); - return this.buildResponse(results, documents, count); + return this.buildResponse(query, results, documents, count); } public static async searchTitlesForUser( @@ -161,7 +154,7 @@ export default class SearchHelper { options: SearchOptions = {} ): Promise { const { limit = 15, offset = 0 } = options; - const where = await this.buildWhere(user, options); + const where = await this.buildWhere(user, undefined, options); where[Op.and].push({ title: { @@ -224,15 +217,7 @@ export default class SearchHelper { offset = 0, } = options; - const where = await this.buildWhere(user, options); - - where[Op.and].push( - Sequelize.fn( - `"searchVector" @@ to_tsquery`, - "english", - Sequelize.literal(":query") - ) - ); + const where = await this.buildWhere(user, query, options); const queryReplacements = { query: this.webSearchQuery(query), @@ -307,10 +292,14 @@ export default class SearchHelper { }, }); - return this.buildResponse(results, documents, count); + return this.buildResponse(query, results, documents, count); } - private static async buildWhere(model: User | Team, options: SearchOptions) { + private static async buildWhere( + model: User | Team, + query: string | undefined, + options: SearchOptions + ) { const teamId = model instanceof Team ? model.id : model.teamId; const where: WhereOptions = { teamId, @@ -410,24 +399,80 @@ export default class SearchHelper { }); } + if (query) { + const limitedQuery = this.escapeQuery( + query.slice(0, this.maxQueryLength) + ); + + // Extract quoted queries and add them to the where clause, up to a maximum of 3 total. + const quotedQueries = Array.from( + limitedQuery.matchAll(/"([^"]*)"/g) + ).slice(0, 3); + + for (const match of quotedQueries) { + where[Op.and].push({ + [Op.or]: [ + { + title: { + [Op.iLike]: `%${match[1]}%`, + }, + }, + { + text: { + [Op.iLike]: `%${match[1]}%`, + }, + }, + ], + }); + } + + where[Op.and].push( + Sequelize.fn( + `"searchVector" @@ to_tsquery`, + "english", + Sequelize.literal(":query") + ) + ); + } + return where; } private static buildResponse( + query: string, results: RankedDocument[], documents: Document[], count: number ): SearchResponse { + const quotedQueries = Array.from(query.matchAll(/"([^"]*)"/g)).slice(0, 3); + + // Regex to highlight quoted queries as ts_headline will not do this by default due to stemming. + const quotedRegex = new RegExp( + quotedQueries.map((match) => escapeRegExp(match[1])).join("|"), + "gi" + ); + return { - results: map(results, (result) => ({ - ranking: result.dataValues.searchRanking, - context: removeMarkdown(result.dataValues.searchContext, { + results: map(results, (result) => { + let context = removeMarkdown(result.dataValues.searchContext, { stripHTML: false, - }), - document: find(documents, { - id: result.id, - }) as Document, - })), + }); + + // If there are any quoted queries, highlighting these takes precedence over the default + if (quotedQueries.length) { + context = context + .replace(/<\/?b>/g, "") + .replace(quotedRegex, "$&"); + } + + return { + ranking: result.dataValues.searchRanking, + context, + document: find(documents, { + id: result.id, + }) as Document, + }; + }), totalCount: count, }; } From 90ed6a5366b3ca0d18c389a3e3b7489baf0d8bb9 Mon Sep 17 00:00:00 2001 From: Apoorv Mishra Date: Sat, 13 Apr 2024 18:31:40 +0530 Subject: [PATCH 019/129] Fixes hover preview going out of window bounds (#6776) * fix: hover preview out of bounds * fix: pop * fix: check for both element and data * fix: show loading indicator * fix: width --- app/components/HoverPreview/Components.tsx | 3 +- app/components/HoverPreview/HoverPreview.tsx | 203 ++++++++----------- app/editor/extensions/HoverPreviews.tsx | 36 +++- server/routes/api/urls/schema.ts | 13 +- 4 files changed, 134 insertions(+), 121 deletions(-) diff --git a/app/components/HoverPreview/Components.tsx b/app/components/HoverPreview/Components.tsx index 91d4669a4a9b..8f2b1dffc97d 100644 --- a/app/components/HoverPreview/Components.tsx +++ b/app/components/HoverPreview/Components.tsx @@ -25,8 +25,7 @@ export const Preview = styled(Link)` 0 0 1px 1px rgba(0, 0, 0, 0.05); overflow: hidden; position: absolute; - min-width: 350px; - max-width: 375px; + width: 375px; `; export const Title = styled(Text).attrs({ as: "h2", size: "large" })` diff --git a/app/components/HoverPreview/HoverPreview.tsx b/app/components/HoverPreview/HoverPreview.tsx index 4d96d0fd138e..4d1c6ec0bd3e 100644 --- a/app/components/HoverPreview/HoverPreview.tsx +++ b/app/components/HoverPreview/HoverPreview.tsx @@ -4,16 +4,11 @@ import { Portal } from "react-portal"; import styled from "styled-components"; import { depths } from "@shared/styles"; import { UnfurlResourceType } from "@shared/types"; -import LoadingIndicator from "~/components/LoadingIndicator"; -import env from "~/env"; import useEventListener from "~/hooks/useEventListener"; import useKeyDown from "~/hooks/useKeyDown"; import useMobile from "~/hooks/useMobile"; import useOnClickOutside from "~/hooks/useOnClickOutside"; -import usePrevious from "~/hooks/usePrevious"; -import useRequest from "~/hooks/useRequest"; -import useStores from "~/hooks/useStores"; -import { client } from "~/utils/ApiClient"; +import LoadingIndicator from "../LoadingIndicator"; import { CARD_MARGIN } from "./Components"; import HoverPreviewDocument from "./HoverPreviewDocument"; import HoverPreviewIssue from "./HoverPreviewIssue"; @@ -21,13 +16,17 @@ import HoverPreviewLink from "./HoverPreviewLink"; import HoverPreviewMention from "./HoverPreviewMention"; import HoverPreviewPullRequest from "./HoverPreviewPullRequest"; -const DELAY_CLOSE = 600; +const DELAY_CLOSE = 500; const POINTER_HEIGHT = 22; const POINTER_WIDTH = 22; type Props = { /** The HTML element that is being hovered over, or null if none. */ element: HTMLElement | null; + /** Data to be previewed */ + data: Record | null; + /** Whether the preview data is being loaded */ + dataLoading: boolean; /** A callback on close of the hover preview. */ onClose: () => void; }; @@ -37,12 +36,10 @@ enum Direction { DOWN, } -function HoverPreviewDesktop({ element, onClose }: Props) { - const url = element?.getAttribute("href") || element?.dataset.url; - const previousUrl = usePrevious(url, true); +function HoverPreviewDesktop({ element, data, dataLoading, onClose }: Props) { const [isVisible, setVisible] = React.useState(false); const timerClose = React.useRef>(); - const cardRef = React.useRef(null); + const cardRef = React.useRef(null); const { cardLeft, cardTop, pointerLeft, pointerTop, pointerDir } = useHoverPosition({ cardRef, @@ -68,12 +65,12 @@ function HoverPreviewDesktop({ element, onClose }: Props) { // Open and close the preview when the element changes. React.useEffect(() => { - if (element) { + if (element && data && !dataLoading) { setVisible(true); } else { startCloseTimer(); } - }, [startCloseTimer, element]); + }, [startCloseTimer, element, data, dataLoading]); // Close the preview on Escape, scroll, or click outside. useOnClickOutside(cardRef, closePreview); @@ -101,125 +98,101 @@ function HoverPreviewDesktop({ element, onClose }: Props) { }; }, [element, startCloseTimer, isVisible, stopCloseTimer]); - const displayUrl = url ?? previousUrl; + if (dataLoading) { + return ; + } - if (!isVisible || !displayUrl) { + if (!data) { return null; } return ( - - - {(data) => ( - - {data.type === UnfurlResourceType.Mention ? ( - - ) : data.type === UnfurlResourceType.Document ? ( - - ) : data.type === UnfurlResourceType.Issue ? ( - - ) : data.type === UnfurlResourceType.PR ? ( - - ) : ( - - )} - + {isVisible ? ( + + {data.type === UnfurlResourceType.Mention ? ( + + ) : data.type === UnfurlResourceType.Document ? ( + + ) : data.type === UnfurlResourceType.Issue ? ( + + ) : data.type === UnfurlResourceType.PR ? ( + + ) : ( + - - )} - + )} + + + ) : null} ); } -function DataLoader({ - url, - children, -}: { - url: string; - children: (data: any) => React.ReactNode; -}) { - const { ui } = useStores(); - const { data, request, loading } = useRequest( - React.useCallback( - () => - client.post("/urls.unfurl", { - url: url.startsWith("/") ? env.URL + url : url, - documentId: ui.activeDocumentId, - }), - [url, ui.activeDocumentId] - ) - ); - - React.useEffect(() => { - if (url) { - void request(); - } - }, [url, request]); - - if (loading) { - return ; - } - - if (!data) { - return null; - } - - return <>{children(data)}; -} - -function HoverPreview({ element, ...rest }: Props) { +function HoverPreview({ element, data, dataLoading, ...rest }: Props) { const isMobile = useMobile(); if (isMobile) { return null; } - return ; + return ( + + ); } function useHoverPosition({ diff --git a/app/editor/extensions/HoverPreviews.tsx b/app/editor/extensions/HoverPreviews.tsx index 6ddca9607fa2..c91f7f3ffd9a 100644 --- a/app/editor/extensions/HoverPreviews.tsx +++ b/app/editor/extensions/HoverPreviews.tsx @@ -4,6 +4,8 @@ import { EditorView } from "prosemirror-view"; import * as React from "react"; import Extension from "@shared/editor/lib/Extension"; import HoverPreview from "~/components/HoverPreview"; +import env from "~/env"; +import { client } from "~/utils/ApiClient"; interface HoverPreviewsOptions { /** Delay before the target is considered "hovered" and callback is triggered. */ @@ -13,13 +15,17 @@ interface HoverPreviewsOptions { export default class HoverPreviews extends Extension { state: { activeLinkElement: HTMLElement | null; + data: Record | null; + dataLoading: boolean; } = observable({ activeLinkElement: null, + data: null, + dataLoading: false, }); get defaultOptions(): HoverPreviewsOptions { return { - delay: 500, + delay: 600, }; } @@ -45,8 +51,30 @@ export default class HoverPreviews extends Extension { ); if (isHoverTarget(target, view)) { hoveringTimeout = setTimeout( - action(() => { - this.state.activeLinkElement = target as HTMLElement; + action(async () => { + const element = target as HTMLElement; + + const url = + element?.getAttribute("href") || element?.dataset.url; + const documentId = window.location.pathname + .split("/") + .pop(); + + if (url) { + this.state.dataLoading = true; + try { + const data = await client.post("/urls.unfurl", { + url: url.startsWith("/") ? env.URL + url : url, + documentId, + }); + this.state.activeLinkElement = element; + this.state.data = data; + } catch (err) { + this.state.activeLinkElement = null; + } finally { + this.state.dataLoading = false; + } + } }), this.options.delay ); @@ -72,6 +100,8 @@ export default class HoverPreviews extends Extension { widget = () => ( { this.state.activeLinkElement = null; })} diff --git a/server/routes/api/urls/schema.ts b/server/routes/api/urls/schema.ts index ef2b30266e71..719e6a2efbd3 100644 --- a/server/routes/api/urls/schema.ts +++ b/server/routes/api/urls/schema.ts @@ -1,5 +1,7 @@ import isNil from "lodash/isNil"; +import isUUID from "validator/lib/isUUID"; import { z } from "zod"; +import { UrlHelper } from "@shared/utils/UrlHelper"; import { isUrl } from "@shared/utils/urls"; import { ValidateURL } from "@server/validation"; import { BaseSchema } from "../schema"; @@ -24,7 +26,16 @@ export const UrlsUnfurlSchema = BaseSchema.extend({ }, { message: ValidateURL.message } ), - documentId: z.string().uuid().optional(), + documentId: z + .string() + .optional() + .refine( + (val) => + val ? isUUID(val) || UrlHelper.SLUG_URL_REGEX.test(val) : true, + { + message: "must be uuid or url slug", + } + ), }) .refine( (val) => From 689886797cf6d5c931d76a0cbea0b80bf6aae0a2 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 13 Apr 2024 10:35:47 -0400 Subject: [PATCH 020/129] Add dialog to allow easy login to multiple workspaces in desktop app --- app/actions/definitions/teams.tsx | 24 +++++++- app/menus/OrganizationMenu.tsx | 7 ++- .../components/AuthenticationProvider.tsx | 2 +- app/scenes/Login/components/LoginDialog.tsx | 56 +++++++++++++++++++ app/scenes/Login/index.tsx | 16 ++---- .../Login/{getRedirectUrl.ts => urls.ts} | 17 ++++++ shared/i18n/locales/en_US/translation.json | 5 +- 7 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 app/scenes/Login/components/LoginDialog.tsx rename app/scenes/Login/{getRedirectUrl.ts => urls.ts} (61%) diff --git a/app/actions/definitions/teams.tsx b/app/actions/definitions/teams.tsx index a4662b489761..a9847551d77b 100644 --- a/app/actions/definitions/teams.tsx +++ b/app/actions/definitions/teams.tsx @@ -1,12 +1,14 @@ -import { PlusIcon } from "outline-icons"; +import { ArrowIcon, PlusIcon } from "outline-icons"; import * as React from "react"; import styled from "styled-components"; import { stringToColor } from "@shared/utils/color"; import RootStore from "~/stores/RootStore"; +import { LoginDialog } from "~/scenes/Login/components/LoginDialog"; import TeamNew from "~/scenes/TeamNew"; import TeamLogo from "~/components/TeamLogo"; import { createAction } from "~/actions"; import { ActionContext } from "~/types"; +import Desktop from "~/utils/Desktop"; import { TeamSection } from "../sections"; export const createTeamsList = ({ stores }: { stores: RootStore }) => @@ -66,9 +68,27 @@ export const createTeam = createAction({ }, }); +export const desktopLoginTeam = createAction({ + name: ({ t }) => t("Login to workspace"), + analyticsName: "Login to workspace", + keywords: "change switch workspace organization team", + section: TeamSection, + icon: , + visible: () => Desktop.isElectron(), + perform: ({ t, event, stores }) => { + event?.preventDefault(); + event?.stopPropagation(); + + stores.dialogs.openModal({ + title: t("Login to workspace"), + content: , + }); + }, +}); + const StyledTeamLogo = styled(TeamLogo)` border-radius: 2px; border: 0; `; -export const rootTeamActions = [switchTeam, createTeam]; +export const rootTeamActions = [switchTeam, createTeam, desktopLoginTeam]; diff --git a/app/menus/OrganizationMenu.tsx b/app/menus/OrganizationMenu.tsx index d20e678074c8..b487003ccfd4 100644 --- a/app/menus/OrganizationMenu.tsx +++ b/app/menus/OrganizationMenu.tsx @@ -5,7 +5,11 @@ import { MenuButton, useMenuState } from "reakit/Menu"; import ContextMenu from "~/components/ContextMenu"; import Template from "~/components/ContextMenu/Template"; import { navigateToSettings, logout } from "~/actions/definitions/navigation"; -import { createTeam, createTeamsList } from "~/actions/definitions/teams"; +import { + createTeam, + createTeamsList, + desktopLoginTeam, +} from "~/actions/definitions/teams"; import useActionContext from "~/hooks/useActionContext"; import usePrevious from "~/hooks/usePrevious"; import useStores from "~/hooks/useStores"; @@ -39,6 +43,7 @@ const OrganizationMenu: React.FC = ({ children }: Props) => { () => [ ...createTeamsList(context), createTeam, + desktopLoginTeam, separator(), navigateToSettings, logout, diff --git a/app/scenes/Login/components/AuthenticationProvider.tsx b/app/scenes/Login/components/AuthenticationProvider.tsx index 5d564453dd54..0eede84bd029 100644 --- a/app/scenes/Login/components/AuthenticationProvider.tsx +++ b/app/scenes/Login/components/AuthenticationProvider.tsx @@ -7,7 +7,7 @@ import InputLarge from "~/components/InputLarge"; import PluginIcon from "~/components/PluginIcon"; import { client } from "~/utils/ApiClient"; import Desktop from "~/utils/Desktop"; -import { getRedirectUrl } from "../getRedirectUrl"; +import { getRedirectUrl } from "../urls"; type Props = { id: string; diff --git a/app/scenes/Login/components/LoginDialog.tsx b/app/scenes/Login/components/LoginDialog.tsx new file mode 100644 index 000000000000..c8a5b0a7f938 --- /dev/null +++ b/app/scenes/Login/components/LoginDialog.tsx @@ -0,0 +1,56 @@ +import * as React from "react"; +import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import { toast } from "sonner"; +import styled from "styled-components"; +import { s } from "@shared/styles"; +import ButtonLarge from "~/components/ButtonLarge"; +import Input from "~/components/Input"; +import Text from "~/components/Text"; +import { navigateToSubdomain } from "../urls"; + +type FormData = { + subdomain: string; +}; + +export function LoginDialog() { + const { t } = useTranslation(); + + const handleSubmit = async (data: FormData) => { + try { + await navigateToSubdomain(data.subdomain); + } catch { + toast.error(t("The workspace could not be found")); + } + }; + + const { register, handleSubmit: formHandleSubmit } = useForm({ + mode: "all", + defaultValues: { + subdomain: "", + }, + }); + + return ( +
+ {t("To continue, enter your workspace’s subdomain.")} + + .getoutline.com + + + {t("Continue")} + +
+ ); +} + +const Domain = styled.div` + color: ${s("textSecondary")}; + padding: 0 8px 0 0; +`; diff --git a/app/scenes/Login/index.tsx b/app/scenes/Login/index.tsx index c01ad845ad73..2f486c827911 100644 --- a/app/scenes/Login/index.tsx +++ b/app/scenes/Login/index.tsx @@ -33,7 +33,7 @@ import { detectLanguage } from "~/utils/language"; import AuthenticationProvider from "./components/AuthenticationProvider"; import BackButton from "./components/BackButton"; import Notices from "./components/Notices"; -import { getRedirectUrl } from "./getRedirectUrl"; +import { getRedirectUrl, navigateToSubdomain } from "./urls"; type Props = { children?: (config?: Config) => React.ReactNode; @@ -66,17 +66,7 @@ function Login({ children }: Props) { const handleGoSubdomain = React.useCallback(async (event) => { event.preventDefault(); const data = Object.fromEntries(new FormData(event.target)); - const normalizedSubdomain = data.subdomain - .toString() - .toLowerCase() - .trim() - .replace(/^https?:\/\//, ""); - const host = `https://${normalizedSubdomain}.getoutline.com`; - await Desktop.bridge.addCustomHost(host); - - setTimeout(() => { - window.location.href = host; - }, 500); + await navigateToSubdomain(data.subdomain.toString()); }, []); React.useEffect(() => { @@ -186,6 +176,8 @@ function Login({ children }: Props) { name="subdomain" style={{ textAlign: "right" }} placeholder={t("subdomain")} + pattern="^[a-z\d-]+$" + required > .getoutline.com diff --git a/app/scenes/Login/getRedirectUrl.ts b/app/scenes/Login/urls.ts similarity index 61% rename from app/scenes/Login/getRedirectUrl.ts rename to app/scenes/Login/urls.ts index e5039a956b24..c4d7e33e4f2a 100644 --- a/app/scenes/Login/getRedirectUrl.ts +++ b/app/scenes/Login/urls.ts @@ -8,6 +8,8 @@ import Desktop from "~/utils/Desktop"; * apex (env.URL) for authentication so that the state cookie can be set and read. * We pass the host into the auth URL so that the server can redirect on error * and keep the user on the same page. + * + * @param authUrl The URL to redirect to after authentication */ export function getRedirectUrl(authUrl: string) { const { custom, teamSubdomain, host } = parseDomain(window.location.origin); @@ -23,3 +25,18 @@ export function getRedirectUrl(authUrl: string) { return url.toString(); } + +/** + * Redirect to a subdomain, adding it to the custom hosts list on desktop first. + * + * @param subdomain The subdomain to navigate to + */ +export async function navigateToSubdomain(subdomain: string) { + const normalizedSubdomain = subdomain + .toLowerCase() + .trim() + .replace(/^https?:\/\//, ""); + const host = `https://${normalizedSubdomain}.getoutline.com`; + await Desktop.bridge.addCustomHost(host); + window.location.href = host; +} diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index a5a169ccdfa6..fd7140fd3f5c 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -102,6 +102,7 @@ "Select a workspace": "Select a workspace", "New workspace": "New workspace", "Create a workspace": "Create a workspace", + "Login to workspace": "Login to workspace", "Invite people": "Invite people", "Invite to workspace": "Invite to workspace", "Promote to {{ role }}": "Promote to {{ role }}", @@ -710,6 +711,9 @@ "Continue with Email": "Continue with Email", "Continue with {{ authProviderName }}": "Continue with {{ authProviderName }}", "Back to home": "Back to home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -735,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Check your email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "Back to login", From 765ae7b2980c793d7f88cebb1011da8d50fc8109 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 13 Apr 2024 12:33:07 -0600 Subject: [PATCH 021/129] Add 80+ additional icons from FontAwesome (#6803) * Add 80+ additional icons from FontAwesome * fix: color switch transition, add 6 more icons to fill out grid * Add strict validation for collection icon * fix: Avoid import from app in server --- app/components/Collection/CollectionForm.tsx | 2 +- app/components/DocumentCard.tsx | 2 +- app/components/Flex.tsx | 37 +-- app/components/IconPicker.tsx | 125 +++++---- app/components/Icons/CollectionIcon.tsx | 2 +- app/components/Sharing/OtherAccess.tsx | 2 +- app/components/Sharing/PublicAccess.tsx | 2 +- app/components/Text.ts | 6 +- package.json | 3 + .../api/collections/collections.test.ts | 15 ++ server/routes/api/collections/schema.ts | 25 +- server/validation.ts | 4 - shared/components/Flex.tsx | 38 +++ .../components}/LetterIcon.tsx | 4 +- {app => shared}/components/Squircle.tsx | 0 shared/i18n/locales/en_US/translation.json | 4 +- .../Icons => shared/utils}/IconLibrary.tsx | 250 +++++++++++++++++- yarn.lock | 63 ++--- 18 files changed, 429 insertions(+), 155 deletions(-) create mode 100644 shared/components/Flex.tsx rename {app/components/Icons => shared/components}/LetterIcon.tsx (92%) rename {app => shared}/components/Squircle.tsx (100%) rename {app/components/Icons => shared/utils}/IconLibrary.tsx (59%) diff --git a/app/components/Collection/CollectionForm.tsx b/app/components/Collection/CollectionForm.tsx index 93e16485fba4..8c629b5d54c3 100644 --- a/app/components/Collection/CollectionForm.tsx +++ b/app/components/Collection/CollectionForm.tsx @@ -5,13 +5,13 @@ import { Trans, useTranslation } from "react-i18next"; import styled from "styled-components"; import { randomElement } from "@shared/random"; import { CollectionPermission } from "@shared/types"; +import { IconLibrary } from "@shared/utils/IconLibrary"; import { colorPalette } from "@shared/utils/collections"; import { CollectionValidation } from "@shared/validations"; import Collection from "~/models/Collection"; import Button from "~/components/Button"; import Flex from "~/components/Flex"; import IconPicker from "~/components/IconPicker"; -import { IconLibrary } from "~/components/Icons/IconLibrary"; import Input from "~/components/Input"; import InputSelectPermission from "~/components/InputSelectPermission"; import Switch from "~/components/Switch"; diff --git a/app/components/DocumentCard.tsx b/app/components/DocumentCard.tsx index 6cc2ea83fe21..1875f35f6746 100644 --- a/app/components/DocumentCard.tsx +++ b/app/components/DocumentCard.tsx @@ -7,6 +7,7 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import styled, { useTheme } from "styled-components"; +import Squircle from "@shared/components/Squircle"; import { s, ellipsis } from "@shared/styles"; import Document from "~/models/Document"; import Pin from "~/models/Pin"; @@ -17,7 +18,6 @@ import useStores from "~/hooks/useStores"; import { hover } from "~/styles"; import CollectionIcon from "./Icons/CollectionIcon"; import EmojiIcon from "./Icons/EmojiIcon"; -import Squircle from "./Squircle"; import Text from "./Text"; import Tooltip from "./Tooltip"; diff --git a/app/components/Flex.tsx b/app/components/Flex.tsx index eb3e86e9ae3d..4671600b60c8 100644 --- a/app/components/Flex.tsx +++ b/app/components/Flex.tsx @@ -1,38 +1,3 @@ -import { CSSProperties } from "react"; -import styled from "styled-components"; - -type JustifyValues = CSSProperties["justifyContent"]; - -type AlignValues = CSSProperties["alignItems"]; - -const Flex = styled.div<{ - auto?: boolean; - column?: boolean; - align?: AlignValues; - justify?: JustifyValues; - wrap?: boolean; - shrink?: boolean; - reverse?: boolean; - gap?: number; -}>` - display: flex; - flex: ${({ auto }) => (auto ? "1 1 auto" : "initial")}; - flex-direction: ${({ column, reverse }) => - reverse - ? column - ? "column-reverse" - : "row-reverse" - : column - ? "column" - : "row"}; - align-items: ${({ align }) => align}; - justify-content: ${({ justify }) => justify}; - flex-wrap: ${({ wrap }) => (wrap ? "wrap" : "initial")}; - flex-shrink: ${({ shrink }) => - shrink === true ? 1 : shrink === false ? 0 : "initial"}; - gap: ${({ gap }) => (gap ? `${gap}px` : "initial")}; - min-height: 0; - min-width: 0; -`; +import Flex from "@shared/components/Flex"; export default Flex; diff --git a/app/components/IconPicker.tsx b/app/components/IconPicker.tsx index 4b4d22b7c38e..182f51c4e0d8 100644 --- a/app/components/IconPicker.tsx +++ b/app/components/IconPicker.tsx @@ -3,6 +3,7 @@ import { useTranslation } from "react-i18next"; import { PopoverDisclosure, usePopoverState } from "reakit"; import { MenuItem } from "reakit/Menu"; import styled, { useTheme } from "styled-components"; +import { IconLibrary } from "@shared/utils/IconLibrary"; import { colorPalette } from "@shared/utils/collections"; import Flex from "~/components/Flex"; import NudeButton from "~/components/NudeButton"; @@ -10,7 +11,7 @@ import Text from "~/components/Text"; import useOnClickOutside from "~/hooks/useOnClickOutside"; import lazyWithRetry from "~/utils/lazyWithRetry"; import DelayedMount from "./DelayedMount"; -import { IconLibrary } from "./Icons/IconLibrary"; +import InputSearch from "./InputSearch"; import Popover from "./Popover"; const icons = IconLibrary.mapping; @@ -38,11 +39,12 @@ function IconPicker({ onChange, className, }: Props) { + const [query, setQuery] = React.useState(""); const { t } = useTranslation(); const theme = useTheme(); const popover = usePopoverState({ gutter: 0, - placement: "bottom", + placement: "right", modal: true, }); @@ -51,9 +53,15 @@ function IconPicker({ onOpen?.(); } else { onClose?.(); + setQuery(""); } }, [onOpen, onClose, popover.visible]); + const filteredIcons = IconLibrary.findIcons(query); + const handleFilter = (event: React.ChangeEvent) => { + setQuery(event.target.value.toLowerCase()); + }; + const styles = React.useMemo( () => ({ default: { @@ -92,6 +100,9 @@ function IconPicker({ { capture: true } ); + const iconNames = Object.keys(icons); + const delayPerIcon = 250 / iconNames.length; + return ( <> @@ -112,69 +123,77 @@ function IconPicker({ - - {Object.keys(icons).map((name, index) => ( - onChange(color, name)}> - {(props) => ( - - + + {t("Choose an icon")} + + +
+ {iconNames.map((name, index) => ( + onChange(color, name)}> + {(props) => ( + - {initial} - - - )} - - ))} - - - - {t("Loading")}… - - } - > - onChange(color.hex, icon)} - colors={colorPalette} - triangle="hide" - styles={styles} - /> - - + + {initial} + + + )} + + ))} +
+ + + {t("Loading")}… + + } + > + onChange(color.hex, icon)} + colors={colorPalette} + triangle="hide" + styles={styles} + /> + + +
); } const Icon = styled.svg` - transition: fill 150ms ease-in-out; + transition: color 150ms ease-in-out, fill 150ms ease-in-out; transition-delay: var(--delay); `; -const Colors = styled(Flex)` - padding: 8px; -`; - -const Icons = styled.div` - padding: 8px; -`; - const IconButton = styled(NudeButton)` vertical-align: top; border-radius: 4px; diff --git a/app/components/Icons/CollectionIcon.tsx b/app/components/Icons/CollectionIcon.tsx index 89582f4e2595..2454bc3168b9 100644 --- a/app/components/Icons/CollectionIcon.tsx +++ b/app/components/Icons/CollectionIcon.tsx @@ -2,10 +2,10 @@ import { observer } from "mobx-react"; import { CollectionIcon } from "outline-icons"; import { getLuminance } from "polished"; import * as React from "react"; +import { IconLibrary } from "@shared/utils/IconLibrary"; import Collection from "~/models/Collection"; import useStores from "~/hooks/useStores"; import Logger from "~/utils/Logger"; -import { IconLibrary } from "./IconLibrary"; type Props = { /** The collection to show an icon for */ diff --git a/app/components/Sharing/OtherAccess.tsx b/app/components/Sharing/OtherAccess.tsx index 4a8151a22440..97346b5734e1 100644 --- a/app/components/Sharing/OtherAccess.tsx +++ b/app/components/Sharing/OtherAccess.tsx @@ -3,6 +3,7 @@ import { MoreIcon, QuestionMarkIcon, UserIcon } from "outline-icons"; import * as React from "react"; import { useTranslation } from "react-i18next"; import { useTheme } from "styled-components"; +import Squircle from "@shared/components/Squircle"; import { CollectionPermission } from "@shared/types"; import type Collection from "~/models/Collection"; import type Document from "~/models/Document"; @@ -14,7 +15,6 @@ import useStores from "~/hooks/useStores"; import Avatar from "../Avatar"; import { AvatarSize } from "../Avatar/Avatar"; import CollectionIcon from "../Icons/CollectionIcon"; -import Squircle from "../Squircle"; import Tooltip from "../Tooltip"; import { StyledListItem } from "./MemberListItem"; diff --git a/app/components/Sharing/PublicAccess.tsx b/app/components/Sharing/PublicAccess.tsx index c5d21b2b4ae3..dd848ca0e600 100644 --- a/app/components/Sharing/PublicAccess.tsx +++ b/app/components/Sharing/PublicAccess.tsx @@ -8,6 +8,7 @@ import { Trans, useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { toast } from "sonner"; import styled, { useTheme } from "styled-components"; +import Squircle from "@shared/components/Squircle"; import { s } from "@shared/styles"; import { UrlHelper } from "@shared/utils/UrlHelper"; import Document from "~/models/Document"; @@ -21,7 +22,6 @@ import { AvatarSize } from "../Avatar/Avatar"; import CopyToClipboard from "../CopyToClipboard"; import NudeButton from "../NudeButton"; import { ResizingHeightContainer } from "../ResizingHeightContainer"; -import Squircle from "../Squircle"; import Text from "../Text"; import Tooltip from "../Tooltip"; import { StyledListItem } from "./MemberListItem"; diff --git a/app/components/Text.ts b/app/components/Text.ts index 07dd36e69c81..9f81f7ac6c61 100644 --- a/app/components/Text.ts +++ b/app/components/Text.ts @@ -11,7 +11,7 @@ type Props = { /** Whether the text should be selectable (defaults to false) */ selectable?: boolean; /** The font weight of the text */ - weight?: "bold" | "normal"; + weight?: "xbold" | "bold" | "normal"; /** Whether the text should be truncated with an ellipsis */ ellipsis?: boolean; }; @@ -47,7 +47,9 @@ const Text = styled.span` ${(props) => props.weight && css` - font-weight: ${props.weight === "bold" + font-weight: ${props.weight === "xbold" + ? 600 + : props.weight === "bold" ? 500 : props.weight === "normal" ? 400 diff --git a/package.json b/package.json index 257a05076e33..2bbdd96ace3f 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,9 @@ "@dnd-kit/sortable": "^7.0.2", "@emoji-mart/data": "^1.0.6", "@emoji-mart/react": "^1.1.1", + "@fortawesome/fontawesome-svg-core": "^6.5.2", + "@fortawesome/free-solid-svg-icons": "^6.5.2", + "@fortawesome/react-fontawesome": "^0.2.0", "@getoutline/y-prosemirror": "^1.0.18", "@hocuspocus/extension-throttle": "1.1.2", "@hocuspocus/provider": "1.1.2", diff --git a/server/routes/api/collections/collections.test.ts b/server/routes/api/collections/collections.test.ts index fb8ec1ed196b..148fa63bb930 100644 --- a/server/routes/api/collections/collections.test.ts +++ b/server/routes/api/collections/collections.test.ts @@ -174,6 +174,7 @@ describe("#collections.move", () => { token: admin.getJwtToken(), id: collection.id, index: "P", + icon: "flame", }, }); const body = await res.json(); @@ -181,6 +182,20 @@ describe("#collections.move", () => { expect(body.success).toBe(true); }); + it("should return error when icon is not valid", async () => { + const team = await buildTeam(); + const admin = await buildAdmin({ teamId: team.id }); + const collection = await buildCollection({ teamId: team.id }); + const res = await server.post("/api/collections.move", { + body: { + token: admin.getJwtToken(), + id: collection.id, + icon: "nonsRence", + }, + }); + expect(res.status).toEqual(400); + }); + it("should return error when index is not valid", async () => { const team = await buildTeam(); const admin = await buildAdmin({ teamId: team.id }); diff --git a/server/routes/api/collections/schema.ts b/server/routes/api/collections/schema.ts index 17df1648da2f..1a8f64de387b 100644 --- a/server/routes/api/collections/schema.ts +++ b/server/routes/api/collections/schema.ts @@ -2,11 +2,20 @@ import isUndefined from "lodash/isUndefined"; import { z } from "zod"; import { randomElement } from "@shared/random"; import { CollectionPermission, FileOperationFormat } from "@shared/types"; +import { IconLibrary } from "@shared/utils/IconLibrary"; import { colorPalette } from "@shared/utils/collections"; import { Collection } from "@server/models"; -import { ValidateColor, ValidateIcon, ValidateIndex } from "@server/validation"; +import { ValidateColor, ValidateIndex } from "@server/validation"; import { BaseSchema } from "../schema"; +function zodEnumFromObjectKeys< + TI extends Record, + R extends string = TI extends Record ? R : never +>(input: TI): z.ZodEnum<[R, ...R[]]> { + const [firstKey, ...otherKeys] = Object.keys(input) as [R, ...R[]]; + return z.enum([firstKey, ...otherKeys]); +} + export const CollectionsCreateSchema = BaseSchema.extend({ body: z.object({ name: z.string(), @@ -20,12 +29,7 @@ export const CollectionsCreateSchema = BaseSchema.extend({ .nullish() .transform((val) => (isUndefined(val) ? null : val)), sharing: z.boolean().default(true), - icon: z - .string() - .max(ValidateIcon.maxLength, { - message: `Must be ${ValidateIcon.maxLength} or fewer characters long`, - }) - .optional(), + icon: zodEnumFromObjectKeys(IconLibrary.mapping).optional(), sort: z .object({ field: z.union([z.literal("title"), z.literal("index")]), @@ -171,12 +175,7 @@ export const CollectionsUpdateSchema = BaseSchema.extend({ id: z.string().uuid(), name: z.string().optional(), description: z.string().nullish(), - icon: z - .string() - .max(ValidateIcon.maxLength, { - message: `Must be ${ValidateIcon.maxLength} or fewer characters long`, - }) - .nullish(), + icon: zodEnumFromObjectKeys(IconLibrary.mapping).nullish(), permission: z.nativeEnum(CollectionPermission).nullish(), color: z .string() diff --git a/server/validation.ts b/server/validation.ts index eff13375c3bc..eaf36fd800ec 100644 --- a/server/validation.ts +++ b/server/validation.ts @@ -246,7 +246,3 @@ export class ValidateColor { public static regex = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i; public static message = "Must be a hex value (please use format #FFFFFF)"; } - -export class ValidateIcon { - public static maxLength = 50; -} diff --git a/shared/components/Flex.tsx b/shared/components/Flex.tsx new file mode 100644 index 000000000000..eb3e86e9ae3d --- /dev/null +++ b/shared/components/Flex.tsx @@ -0,0 +1,38 @@ +import { CSSProperties } from "react"; +import styled from "styled-components"; + +type JustifyValues = CSSProperties["justifyContent"]; + +type AlignValues = CSSProperties["alignItems"]; + +const Flex = styled.div<{ + auto?: boolean; + column?: boolean; + align?: AlignValues; + justify?: JustifyValues; + wrap?: boolean; + shrink?: boolean; + reverse?: boolean; + gap?: number; +}>` + display: flex; + flex: ${({ auto }) => (auto ? "1 1 auto" : "initial")}; + flex-direction: ${({ column, reverse }) => + reverse + ? column + ? "column-reverse" + : "row-reverse" + : column + ? "column" + : "row"}; + align-items: ${({ align }) => align}; + justify-content: ${({ justify }) => justify}; + flex-wrap: ${({ wrap }) => (wrap ? "wrap" : "initial")}; + flex-shrink: ${({ shrink }) => + shrink === true ? 1 : shrink === false ? 0 : "initial"}; + gap: ${({ gap }) => (gap ? `${gap}px` : "initial")}; + min-height: 0; + min-width: 0; +`; + +export default Flex; diff --git a/app/components/Icons/LetterIcon.tsx b/shared/components/LetterIcon.tsx similarity index 92% rename from app/components/Icons/LetterIcon.tsx rename to shared/components/LetterIcon.tsx index 15cba1a9196a..88c1b18c2f0b 100644 --- a/app/components/Icons/LetterIcon.tsx +++ b/shared/components/LetterIcon.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import styled from "styled-components"; -import { s } from "@shared/styles"; -import Squircle from "../Squircle"; +import { s } from "../styles"; +import Squircle from "./Squircle"; type Props = { /** The width and height of the icon, including standard padding. */ diff --git a/app/components/Squircle.tsx b/shared/components/Squircle.tsx similarity index 100% rename from app/components/Squircle.tsx rename to shared/components/Squircle.tsx diff --git a/shared/i18n/locales/en_US/translation.json b/shared/i18n/locales/en_US/translation.json index fd7140fd3f5c..3fa8257d9874 100644 --- a/shared/i18n/locales/en_US/translation.json +++ b/shared/i18n/locales/en_US/translation.json @@ -238,7 +238,8 @@ "{{authorName}} created <3>": "{{authorName}} created <3>", "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Show menu", - "Choose icon": "Choose icon", + "Choose an icon": "Choose an icon", + "Filter": "Filter", "Loading": "Loading", "Select a color": "Select a color", "Search": "Search", @@ -864,7 +865,6 @@ "Enterprise": "Enterprise", "Recent imports": "Recent imports", "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", - "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", "Receive a notification when a document you are subscribed to is edited": "Receive a notification when a document you are subscribed to is edited", diff --git a/app/components/Icons/IconLibrary.tsx b/shared/utils/IconLibrary.tsx similarity index 59% rename from app/components/Icons/IconLibrary.tsx rename to shared/utils/IconLibrary.tsx index b6cca80a9028..1e69bd98441b 100644 --- a/app/components/Icons/IconLibrary.tsx +++ b/shared/utils/IconLibrary.tsx @@ -1,3 +1,92 @@ +import { + faHeart, + faWandSparkles, + faUmbrella, + faMugHot, + faBook, + faDroplet, + faBrush, + faSnowflake, + faShop, + faShirt, + faBagShopping, + faGauge, + faMountainSun, + faPassport, + faPhoneVolume, + faNewspaper, + faNetworkWired, + faRocket, + faStarOfLife, + faSeedling, + faTrain, + faMicrochip, + faRecordVinyl, + faTrophy, + faHammer, + faRobot, + faCrown, + faCube, + faRoad, + faPuzzlePiece, + faIndustry, + faWorm, + faVault, + faUtensils, + faUserGraduate, + faUniversalAccess, + faTractor, + faTent, + faSpa, + faSocks, + faScissors, + faSailboat, + faPizzaSlice, + faPaw, + faMap, + faLaptopCode, + faKitMedical, + faFaceSurprise, + faFaceSmileWink, + faFaceSmileBeam, + faFaceMeh, + faFaceLaugh, + faFaceGrinStars, + faFaceDizzy, + faDog, + faCrow, + faCompactDisc, + faClapperboard, + faFeather, + faFish, + faCat, + faTree, + faShield, + faLaptop, + faDisplay, + faPrescription, + faWheelchairMove, + faGift, + faMagnet, + faPaintRoller, + faGamepad, + faCookieBite, + faTowerCell, + faTooth, + faDollarSign, + faSterlingSign, + faYenSign, + faPesoSign, + faRainbow, + faPenRuler, + faSwatchbook, + faStarAndCrescent, + faSolarPanel, + faUmbrellaBeach, + faGem, + faDna, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import intersection from "lodash/intersection"; import { BookmarkedIcon, @@ -54,7 +143,21 @@ import { ThumbsUpIcon, TruckIcon, } from "outline-icons"; -import LetterIcon from "./LetterIcon"; +import * as React from "react"; +import styled from "styled-components"; +import LetterIcon from "../components/LetterIcon"; + +type IconMapping = { + component: React.ComponentType; + keywords?: string; +}; + +type FAProps = { + color?: string; + size?: number; + className?: string; + style?: React.CSSProperties; +}; export class IconLibrary { /** @@ -78,7 +181,7 @@ export class IconLibrary { for (const key of keys) { const icon = this.mapping[key]; - const keywords = icon.keywords.split(" "); + const keywords = icon.keywords?.split(" "); const namewords = keyword.toLocaleLowerCase().split(" "); const matches = intersection(namewords, keywords); @@ -90,11 +193,32 @@ export class IconLibrary { return undefined; } + /** + * Find icons. + * + * @param query The query to search for + * @returns The icon results. + */ + public static findIcons(query: string) { + return Object.keys(this.mapping) + .map((key) => { + const icon = this.mapping[key]; + const keywords = `${icon.keywords ?? ""} ${key}`; + + if (keywords.includes(query.toLocaleLowerCase())) { + return key; + } + return undefined; + }) + .filter(Boolean); + } + /** * A map of all icons available to end users in the app. This does not include icons that are used * internally only, which can be imported from `outline-icons` directly. */ - public static mapping = { + public static mapping: Record = { + // Internal icons academicCap: { component: AcademicCapIcon, keywords: "learn teach lesson guide tutorial onboarding training", @@ -311,5 +435,123 @@ export class IconLibrary { component: WarningIcon, keywords: "warning alert error", }, - }; + + // Font awesome + ...Object.fromEntries( + [ + faHeart, + faWandSparkles, + faUmbrella, + faMugHot, + faBook, + faDroplet, + faBrush, + faSnowflake, + faShop, + faShirt, + faBagShopping, + faGauge, + faMountainSun, + faPassport, + faPhoneVolume, + faNewspaper, + faNetworkWired, + faRocket, + faStarOfLife, + faSeedling, + faTrain, + faMicrochip, + faRecordVinyl, + faTrophy, + faHammer, + faRobot, + faCrown, + faCube, + faRoad, + faPuzzlePiece, + faIndustry, + faWorm, + faVault, + faUtensils, + faUserGraduate, + faUniversalAccess, + faTractor, + faTent, + faSpa, + faSocks, + faScissors, + faSailboat, + faPizzaSlice, + faPaw, + faMap, + faLaptopCode, + faKitMedical, + faFaceSurprise, + faFaceSmileWink, + faFaceSmileBeam, + faFaceMeh, + faFaceLaugh, + faFaceGrinStars, + faFaceDizzy, + faDog, + faCrow, + faCompactDisc, + faClapperboard, + faFeather, + faFish, + faCat, + faTree, + faShield, + faLaptop, + faDisplay, + faPrescription, + faWheelchairMove, + faGift, + faMagnet, + faPaintRoller, + faGamepad, + faCookieBite, + faTowerCell, + faTooth, + faDollarSign, + faSterlingSign, + faYenSign, + faPesoSign, + faRainbow, + faPenRuler, + faSwatchbook, + faStarAndCrescent, + faSolarPanel, + faUmbrellaBeach, + faGem, + faDna, + ].map((icon) => [ + icon.iconName, + { + component: ({ color, size = 24, className, style }: FAProps) => ( + + + + ), + }, + ]) + ), + } as const; } + +const FontAwesomeWrapper = styled.span<{ size: number }>` + display: flex; + align-items: center; + justify-content: center; + width: ${(props) => props.size}px; + height: ${(props) => props.size}px; +`; diff --git a/yarn.lock b/yarn.lock index d9b25506e3df..7abfc65f82c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,22 +110,7 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7", "@babel/helper-create-class-features-plugin@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" - integrity "sha1-l6YbOF5X/kWElvrRn45jtjyGfeQ= sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==" - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.24.1": +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== @@ -248,16 +233,7 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" - integrity "sha1-4302cSPKmP5FWpiHc07S4W63p5M= sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==" - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.22.15" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-replace-supers@^7.24.1": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9", "@babel/helper-replace-supers@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== @@ -624,20 +600,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.24.1": +"@babel/plugin-syntax-typescript@^7.24.1", "@babel/plugin-syntax-typescript@^7.7.2": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity "sha1-JPRgyF27yYPNK5xJlBeLzAHflY8= sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==" - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" @@ -1663,6 +1632,32 @@ dependencies: tslib "2.4.0" +"@fortawesome/fontawesome-common-types@6.5.2": + version "6.5.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz#eaf2f5699f73cef198454ebc0c414e3688898179" + integrity sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw== + +"@fortawesome/fontawesome-svg-core@^6.5.2": + version "6.5.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz#4b42de71e196039b0d5ccf88559b8044e3296c21" + integrity sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.2" + +"@fortawesome/free-solid-svg-icons@^6.5.2": + version "6.5.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz#9b40b077b27400a5e9fcbf2d15b986c7be69e9ca" + integrity sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw== + dependencies: + "@fortawesome/fontawesome-common-types" "6.5.2" + +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz#d90dd8a9211830b4e3c08e94b63a0ba7291ddcf4" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@getoutline/y-prosemirror@^1.0.18": version "1.0.18" resolved "https://registry.yarnpkg.com/@getoutline/y-prosemirror/-/y-prosemirror-1.0.18.tgz#17245c0362d30adb85131c86fb9a59358884b234" From f1bc71123c53412bb46179dcc1c30b970b08b213 Mon Sep 17 00:00:00 2001 From: Translate-O-Tron <75237327+outline-translations@users.noreply.github.com> Date: Sat, 13 Apr 2024 20:33:25 +0200 Subject: [PATCH 022/129] New Crowdin updates (#6692) --- shared/i18n/locales/cs_CZ/translation.json | 219 +++++---- shared/i18n/locales/da_DK/translation.json | 75 ++- shared/i18n/locales/de_DE/translation.json | 75 ++- shared/i18n/locales/es_ES/translation.json | 75 ++- shared/i18n/locales/fa_IR/translation.json | 75 ++- shared/i18n/locales/fr_FR/translation.json | 91 ++-- shared/i18n/locales/he_IL/translation.json | 75 ++- shared/i18n/locales/hu_HU/translation.json | 75 ++- shared/i18n/locales/id_ID/translation.json | 75 ++- shared/i18n/locales/it_IT/translation.json | 75 ++- shared/i18n/locales/ja_JP/translation.json | 75 ++- shared/i18n/locales/ko_KR/translation.json | 75 ++- shared/i18n/locales/nb_NO/translation.json | 75 ++- shared/i18n/locales/nl_NL/translation.json | 75 ++- shared/i18n/locales/pl_PL/translation.json | 83 +++- shared/i18n/locales/pt_BR/translation.json | 75 ++- shared/i18n/locales/pt_PT/translation.json | 75 ++- shared/i18n/locales/sv_SE/translation.json | 75 ++- shared/i18n/locales/th_TH/translation.json | 75 ++- shared/i18n/locales/tr_TR/translation.json | 75 ++- shared/i18n/locales/uk_UA/translation.json | 129 +++-- shared/i18n/locales/vi_VN/translation.json | 75 ++- shared/i18n/locales/zh_CN/translation.json | 521 +++++++++++---------- shared/i18n/locales/zh_TW/translation.json | 75 ++- 24 files changed, 1630 insertions(+), 838 deletions(-) diff --git a/shared/i18n/locales/cs_CZ/translation.json b/shared/i18n/locales/cs_CZ/translation.json index 2e6b25aeea5d..806664ddec89 100644 --- a/shared/i18n/locales/cs_CZ/translation.json +++ b/shared/i18n/locales/cs_CZ/translation.json @@ -11,8 +11,8 @@ "Delete": "Odstranit", "Delete collection": "Odstranit sbírku", "Copy ID": "Kopírovat ID", - "Clear IndexedDB cache": "Clear IndexedDB cache", - "IndexedDB cache cleared": "IndexedDB cache cleared", + "Clear IndexedDB cache": "Smazat mezipaměť IndexedDB", + "IndexedDB cache cleared": "Mezipaměť indexedDB vymazána", "Toggle debug logging": "Toggle debug logging", "Debug logging enabled": "Zaznamenávání logů povoleno", "Debug logging disabled": "Zaznamenávání logů zakázáno", @@ -69,8 +69,8 @@ "Comments": "Komentáře", "History": "Historie", "Insights": "Přehledy", - "Disable viewer insights": "Disable viewer insights", - "Enable viewer insights": "Enable viewer insights", + "Disable viewer insights": "Vypnout analytika nahlížení", + "Enable viewer insights": "Zapnout analytika nahlížení", "Home": "Domovská stránka", "Drafts": "Koncepty", "Trash": "Koš", @@ -79,6 +79,7 @@ "Templates": "Šablony", "Notifications": "Upozornění", "Preferences": "Předvolby", + "Documentation": "Documentation", "API documentation": "API dokumentace", "Toggle sidebar": "Postranní panel", "Send us feedback": "Napište nám svůj názor", @@ -88,7 +89,7 @@ "Download {{ platform }} app": "Stáhněte si aplikaci {{ platform }}", "Log out": "Odhlásit se", "Mark notifications as read": "Označit upozornění jako přečtená", - "Archive all notifications": "Archive all notifications", + "Archive all notifications": "Archivovat všechny notifikace", "Restore revision": "Obnovit revizi", "Link copied": "Odkaz zkopírován", "Dark": "Temný", @@ -101,7 +102,12 @@ "Select a workspace": "Vybrat pracovní prostor", "New workspace": "Nový pracovní prostor", "Create a workspace": "Vytvořte pracovní prostor", + "Login to workspace": "Login to workspace", "Invite people": "Pozvat uživatele", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Smazat uživatele", "Collection": "Sbírka", "Debug": "Odstranit vývojářskou chybu", @@ -117,11 +123,11 @@ "previously edited": "dříve upraveno", "You": "Vy", "Viewers": "Prohlížející", - "Collections are used to group documents and choose permissions": "Collections are used to group documents and choose permissions", + "Collections are used to group documents and choose permissions": "Kolekce se používají pro seskupení dokumentů a volbu spojených oprávnění", "Name": "Jméno", - "The default access for workspace members, you can share with more users or groups later.": "The default access for workspace members, you can share with more users or groups later.", + "The default access for workspace members, you can share with more users or groups later.": "Výchozí přístup pro členy pracovního prostoru můžete později sdílet s více uživateli nebo skupinami.", "Public document sharing": "Veřejné sdílení dokumentů", - "Allow documents within this collection to be shared publicly on the internet.": "Allow documents within this collection to be shared publicly on the internet.", + "Allow documents within this collection to be shared publicly on the internet.": "Je-li povoleno, jakékoli dokumenty v této sbírce lze sdílet veřejně na internetu.", "Saving": "Uložení", "Save": "Uložit", "Creating": "Vytváření", @@ -169,7 +175,7 @@ "You archived": "Archivovali jste", "{{ userName }} archived": "{{ userName }} archivoval", "{{ userName }} created": "{{ userName }} vytvořil", - "Imported": "Imported", + "Imported": "Importováno", "You created": "Vytvořili jste", "You published": "Zveřejnili jste", "{{ userName }} published": "{{ userName }} zveřejnil", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Zobrazeno před {{ timeAgo }}", "Copy of {{ documentName }}": "Kopie {{ documentName }}", "Title": "Název", + "Published": "Published", "Include nested documents": "Zahrnout vnořené dokumenty", "Emoji Picker": "Výběr emotikonů", "Remove": "Odstranit", @@ -208,8 +215,8 @@ "{{userName}} archived": "{{userName}} archivoval", "{{userName}} restored": "{{userName}} obnovil", "{{userName}} deleted": "{{userName}} odstranil", - "{{userName}} added {{addedUserName}}": "{{userName}} added {{addedUserName}}", - "{{userName}} removed {{removedUserName}}": "{{userName}} removed {{removedUserName}}", + "{{userName}} added {{addedUserName}}": "{{userName}} přidal(a) {{addedUserName}}", + "{{userName}} removed {{removedUserName}}": "{{userName}} odebral {{removedUserName}}", "{{userName}} moved from trash": "{{userName}} přesunuto z koše", "{{userName}} published": "{{userName}} zveřejnil", "{{userName}} unpublished": "{{userName}} zrušil publikování", @@ -228,13 +235,15 @@ "{{ count }} member": "{{ count }} člen", "{{ count }} member_plural": "{{ count }} členů", "Group members": "Členové skupiny", + "{{authorName}} created <3>": "{{authorName}} vytvořil <3>", + "{{authorName}} opened <3>": "{{authorName}} otevřel <3>", "Show menu": "Zobrazit menu", "Choose icon": "Vyberte ikonu", "Loading": "Načítání", "Select a color": "Vybrat barvu", "Search": "Hledat", - "Permission": "Permission", - "Can edit": "Can edit", + "Permission": "Oprávnění", + "Can edit": "Může upravovat", "View only": "Pouze zobrazit", "No access": "Bez přístupu", "Default access": "Výchozí přístup", @@ -250,41 +259,41 @@ "Documents": "Dokumenty", "Results": "Výsledky", "No results for {{query}}": "Žádné výsledky pro {{query}}", - "{{ userName }} was removed from the document": "{{ userName }} was removed from the document", + "{{ userName }} was removed from the document": "{{ userName }} byl z dokumentu odstraněn", "Could not remove user": "Uživatele nelze odstranit", - "Permissions for {{ userName }} updated": "Permissions for {{ userName }} updated", + "Permissions for {{ userName }} updated": "Oprávnění pro {{ userName }} byla aktualizována", "Could not update user": "Uživatele nelze upravit", - "Has access through <2>parent": "Has access through <2>parent", + "Has access through <2>parent": "Má přístup prostřednictvím <2>rodiče", "Suspended": "Pozastaven", "Invited": "Pozvaní", "Viewer": "Prohlížející", "Editor": "Editor", "Leave": "Odejít", - "All members": "All members", - "Everyone in the workspace": "Everyone in the workspace", - "Can view": "Can view", - "Everyone in the collection": "Everyone in the collection", - "You have full access": "You have full access", - "Created the document": "Created the document", - "Other people": "Other people", - "Other workspace members may have access": "Other workspace members may have access", - "This document may be shared with more workspace members through a parent document or collection you do not have access to": "This document may be shared with more workspace members through a parent document or collection you do not have access to", - "Access inherited from collection": "Access inherited from collection", + "All members": "Všichni členové", + "Everyone in the workspace": "Všichni v pracovišti", + "Can view": "Může prohlížet", + "Everyone in the collection": "Všichni v kolekci", + "You have full access": "Máte neomezený přístup", + "Created the document": "Dokument vytvořen", + "Other people": "Ostatní lidé", + "Other workspace members may have access": "Ostatní členové pracoviště mohou mít přístup", + "This document may be shared with more workspace members through a parent document or collection you do not have access to": "Tento dokument může být sdílen s více členy pracovního prostoru prostřednictvím nadřazeného dokumentu nebo sbírky, ke které nemáte přístup", + "Access inherited from collection": "Přístup zděděný z kolekce", "Only lowercase letters, digits and dashes allowed": "Jsou povolena pouze malá písmena, číslice a pomlčky", "Sorry, this link has already been used": "Je nám líto, tento odkaz již byl použit", - "Public link copied to clipboard": "Public link copied to clipboard", - "Copy public link": "Copy public link", + "Public link copied to clipboard": "Veřejný odkaz zkopírován do schránky", + "Copy public link": "Zkopírovat veřejný odkaz", "Web": "Web", - "Anyone with the link can access because the parent document, <2>{{documentTitle}}, is shared": "Anyone with the link can access because the parent document, <2>{{documentTitle}}, is shared", - "Allow anyone with the link to access": "Allow anyone with the link to access", + "Anyone with the link can access because the parent document, <2>{{documentTitle}}, is shared": "Kdokoli s odkazem má přístup, protože dokument dědí oprávnění po nadřazeném dokumentu <2>{{documentTitle}}", + "Allow anyone with the link to access": "Povolit přístup komukoliv s odkazem", "Publish to internet": "Zveřejnit na internetu", - "Nested documents are not shared on the web. Toggle sharing to enable access, this will be the default behavior in the future": "Nested documents are not shared on the web. Toggle sharing to enable access, this will be the default behavior in the future", - "Invite": "Invite", - "{{ userName }} was invited to the document": "{{ userName }} was invited to the document", - "{{ count }} people invited to the document": "{{ count }} people invited to the document", - "{{ count }} people invited to the document_plural": "{{ count }} people invited to the document", - "Invite by name": "Invite by name", - "No matches": "No matches", + "Nested documents are not shared on the web. Toggle sharing to enable access, this will be the default behavior in the future": "Vložené dokumenty nejsou sdíleny na webu. Změnit sdílení pro povolení přístupu (toto bude v budoucnu výchozí chování)", + "Invite": "Pozvat", + "{{ userName }} was invited to the document": "{{ userName }} byl pozván do dokumentu", + "{{ count }} people invited to the document": "{{ count }} pozváno do dokumentu", + "{{ count }} people invited to the document_plural": "{{ count }} lidí pozváno do dokumentu", + "Invite by name": "Pozvat podle jména", + "No matches": "Žádné výsledky", "Logo": "Logo", "Move document": "Přesunout dokument", "New doc": "Nový dokument", @@ -294,8 +303,8 @@ "Empty": "Prázdné", "Go back": "Jít zpět", "Go forward": "Jít vpřed", - "Could not load shared documents": "Could not load shared documents", - "Shared with me": "Shared with me", + "Could not load shared documents": "Sdílené dokumenty nelze načíst", + "Shared with me": "Sdíleno se mnou", "Show more": "Zobrazit více", "Could not load starred documents": "Nelze načíst dokumenty s hvězdičkou", "Starred": "Oblíbené", @@ -309,11 +318,12 @@ "No results": "Žádné výsledky", "Previous page": "Předchozí stránka", "Next page": "Další stránka", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Opravdu chcete umožnit {{ userName }} pouze čtení? Nebude moci upravovat žádný obsah", - "Are you sure you want to make {{ userName }} a member?": "Opravdu chcete {{ userName }} udělat členem?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Rozumím, odstranit", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Opravdu chcete trvale smazat {{ userName }}? Tuto operaci nelze obnovit, zvažte místo toho pozastavení uživatele.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Opravdu chcete učinit z {{ userName }} správce? Správci mohou upravit tým a fakturační informace.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Opravdu chcete pozastavit {{ userName }}? Pozastaveným uživatelům bude zabráněno v přihlášení.", "New name": "Nový název", "Name can't be empty": "Název nemůže být prázdný", @@ -329,8 +339,8 @@ "Replace": "Nahradit", "Replace all": "Nahradit vše", "Profile picture": "Profilový obrázek", - "Insert after": "Insert after", - "Insert before": "Insert before", + "Insert after": "Vložit za", + "Insert before": "Vložit před", "Align center": "Zarovnat na střed", "Align left": "Zarovnat vlevo", "Align right": "Zarovnat vpravo", @@ -344,11 +354,11 @@ "Create link": "Vytvořit odkaz", "Sorry, an error occurred creating the link": "Omlouváme se, při vytváření odkazu došlo k chybě", "Create a new doc": "Vytvořit nový dokument", - "Create a new child doc": "Create a new child doc", + "Create a new child doc": "Vytvořit nový podřazený dokument", "Delete table": "Odstranit tabulku", - "Delete file": "Delete file", - "Download file": "Download file", - "Replace file": "Replace file", + "Delete file": "Smazat soubor", + "Download file": "Stáhnout soubor", + "Replace file": "Nahradit soubor", "Delete image": "Odstranit obrázek", "Download image": "Stáhnout obrázek", "Replace image": "Nahradit obrázek", @@ -384,8 +394,8 @@ "Strikethrough": "Přeškrtnutí", "Bold": "Tučně", "Subheading": "Podnadpis", - "Sort ascending": "Sort ascending", - "Sort descending": "Sort descending", + "Sort ascending": "Seřadit vzestupně", + "Sort descending": "Seřadit sestupně", "Table": "Tabulka", "Math inline (LaTeX)": "Matematický vzorec (LaTeX)", "Math block (LaTeX)": "Matematický vzorec (LaTeX)", @@ -402,7 +412,7 @@ "Outdent": "Předsazení", "Video": "Video", "Could not import file": "Soubor nelze importovat", - "Unsubscribed from document": "Unsubscribed from document", + "Unsubscribed from document": "Upozornění vypnuta", "Account": "Účet", "API Tokens": "API Tokeny", "Details": "Podrobnosti", @@ -450,16 +460,14 @@ "Contents": "Obsah", "Headings you add to the document will appear here": "Zde se zobrazí nadpisy, které přidáte do dokumentu", "Table of contents": "Obsah", - "Change role to admin": "Změnit roli na správce", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Změnit roli na pouze pro čtení", "Change name": "Přejmenovat", "Suspend user": "Pozastavit uživatele", "An error occurred while sending the invite": "Při odesílání pozvánky došlo k chybě", "User options": "Uživatelské nastavení", + "Change role": "Change role", "Resend invite": "Znovu poslat pozvánku", "Revoke invite": "Zrušit pozvání", - "Activate user": "Activate user", + "Activate user": "Aktivovat uživatele", "template": "šablona", "document": "dokument", "published": "zveřejněno", @@ -467,8 +475,8 @@ "created the collection": "vytvořil sbírku", "mentioned you in": "zmínil vás v", "left a comment on": "zanechal komentář k", - "shared": "shared", - "invited you to": "invited you to", + "shared": "sdíleno", + "invited you to": "vás pozval/a do", "API token created": "Token API byl vytvořen", "Name your token something that will help you to remember it's use in the future, for example \"local development\", \"production\", or \"continuous integration\".": "Pojmenujte svůj token tak, abyste si ho snadno zapamatovali pro jeho použití v budoucnu, například „místní vývoj“, „výroba“ nebo „nepřetržitá integrace“.", "The document archive is empty at the moment.": "Archiv dokumentů je v tuto chvíli prázdný.", @@ -505,7 +513,7 @@ "{{ userName }} was added to the collection": "{{ userName }} byl přidán do sbírky", "Need to add someone who’s not on the team yet?": "Potřebujete přidat někoho, kdo ještě není v týmu?", "Invite people to {{ teamName }}": "Pozvat uživatele do {{ teamName }}", - "Ask an admin to invite them first": "Ask an admin to invite them first", + "Ask an admin to invite them first": "Požádejte správce, aby je nejdříve pozval", "Search by name": "Hledat podle názvu", "Search people": "Hledat uživatele", "No people matching your search": "Vašemu vyhledávání neodpovídají žádní lidé", @@ -559,11 +567,11 @@ "Switch to light": "Přepnout do světlého režimu", "Archived": "Archivované", "Save draft": "Uložit koncept", - "Done editing": "Done editing", + "Done editing": "Uložit úpravy", "Restore version": "Obnovit verzi", "No history yet": "Zatím žádná historie", - "Source": "Source", - "Imported from {{ source }}": "Imported from {{ source }}", + "Source": "Zdroj", + "Imported from {{ source }}": "Importováno z {{ source }}", "Stats": "Statistiky", "{{ count }} minute read": "{{ count }} minut čtení", "{{ count }} minute read_plural": "{{ count }} minut čtení", @@ -586,10 +594,10 @@ "No one else has viewed yet": "Nikdo jiný to zatím neviděl", "Viewed {{ count }} times by {{ teamMembers }} people": "Zobrazeno {{ count }} krát {{ teamMembers }} lidmi", "Viewed {{ count }} times by {{ teamMembers }} people_plural": "Zobrazeno {{ count }} krát {{ teamMembers }} lidmi", - "Viewer insights are disabled.": "Viewer insights are disabled.", + "Viewer insights are disabled.": "Analytika prohlížení jsou vypnuta.", "Sorry, the last change could not be persisted – please reload the page": "Je nám líto, poslední změna nemohla být zachována - prosím znovu načtěte stránku", - "{{ count }} days": "{{ count }} day", - "{{ count }} days_plural": "{{ count }} days", + "{{ count }} days": "{{count}} den", + "{{ count }} days_plural": "{{count}} dní", "This template will be permanently deleted in <2> unless restored.": "Tato šablona bude trvale odstraněna v <2> dokud nebude obnovena.", "This document will be permanently deleted in <2> unless restored.": "Tento dokument bude trvale odstraněn v <2> dokud nebude obnoven.", "Highlight some text and use the <1> control to add placeholders that can be filled out when creating new documents": "Zvýrazněte nějaký text a použijte <1> ovládací prvek pro přidání zástupných symbolů, které lze vyplnit při vytváření nových dokumentů", @@ -654,15 +662,17 @@ "We sent out your invites!": "Rozeslali jsme vaše pozvánky!", "Those email addresses are already invited": "Tyto e-mailové adresy jsou již pozvány", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Litujeme, můžete odeslat pouze {{MAX_INVITES}} pozvánek najednou", - "Invited members will receive access to": "Pozvaní členové obdrží přístup k", - "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Pozvěte členy nebo hosty, aby se připojili k vašemu pracovnímu prostoru. Mohou se přihlásit pomocí {{signinMethods}} nebo použít svou e-mailovou adresu.", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", + "{{collectionCount}} collections": "{{collectionCount}} kolekcí", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Pozvěte členy, aby se připojili k vašemu pracovnímu prostoru. Budou se muset přihlásit pomocí {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Jako správce můžete také <2>povolit přihlašování e-mailem.", - "Want a link to share directly with your team?": "Chcete odkaz sdílet přímo se svým týmem?", - "Email": "E-mail", + "Invite as": "Invite as", "Role": "Role", - "Remove invite": "Odebrat pozvánku", + "Email": "E-mail", "Add another": "Přidat další", "Inviting": "Pozvání", "Send Invites": "Odeslat pozvánky", @@ -701,10 +711,13 @@ "Continue with Email": "Pokračovat pomocí e-mailu", "Continue with {{ authProviderName }}": "Pokračovat s {{ authProviderName }}", "Back to home": "Zpět na úvodní stránku", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdoména", "The domain associated with your email address has not been allowed for this workspace.": "Doména spojená s vaší e-mailovou adresou nebyla pro tento pracovní prostor povolena.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Nelze se přihlásit. Přejděte prosím na vlastní adresu URL svého pracovního prostoru a zkuste se znovu přihlásit.<1> Pokud jste byli pozváni do pracovního prostoru, najdete odkaz na něj v e-mailu s pozvánkou.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Je nám líto, nový účet nelze vytvořit s osobní Gmail adresou.<1>Použijte místo toho účet Google Workspace.", - "The workspace associated with your user is scheduled for deletion and cannot be accessed at this time.": "The workspace associated with your user is scheduled for deletion and cannot be accessed at this time.", + "The workspace associated with your user is scheduled for deletion and cannot be accessed at this time.": "Pracoviště spojené s vaším uživatelským účtem je naplánováno ke smazání a tudíž je momentálně nepřístupné.", "The workspace you authenticated with is not authorized on this installation. Try another?": "Pracovní prostor, pomocí kterého jste se ověřili, není v této instalaci autorizován. Zkuste jiný.", "We could not read the user info supplied by your identity provider.": "Nepodařilo se nám přečíst informace o uživateli poskytnuté vaším poskytovatelem identity.", "Your account uses email sign-in, please sign-in with email to continue.": "Váš účet používá e-mailové přihlašování. Chcete-li pokračovat, přihlaste se pomocí e-mailu.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Vaše vlastní doména úspěšně odkazuje na Outline. Chcete-li dokončit proces nastavení, kontaktujte podporu.", "Choose workspace": "Vyberte pracovní prostor", "This login method requires choosing your workspace to continue": "Chcete-li pokračovat, tato metoda přihlášení vyžaduje výběr pracovního prostoru", - "subdomain": "subdoména", "Check your email": "Zkontrolujte svůj e-mail", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Na e-mail {{ emailLinkSentTo }} byl odeslán odkaz pro přihlášení, pokud účet existuje.", "Back to login": "Zpět na přihlášení", @@ -741,10 +753,10 @@ "Past week": "Minulý týden", "Past month": "Minulý měsíc", "Past year": "Minulý rok", - "Published documents": "Published documents", - "Archived documents": "Archived documents", - "Draft documents": "Draft documents", - "Any status": "Any status", + "Published documents": "Zveřejněné dokumenty", + "Archived documents": "Archivované dokumenty", + "Draft documents": "Koncepty", + "Any status": "Libovolný stav", "Search Results": "Výsledky vyhledávání", "Remove search": "Odstranit vyhledávání", "Any author": "Jakýkoliv autor", @@ -760,6 +772,10 @@ "Copied": "Zkopírováno", "Revoking": "Odvolávání", "Are you sure you want to revoke the {{ tokenName }} token?": "Skutečně chcete zrušit token {{ tokenName }}?", + "Disconnect integration": "Odebrat integraci", + "Connected": "Připojeno", + "Disconnect": "Odpojit", + "Disconnecting": "Odpojování", "Allowed domains": "Povolené domény", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Domény, které by měly mít povoleno vytvářet nové účty pomocí SSO. Změna tohoto nastavení nemá vliv na stávající uživatelské účty.", "Remove domain": "Odstranit doménu", @@ -789,6 +805,7 @@ "Where do I find the file?": "Kde najdu soubor?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "V Notion klikněte na Nastavení a členové v levém postranním panelu a otevřete Nastavení. Vyhledejte sekci Exportovat a klikněte na Exportovat veškerý obsah pracovního prostoru. Vyberte HTML jako formát pro nejlepší kompatibilitu dat.", "Last active": "Poslední aktivita", + "Guest": "Guest", "Shared": "Sdíleno", "by {{ name }}": "od {{ name }}", "Last accessed": "Poslední přístup", @@ -796,8 +813,10 @@ "Date shared": "Datum zveřejnění", "Domain": "Doména", "Views": "Zobrazení", - "Everyone": "Všichni", + "All roles": "All roles", "Admins": "Správci", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Nastavení uloženo", "Logo updated": "Logo aktualizováno", "Unable to upload new logo": "Nelze nahrát nové logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importujte stránky z aplikace Confluence", "Enterprise": "Podnik", "Recent imports": "Nedávné importy", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Zde je uveden každý, kdo se přihlásil do {{appName}}. Je možné, že existují další uživatelé, kteří mají přístup přes {team.signinMethods}, ale ještě se nepřihlásili.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtr", "Receive a notification whenever a new document is published": "Přijímat oznámení, když bude publikován nový obsah", "Document updated": "Dokument aktualizován", @@ -857,10 +876,10 @@ "Receive a notification whenever a new collection is created": "Přijímat oznámení, když bude vytvořena nová sbírka", "Invite accepted": "Pozvánka přijata", "Receive a notification when someone you invited creates an account": "Obdržet oznámení, když si někdo, koho jste pozvali, vytvoří účet", - "Invited to document": "Invited to document", - "Receive a notification when a document is shared with you": "Receive a notification when a document is shared with you", - "Invited to collection": "Invited to collection", - "Receive a notification when you are given access to a collection": "Receive a notification when you are given access to a collection", + "Invited to document": "Pozván/a do dokumentu", + "Receive a notification when a document is shared with you": "Dostat oznámení, když získáte přístup k dokumentu", + "Invited to collection": "Pozván do kolekce", + "Receive a notification when you are given access to a collection": "Dostávat upozornění, když získáte přístup k nové kolekci", "Export completed": "Export dokončen", "Receive a notification when an export you requested has been completed": "Obdržet upozornění, když byl vámi požadovaný export dokončen", "Getting started": "Začínáme", @@ -897,13 +916,12 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "K vytvoření účtu bude nutné nejprve pozvat nové uživatele. Výchozí role a Povolené domény již nebudou platit.", "Settings that impact the access, security, and content of your workspace.": "Nastavení ovlivňující přístup, bezpečnost a obsah vašeho pracovního prostoru.", "Allow members to sign-in with {{ authProvider }}": "Povolit členům přihlásit se pomocí {{ authProvider }}", - "Connected": "Připojeno", "Disabled": "Deaktivováno", "Allow members to sign-in using their email address": "Povolit členům přihlášení pomocí jejich e-mailové adresy", "The server must have SMTP configured to enable this setting": "Aby bylo možné toto nastavení povolit, musí mít server nakonfigurován SMTP", "Access": "Přístup", - "Allow users to send invites": "Allow users to send invites", - "Allow editors to invite other people to the workspace": "Allow editors to invite other people to the workspace", + "Allow users to send invites": "Povolit uživatelům posílat pozvánky", + "Allow editors to invite other people to the workspace": "Povolit editorům posílat pozvánky do pracoviště", "Require invites": "Vyžadovat pozvání", "Require members to be invited to the workspace before they can create an account using SSO.": "Vyžadovat, aby členové byli pozváni do pracovního prostoru, než si vytvoří účet pomocí jednotného přihlášení.", "Default role": "Výchozí role uživatele", @@ -914,7 +932,9 @@ "Rich service embeds": "Bohaté vložené služby", "Links to supported services are shown as rich embeds within your documents": "Odkazy na podporované služby se ve vašich dokumentech zobrazují jako rozšířené vložení", "Collection creation": "Vytvoření sbírky", - "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Allow editors to create new collections within the workspace": "Umožnit členům vytvářet v rámci pracoviště nové kolekce", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Využití aplikace Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Přidejte sem svou vlastní instalační adresu draw.io, abyste povolili automatické vkládání diagramů do dokumentů.", "Grist deployment": "Grist nasazení", @@ -929,10 +949,11 @@ "A confirmation code has been sent to your email address, please enter the code below to permanently destroy this workspace.": "Potvrzovací kód byl odeslán na vaši e-mailovou adresu, zadejte jej prosím níže pro trvalé odstranění tohoto pracovního prostoru.", "Confirmation code": "Potvrzovací kód", "Deleting the <1>{{workspaceName}} workspace will destroy all collections, documents, users, and associated data. You will be immediately logged out of {{appName}}.": "Smazání <1>{{workspaceName}} pracovního prostoru odstraní všechny kolekce, dokumenty, uživatele a související data. Budete okamžitě odhlášeni z {{appName}}.", - "Please note that workspaces are completely separated. They can have a different domain, settings, users, and billing.": "Please note that workspaces are completely separated. They can have a different domain, settings, users, and billing.", + "Please note that workspaces are completely separated. They can have a different domain, settings, users, and billing.": "Vezměte prosím na vědomí, že pracoviště jsou zcela odděleny. Mohou mít jinou doménu, nastavení, uživatele a fakturaci.", "Workspace name": "Název pracovního prostoru", "You are creating a new workspace using your current account — {{email}}": "Vytváříte nový pracovní prostor pomocí svého aktuálního účtu — {{email}}", "To create a workspace under another email please sign up from the homepage": "Chcete-li vytvořit pracovní prostor pod jiným e-mailem, zaregistrujte se z domovské stránky", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Koš je momentálně prázdný.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Na vaši e-mailovou adresu byl zaslán potvrzovací kód, zadejte jej prosím níže, aby byl váš účet trvale odstraněn.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Jste si jisti? Smazání účtu zničí identifikující data spojená s vaším uživatelem a nelze je vrátit zpět. Budete okamžitě odhlášeni z {{appName}} a všechny vaše API tokeny budou zrušeny.", @@ -943,25 +964,37 @@ "This month": "Tento měsíc", "Last month": "Minulý měsíc", "This year": "Tento rok", + "Connect": "Připojit", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Jejda, pro připojení {{appName}} k vašemu týmu musíte přijmout oprávnění ve Slacku. Zkusit znovu?", + "Something went wrong while authenticating your request. Please try logging in again.": "Při ověřování vašeho požadavku se něco pokazilo. Zkuste se prosím přihlásit znovu.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "Vlastník GitHub účtu byl požádán o instalaci aplikace {{githubAppName}} GitHub. Po schválení budou náhledy zobrazeny pro příslušné odkazy.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Povolit náhledy GitHub problémů a požadavky na natažení v dokumentech připojením GitHub organizace nebo konkrétních repositářů k {appName}.", + "Enabled by {{integrationCreatedBy}}": "Povoleno {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Odpojení zabrání zobrazení náhledu odkazů na GitHub z této organizace v dokumentech. Jste si jisti?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Integrace e-mailu je momentálně zakázána. Pokud chcete pokračovat, nejdříve nastavte příslušné proměnné a restartujte server.", "Add to Slack": "Přidat do Slacku", "document published": "dokument zveřejněn", "document updated": "dokument aktualizován", "Posting to the {{ channelName }} channel on": "Odesílání příspěvků na kanál {{ channelName }} zapnuto", "These events should be posted to Slack": "Tyto události by měly být zveřejněny na Slacku", - "Disconnect": "Odpojit", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "Tímto zastavíte zasílání budoucích aktualizací do tohoto kanálu Slack. Chcete pokračovat?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Jejda, pro připojení {{appName}} k vašemu pracovnímu prostoru musíte přijmout oprávnění ve Slacku. Zkusit znovu?", - "Something went wrong while authenticating your request. Please try logging in again.": "Při ověřování vašeho požadavku se něco pokazilo. Zkuste se prosím přihlásit znovu.", + "Personal account": "Osobní účet", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Napojte váš {{appName}} účet na Slack pro možnost vyhledávání dokumentů, ke kterým máte přístup, a to přímo v chatu.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Odpojení vašeho osobního účtu znepřístupní funkci hledání dokumentů ve Slacku. Pokračovat?", + "Slash command": "Příkaz", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Získejte bohaté náhledy {{ appName }} odkazů sdílených ve Slacku a pomocí příkazu {{ command }} lomítko vyhledejte dokumenty, aniž byste opustili chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "Tímto odstraníte příkaz z vašeho Slack pracoviště. Opravdu chcete pokračovat?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Připojte {{appName}} sbírek ke kanálům Slack. Zprávy budou automaticky odesílány do Slacku, jakmile budou dokumenty zveřejněny nebo aktualizovány.", - "Connect": "Připojit", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Integrace Slack je aktuálně zakázána. Nastavte přidružené proměnné parametry a restartujte server, aby byla povolena integrace.", + "Comment by {{ author }} on \"{{ title }}\"": "{{ author }} okomentoval \"{{ title }}\"", "How to use {{ command }}": "Jak používat {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Pro vyhledávání ve vašem pracovním prostoru použijte {{ command }}. \nZadejte {{ command2 }} nápovědu k zobrazení tohoto nápovědy.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Omlouváme se, nepodařilo se nám najít integraci pro váš tým. Přejděte do nastavení {{ appName }} a nastavte je.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Zdá se, že jste se ještě nepřihlásili do {{ appName }} , takže výsledky mohou být omezené", "Post to Channel": "Zveřejnit v kanálu", "This is what we found for \"{{ term }}\"": "Toto jsme našli pro \"{{ term }}\"", "No results for \"{{ term }}\"": "Žádné výsledky pro \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "Vypadá to, že jste ještě nepropojili váš {{ appName }} účet se Slackem", + "Link your account": "Napojit váš účet", + "Link your account in {{ appName }} settings to search from Slack": "Napojte svůj účet v nastavení {{ appName }} pro možnost hledání ve Slacku", "Are you sure you want to delete the {{ name }} webhook?": "Opravdu chcete odstranit {{ name }} webhook?", "Webhook updated": "Webhook byl aktualizován", "Update": "Aktualizovat", diff --git a/shared/i18n/locales/da_DK/translation.json b/shared/i18n/locales/da_DK/translation.json index 838166a82b57..d8f7f992a84c 100644 --- a/shared/i18n/locales/da_DK/translation.json +++ b/shared/i18n/locales/da_DK/translation.json @@ -79,6 +79,7 @@ "Templates": "Skabeloner", "Notifications": "Notifikationer", "Preferences": "Præferencer", + "Documentation": "Documentation", "API documentation": "API dokumentation", "Toggle sidebar": "Sidebjælke til/fra", "Send us feedback": "Send kritik", @@ -101,7 +102,12 @@ "Select a workspace": "Vælg et arbejdsområde", "New workspace": "Nyt arbejdsområde", "Create a workspace": "Opret et arbejdsområde", + "Login to workspace": "Login to workspace", "Invite people": "Invitér personer", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Slet bruger", "Collection": "Samling", "Debug": "Fejlsøgning", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Remove", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} medlem", "{{ count }} member_plural": "{{ count }} medlemmer", "Group members": "Gruppemedlemmer", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Vis menu", "Choose icon": "Vælg ikon", "Loading": "Indlæser", @@ -309,11 +318,12 @@ "No results": "No results", "Previous page": "Previous page", "Next page": "Next page", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content", - "Are you sure you want to make {{ userName }} a member?": "Are you sure you want to make {{ userName }} a member?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "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 suspend {{ userName }}? Suspended users will be prevented from logging in.": "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "Contents", "Headings you add to the document will appear here": "Headings you add to the document will appear here", "Table of contents": "Table of contents", - "Change role to admin": "Change role to admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Change role to viewer", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "User options", + "Change role": "Change role", "Resend invite": "Resend invite", "Revoke invite": "Revoke invite", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "We sent out your invites!", "Those email addresses are already invited": "Those email addresses are already invited", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Sorry, you can only send {{MAX_INVITES}} invites at a time", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "As an admin you can also <2>enable email sign-in.", - "Want a link to share directly with your team?": "Want a link to share directly with your team?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Rolle", - "Remove invite": "Remove invite", + "Email": "Email", "Add another": "Add another", "Inviting": "Inviting", "Send Invites": "Send Invites", @@ -701,6 +711,9 @@ "Continue with Email": "Continue with Email", "Continue with {{ authProviderName }}": "Continue with {{ authProviderName }}", "Back to home": "Back to home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Check your email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "Back to login", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "Disconnect", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Where do I find the file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.", "Last active": "Last active", + "Guest": "Guest", "Shared": "Shared", "by {{ name }}": "by {{ name }}", "Last accessed": "Last accessed", @@ -796,8 +813,10 @@ "Date shared": "Date shared", "Domain": "Domain", "Views": "Views", - "Everyone": "Everyone", + "All roles": "All roles", "Admins": "Admins", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Settings saved", "Logo updated": "Logo updated", "Unable to upload new logo": "Unable to upload new logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Import pages from a Confluence instance", "Enterprise": "Enterprise", "Recent imports": "Recent imports", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "The server must have SMTP configured to enable this setting", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links to supported services are shown as rich embeds within your documents", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Trash is empty at the moment.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "This month", "Last month": "Last month", "This year": "This year", + "Connect": "Connect", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Add to Slack", "document published": "document published", "document updated": "document updated", "Posting to the {{ channelName }} channel on": "Posting to the {{ channelName }} channel on", "These events should be posted to Slack": "These events should be posted to Slack", - "Disconnect": "Disconnect", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "Connect", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/de_DE/translation.json b/shared/i18n/locales/de_DE/translation.json index ba47636c0dd2..05ea8f77ac1a 100644 --- a/shared/i18n/locales/de_DE/translation.json +++ b/shared/i18n/locales/de_DE/translation.json @@ -79,6 +79,7 @@ "Templates": "Vorlagen", "Notifications": "Benachrichtigungen", "Preferences": "Einstellungen", + "Documentation": "Documentation", "API documentation": "API Dokumentation", "Toggle sidebar": "Seitenleiste umschalten", "Send us feedback": "Schicken Sie uns Feedback", @@ -101,7 +102,12 @@ "Select a workspace": "Wähle einen Arbeitsbereich", "New workspace": "Neuer Arbeitsbereich", "Create a workspace": "Arbeitsbereich erstellen", + "Login to workspace": "Login to workspace", "Invite people": "Personen einladen", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Benutzer löschen", "Collection": "Sammlung", "Debug": "Testen", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Angesehen {{ timeAgo }}", "Copy of {{ documentName }}": "Kopie von {{ documentName }}", "Title": "Überschrift", + "Published": "Published", "Include nested documents": "Verschachtelte Dokumente einbeziehen", "Emoji Picker": "Emoji Auswahl", "Remove": "Entfernen", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} Mitglied", "{{ count }} member_plural": "{{ count }} Mitglieder", "Group members": "Gruppenmitglieder", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Menü anzeigen", "Choose icon": "Icon auswählen", "Loading": "Laden", @@ -309,11 +318,12 @@ "No results": "Keine Ergebnisse", "Previous page": "Vorherige Seite", "Next page": "Nächste Seite", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Bist du sicher, dass du {{ userName }} zu einem schreibgeschützten Betrachter machen willst? Der Nutzer wird nicht mehr in der Lage sein, Inhalte zu bearbeiten", - "Are you sure you want to make {{ userName }} a member?": "Sind Sie sicher, dass Sie {{ userName }} zu einem Mitglied machen möchten?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Ich verstehe, löschen", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Bist du sicher {{ userName }} dauerhaft zu löschen? Dieser Vorgang ins nicht umkehrbar, erwäge stattdessen, den Nutzer zu sperren.", - "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 suspend {{ userName }}? Suspended users will be prevented from logging in.": "Möchtest du das Konto {{ userName }} sperren? Gesperrte Nutzer können sich nicht anmelden.", "New name": "Neuer Name", "Name can't be empty": "Der Name darf nicht leer sein", @@ -450,13 +460,11 @@ "Contents": "Inhalte", "Headings you add to the document will appear here": "Überschriften, die du dem Dokument hinzufügst, werden hier angezeigt", "Table of contents": "Inhaltsverzeichnis", - "Change role to admin": "Rolle zu Admin ändern", - "Change role to editor": "Rolle zu Editor ändern", - "Change role to viewer": "Rolle zu Betrachter ändern", "Change name": "Namen ändern", "Suspend user": "Benutzer sperren", "An error occurred while sending the invite": "Beim Versand der Einladung trat ein Fehler auf", "User options": "Nutzer-Einstellungen", + "Change role": "Change role", "Resend invite": "Einladung erneut senden", "Revoke invite": "Einladung widerrufen", "Activate user": "Benutzer aktivieren", @@ -654,15 +662,17 @@ "We sent out your invites!": "Wir haben Ihre Einladungen verschickt!", "Those email addresses are already invited": "Diese E-Mail-Adressen sind bereits eingeladen", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Du kannst leider nur {{MAX_INVITES}} Einladungen gleichzeitig senden", - "Invited members will receive access to": "Eingeladene Mitglieder erhalten Zugriff auf", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} Sammlungen", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Lade Mitglieder oder Gäste ein, deinem Arbeitsbereich beizutreten. Diese können sich mit {{signinMethods}} anmelden oder ihre E-Mail-Adresse verwenden.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Lade Mitglieder ein, deinem Workspace beizutreten. Sie müssen sich mit {{signinMethods}} anmelden.", "As an admin you can also <2>enable email sign-in.": "Als Administrator kannst du auch <2>die E-Mail-Anmeldung aktivieren.", - "Want a link to share directly with your team?": "Möchtest du einen Link direkt mit deinem Team teilen?", - "Email": "E-Mail", + "Invite as": "Invite as", "Role": "Rolle", - "Remove invite": "Einladung zurückziehen", + "Email": "E-Mail", "Add another": "Weitere hinzufügen", "Inviting": "Eingeladen", "Send Invites": "Einladung senden", @@ -701,6 +711,9 @@ "Continue with Email": "Weiter mit E-Mail", "Continue with {{ authProviderName }}": "Weiter mit {{ authProviderName }}", "Back to home": "Zurück zu Home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "Subdomäne", "The domain associated with your email address has not been allowed for this workspace.": "Die Domäne, die mit deiner E-Mail-Adresse verknüpft ist, wurde für diesen Arbeitsbereich nicht erlaubt.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Anmeldung nicht möglich. Bitte navigiere zur URL deines Arbeitsbereiches und versuche erneut dich anzumelden. <1>Wenn du in einen Arbeitsbereich eingeladen wurdest, findest du den Link in der Einladungs-Mail.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Leider kann ein neues Konto nicht mit einer persönlichen Gmail-Adresse erstellt werden. <1>Bitte verwende stattdessen ein Google Arbeitsbereich-Konto.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Deine benutzerdefinierte Domain verweist korrekt auf Outline. Um den Einrichtungsvorgang abzuschließen, wende dich bitte an den Support.", "Choose workspace": "Arbeitsbereich wählen", "This login method requires choosing your workspace to continue": "Diese Anmeldemethode erfordert die Auswahl Ihres Arbeitsbereichs, um fortzufahren", - "subdomain": "Subdomäne", "Check your email": "Überprüfe deine E-Mails", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "An die E-Mail {{ emailLinkSentTo }} wurde ein Einmal-Login-Link geschickt, sofern ein Benutzerkonto mit dieser E-Mail existiert.", "Back to login": "Zurück zur Anmeldung", @@ -760,6 +772,10 @@ "Copied": "Kopiert", "Revoking": "Wird widerrufen", "Are you sure you want to revoke the {{ tokenName }} token?": "Sind Sie sicher, den Token {{ tokenName }} zu widerrufen?", + "Disconnect integration": "Disconnect integration", + "Connected": "Verbunden", + "Disconnect": "Trennen", + "Disconnecting": "Disconnecting", "Allowed domains": "Erlaubte Domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Die Domänen, die mit SSO neue Konten erstellen dürfen. Das Ändern dieser Einstellung wirkt sich nicht auf bestehende Benutzerkonten aus.", "Remove domain": "Domäne entfernen", @@ -789,6 +805,7 @@ "Where do I find the file?": "Wo finde ich die Datei?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Klicke in Notion in der linken Seitenleiste auf Settings & Members und danach auf Settings. Schaue nach dem Export-Bereich und klicke auf Export all workspace content. Wähle für die beste Datenkompatibilität HTML als Format.", "Last active": "Zuletzt aktiv", + "Guest": "Guest", "Shared": "Geteilt", "by {{ name }}": "von {{ name }}", "Last accessed": "Letzter Zugriff", @@ -796,8 +813,10 @@ "Date shared": "Datum geteilt", "Domain": "Domain", "Views": "Ansichten", - "Everyone": "Alle", + "All roles": "All roles", "Admins": "Admins", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Einstellungen gespeichert", "Logo updated": "Logo aktualisiert", "Unable to upload new logo": "Das neue Logo konnte nicht hochgeladen werden", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importieren Sie Seiten aus einer Confluence-Instanz", "Enterprise": "Unternehmen", "Recent imports": "Neueste Importe", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Jeder, der sich bei {{appName}} angemeldet hat, ist hier aufgelistet. Es ist möglich, dass es andere Benutzer gibt, die Zugriff über {team.signinMethods} haben, sich aber noch nicht angemeldet haben.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Erhalten Sie eine Benachrichtigung, wenn ein neues Dokument veröffentlicht wird", "Document updated": "Dokument aktualisiert", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Neue Benutzer müssen zuerst eingeladen werden, um ein Konto zu erstellen. Standardrolle und Erlaubte Domains werden nicht mehr verwendet.", "Settings that impact the access, security, and content of your workspace.": "Einstellungen, die sich auf den Zugriff, die Sicherheit und den Inhalt Ihres Arbeitsbereichs auswirken.", "Allow members to sign-in with {{ authProvider }}": "Mitgliedern erlauben, sich mit {{ authProvider }} anzumelden", - "Connected": "Verbunden", "Disabled": "Deaktiviert", "Allow members to sign-in using their email address": "Mitgliedern erlauben, sich mit ihrer E-Mail-Adresse anzumelden", "The server must have SMTP configured to enable this setting": "Der Server muss SMTP konfiguriert haben, um diese Einstellung zu aktivieren", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links zu unterstützten Diensten werden als Rich Embeds in Ihren Dokumenten angezeigt", "Collection creation": "Sammlungserstellung", "Allow editors to create new collections within the workspace": "Editoren erlauben neue Sammlungen im Arbeitsbereich zu erstellen", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io Deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Fügen Sie hier Ihre selbst gehostete draw.io Installations-URL ein, um die automatische Einbettung von Diagrammen in Dokumenten zu ermöglichen.", "Grist deployment": "Grist Einsatz", @@ -933,6 +953,7 @@ "Workspace name": "Arbeitsbereichs-Name", "You are creating a new workspace using your current account — {{email}}": "Du erstellst einen neuen Arbeitsbereich mit deinem aktuellen Konto - {{email}}", "To create a workspace under another email please sign up from the homepage": "Um einen Arbeitsbereich unter einer anderen E-Mail-Adresse zu erstellen, melden dich bitte auf der Homepage an", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Der Papierkorb ist im Moment leer.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Ein Bestätigungscode wurde an deine E-Mail-Adresse gesendet. Bitte gebe den Code unten ein, um dein Konto endgültig zu löschen.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Bist du sicher? Das Löschen deines Kontos zerstört die Identifikationsdaten deines Benutzers und kann nicht rückgängig gemacht werden. Du wirst sofort von {{appName}} abgemeldet und alle deine API-Token werden widerrufen.", @@ -943,25 +964,37 @@ "This month": "Diesen Monat", "Last month": "Letzter Monat", "This year": "Dieses Jahr", + "Connect": "Verbinden", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Bei der Authentifizierung der Anfrage ist ein Fehler aufgetreten. Bitte versuche dich erneut anzumelden.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Zu Slack hinzufügen", "document published": "Dokument veröffentlicht", "document updated": "Dokument aktualisiert", "Posting to the {{ channelName }} channel on": "Beitrag im Kanal {{ channelName }} auf", "These events should be posted to Slack": "Diese Ereignisse sollten auf Slack gepostet werden", - "Disconnect": "Trennen", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Ups, du musst die Berechtigungen in Slack akzeptieren, um {{appName}} mit deinem Arbeitsbereich zu verbinden. Erneut versuchen?", - "Something went wrong while authenticating your request. Please try logging in again.": "Bei der Authentifizierung der Anfrage ist ein Fehler aufgetreten. Bitte versuche dich erneut anzumelden.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Erhalte eine umfassende Vorschau deiner in Slack freigegebenen {{ appName }}-Links und verwenden den {{ command }} der Slash Funktion, um nach Dokumenten zu suchen, ohne deinen Chat zu verlassen.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Verbinde {{appName}}-Sammlungen mit deinen Slack-Kanälen, für automatische Nachrichten, wenn Dokumente veröffentlicht oder aktualisiert werden.", - "Connect": "Verbinden", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Die Slack-Integration ist derzeit deaktiviert. Bitte setzen Sie die zugehörigen Umgebungsvariablen und starten Sie den Server neu, um die Integration zu aktivieren.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "{{ command }} verwenden", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Um den Arbeitsbereich zu durchsuchen, verwende {{ command }}.\nGebe {{ command2 }} ein, um diesen Hilfetext anzuzeigen.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Leider konnten wir keine Integration für dein Team finden. Gehe zu deinen {{ appName }} -Einstellungen, um eine einzurichten.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Anscheinend hast du dich noch nicht bei {{ appName }} angemeldet, daher können die Ergebnisse begrenzt sein", "Post to Channel": "Zum Kanal hinzufügen", "This is what we found for \"{{ term }}\"": "Das haben wir für \"{{ term }}\" gefunden", "No results for \"{{ term }}\"": "Keine Ergebnisse für {{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Sind Sie sich sicher, dass Sie den {{ name }} Webhook löschen möchten?", "Webhook updated": "Webhook aktualisiert", "Update": "Update", diff --git a/shared/i18n/locales/es_ES/translation.json b/shared/i18n/locales/es_ES/translation.json index c6d6721a9e57..99b802eddbc2 100644 --- a/shared/i18n/locales/es_ES/translation.json +++ b/shared/i18n/locales/es_ES/translation.json @@ -79,6 +79,7 @@ "Templates": "Plantillas", "Notifications": "Notificaciones", "Preferences": "Preferencias", + "Documentation": "Documentation", "API documentation": "Documentación del API", "Toggle sidebar": "Mostar/Ocultar barra lateral", "Send us feedback": "Envíenos sus comentarios", @@ -101,7 +102,12 @@ "Select a workspace": "Seleccionar un espacio de trabajo", "New workspace": "Nuevo espacio de trabajo", "Create a workspace": "Crear un espacio de trabajo", + "Login to workspace": "Login to workspace", "Invite people": "Invitar personas", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Eliminar usuario", "Collection": "Colección", "Debug": "Depurar", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Visto {{ timeAgo }}", "Copy of {{ documentName }}": "Copia de {{ documentName }}", "Title": "Título", + "Published": "Published", "Include nested documents": "Incluir documentos anidados", "Emoji Picker": "Selector de emojis", "Remove": "Eliminar", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} miembro", "{{ count }} member_plural": "{{ count }} miembros", "Group members": "Miembros del grupo", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Mostrar menú", "Choose icon": "Seleccionar ícono", "Loading": "Cargando", @@ -309,11 +318,12 @@ "No results": "No hay resultados", "Previous page": "Página anterior", "Next page": "Página siguiente", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "¿Estás seguro de que quieres convertir a {{ userName }} en un lector? El usuario no podrá editar contenido", - "Are you sure you want to make {{ userName }} a member?": "¿Estás seguro de que quieres convertir a {{ userName }} en miembro?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Lo entiendo, eliminar", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "¿Estás seguro de que quieres eliminar permanentemente a {{ userName }}? Esta operación es irreversible, considera suspender al usuario en su lugar.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "¿Estás seguro de que quieres convertir a {{ userName }} en administrador? Los administradores pueden modificar el equipo e información de facturación.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "¿Estás seguro de que quieres suspender a {{ userName }}? Los usuarios suspendidos no podrán iniciar sesión.", "New name": "Nuevo nombre", "Name can't be empty": "El nombre no puede estar vacío", @@ -450,13 +460,11 @@ "Contents": "Contenidos", "Headings you add to the document will appear here": "Los encabezados que añadas al documento aparecerán aquí", "Table of contents": "Tabla de contenido", - "Change role to admin": "Cambiar rol a administrador", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Cambiar rol a lector", "Change name": "Cambiar nombre", "Suspend user": "Suspender usuario", "An error occurred while sending the invite": "Ha ocurrido un error al enviar la invitación", "User options": "Opciones del usuario", + "Change role": "Change role", "Resend invite": "Reenviar invitación", "Revoke invite": "Revocar Invitación", "Activate user": "Activar usuario", @@ -654,15 +662,17 @@ "We sent out your invites!": "¡Hemos enviado tus invitaciones!", "Those email addresses are already invited": "Esas direcciones de correo electrónico ya están invitadas", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Lo sentimos, solo puedes enviar {{MAX_INVITES}} invitaciones a la vez", - "Invited members will receive access to": "Los miembros invitados recibirán acceso a", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "Colección/es {{collectionCount}}", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invita a miembros del equipo o invitados a unirse a tu espacio de trabajo. Ellos podrán iniciar sesión con {{signinMethods}} o usar su dirección de correo electrónico.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invita a miembros del equipo o invitados a unirse a tu espacio de trabajo. Ellos deberán iniciar sesión con {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Como administrador, también puedes <2>habilitar el inicio de sesión por correo electrónico.", - "Want a link to share directly with your team?": "¿Quieres un enlace para compartir directamente con tu equipo?", - "Email": "Correo electrónico", + "Invite as": "Invite as", "Role": "Rol", - "Remove invite": "Eliminar invitación", + "Email": "Correo electrónico", "Add another": "Agregar otro", "Inviting": "Invitando", "Send Invites": "Enviar invitaciones", @@ -701,6 +711,9 @@ "Continue with Email": "Continuar con el correo electrónico", "Continue with {{ authProviderName }}": "Continuar con {{ authProviderName }}", "Back to home": "Volver al inicio", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdominio", "The domain associated with your email address has not been allowed for this workspace.": "El dominio asociado con tu dirección de correo electrónico no está permitido para este espacio de trabajo.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "No se pudo iniciar sesión. Por favor, ve a la URL personalizada de tu espacio de trabajo e intenta iniciar sesión de nuevo.<1>Si has sido invitado a un espacio de trabajo, encontrarás un enlace a este en el correo electrónico de invitación.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Lo sentimos, no se puede crear una nueva cuenta con una dirección de correo electrónico personal de Gmail.<1>Por favor, utilice una cuenta de Google Workspaces en su lugar.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Su dominio personalizado está apuntando a Outline exitosamente. Para completar el proceso de configuración, ponte en contacto con soporte.", "Choose workspace": "Seleccionar espacio de trabajo", "This login method requires choosing your workspace to continue": "Este método de inicio de sesión requiere elegir tu espacio de trabajo para continuar", - "subdomain": "subdominio", "Check your email": "Revisa tu correo electrónico", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Se ha enviado un enlace mágico de inicio de sesión al correo electrónico {{ emailLinkSentTo }} si una cuenta asociada existe.", "Back to login": "Volver al inicio de sesión", @@ -760,6 +772,10 @@ "Copied": "Copiado", "Revoking": "Revocando", "Are you sure you want to revoke the {{ tokenName }} token?": "¿Estás seguro de que quieres revocar el token {{ tokenName }}?", + "Disconnect integration": "Disconnect integration", + "Connected": "Conectado", + "Disconnect": "Desconectar", + "Disconnecting": "Disconnecting", "Allowed domains": "Dominios permitidos", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Los dominios que deberían poder crear nuevas cuentas usando SSO. Cambiar esta configuración no afecta a las cuentas de usuario existentes.", "Remove domain": "Eliminar dominio", @@ -789,6 +805,7 @@ "Where do I find the file?": "¿Dónde encuentro el archivo?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "En Notion, haz clic en Configuración y miembros en la barra lateral izquierda y abre Configuración. Busca la sección Exportar y haz clic en Exportar todo el contenido del espacio de trabajo. Elige HTML como formato para la mejor compatibilidad de datos.", "Last active": "Última vez activo", + "Guest": "Guest", "Shared": "Compartido", "by {{ name }}": "por {{ name }}", "Last accessed": "Ultimo acceso", @@ -796,8 +813,10 @@ "Date shared": "Fecha en que se compartió", "Domain": "Dominio", "Views": "Vistas", - "Everyone": "Todos", + "All roles": "All roles", "Admins": "Administradores", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Configuración guardada", "Logo updated": "Logo actualizado", "Unable to upload new logo": "No se pudo cargar el nuevo logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importar páginas de una instancia de Confluence", "Enterprise": "Enterprise", "Recent imports": "Importaciones recientes", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Todos los que han iniciado sesión en {{appName}} aparecen aquí. Es posible que haya otros usuarios que tengan acceso a través de {team.signinMethods} pero que aún no hayan iniciado sesión.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtro", "Receive a notification whenever a new document is published": "Recibir notificaciones cuando se publique un nuevo documento", "Document updated": "Documento actualizado", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Los nuevos usuarios primero tendrán que ser invitados para crear una cuenta. El rol predeterminado y los dominios permitidos ya no serán aplicables.", "Settings that impact the access, security, and content of your workspace.": "Configuraciones que impactan el acceso, seguridad y contenido de tu espacio de trabajo.", "Allow members to sign-in with {{ authProvider }}": "Permitir que los miembros inicien sesión con {{ authProvider }}", - "Connected": "Conectado", "Disabled": "Deshabilitado", "Allow members to sign-in using their email address": "Permitir que los miembros inicien sesión usando su dirección de correo electrónico", "The server must have SMTP configured to enable this setting": "El servidor debe tener SMTP configurado para habilitar esta opción", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Los enlaces a los servicios soportados se muestran como embeds enriquecidos dentro de tus documentos", "Collection creation": "Creación de colección", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Despliegue de Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Añada aquí la URL de su instancia de draw.io autoalojada para habilitar el embed automático de diagramas en los documentos.", "Grist deployment": "Despliegue de Grist", @@ -933,6 +953,7 @@ "Workspace name": "Nombre del espacio de trabajo", "You are creating a new workspace using your current account — {{email}}": "Estás creando un nuevo espacio de trabajo usando tu cuenta actual — {{email}}", "To create a workspace under another email please sign up from the homepage": "Para crear un espacio de trabajo bajo otro correo electrónico, por favor regístrate desde la página de inicio", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "La papelera está vacía en este momento.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Un código de confirmación ha sido enviado a tu dirección de correo electrónico, por favor ingresa el código a continuación para eliminar permanentemente tu cuenta.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "¿Estás seguro? Eliminar tu cuenta destruirá los datos de identificación asociados con tu usuario y no se puede deshacer. Se cerrará inmediatamente tu sesión de {{appName}} y se revocarán todos tus tokens de API.", @@ -943,25 +964,37 @@ "This month": "Este mes", "Last month": "El mes pasado", "This year": "Este año", + "Connect": "Conectar", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Ocurrió un error autenticando tu solicitud. Por favor, intenta iniciar sesión de nuevo.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Añadir a Slack", "document published": "documento publicado", "document updated": "documento actualizado", "Posting to the {{ channelName }} channel on": "Publicando al canal {{ channelName }} en", "These events should be posted to Slack": "Estos eventos deben publicarse en Slack", - "Disconnect": "Desconectar", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Ups, debes aceptar los permisos en Slack para conectar {{appName}} a tu espacio de trabajo. ¿Intentar de nuevo?", - "Something went wrong while authenticating your request. Please try logging in again.": "Ocurrió un error autenticando tu solicitud. Por favor, intenta iniciar sesión de nuevo.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Obtén vistas previas enriquecidas de los enlaces de {{ appName }} compartidos en Slack y usa el comando {{ command }} para buscar documentos sin salir de tu chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Conecta las colecciones de {{appName}} a canales de Slack. Se publicarán mensajes automáticamente en Slack cuando los documentos se publiquen o actualicen.", - "Connect": "Conectar", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "La integración de Slack está deshabilitada actualmente. Configura las variables de entorno asociadas y reinicia el servidor para habilitar la integración.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Cómo utilizar {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Para buscar en tu espacio de trabajo usa {{ command }}. \nEscribe {{ command2 }} help para mostrar este texto de ayuda.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Lo sentimos, no hemos podido encontrar una integración para tu equipo. Dirígete a la configuración de {{ appName }} para configurarla.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Parece que aún no has iniciado sesión en {{ appName }}, por lo que los resultados pueden ser limitados", "Post to Channel": "Publicar en Canal", "This is what we found for \"{{ term }}\"": "Esto es lo que encontramos para \"{{ term }}\"", "No results for \"{{ term }}\"": "Sin resultados para \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "¿Estás seguro de que quieres eliminar el webhook {{ name }}?", "Webhook updated": "Webhook actualizado", "Update": "Actualizar", diff --git a/shared/i18n/locales/fa_IR/translation.json b/shared/i18n/locales/fa_IR/translation.json index a73acafeaf9f..fb19eb1d3600 100644 --- a/shared/i18n/locales/fa_IR/translation.json +++ b/shared/i18n/locales/fa_IR/translation.json @@ -79,6 +79,7 @@ "Templates": "قالب‌ها", "Notifications": "اعلان‌ها", "Preferences": "تنظیمات", + "Documentation": "Documentation", "API documentation": "مستندات API", "Toggle sidebar": "تغییر وضعیت نوار کنار صفحه", "Send us feedback": "ارسال بازخورد", @@ -101,7 +102,12 @@ "Select a workspace": "انتخاب فضای کاری", "New workspace": "فضای کار جدید", "Create a workspace": "فضای کاری ایجاد کنید", + "Login to workspace": "Login to workspace", "Invite people": "دعوت از افراد", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "حذف کاربر", "Collection": "مجموعه", "Debug": "دیباگ", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "حذف", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} member", "{{ count }} member_plural": "{{ count }} members", "Group members": "اعضای گروه", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "نمایش منو", "Choose icon": "انتخاب نماد", "Loading": "بارگذاری", @@ -309,11 +318,12 @@ "No results": "بدون نتیجه", "Previous page": "صفحه قبلی", "Next page": "صفحه بعدی", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "آیا مطمئن هستید که می‌خواهید {{ userName }} را ناظر نمایید؟ ناظران امکان ویرایش محتوایی را ندارند", - "Are you sure you want to make {{ userName }} a member?": "آیا مطمئن هستید که می‌خواهید {{ userName }} را عضو نمایید؟", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "فهمیدم، حذف کن", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "آیا مطمئن هستید که می‌خواهید {{ userName }} را مدیر کنید؟ مدیران می‌توانند اطلاعات تیم و صورتحساب را تغییر دهند.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "محتوا", "Headings you add to the document will appear here": "عناوینی که به سند اضافه می‌کنید اینجا نمایش داده می‌شوند", "Table of contents": "فهرست مطالب", - "Change role to admin": "Change role to admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Change role to viewer", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "گزینه‌های کاربر", + "Change role": "Change role", "Resend invite": "Resend invite", "Revoke invite": "حذف دعوت", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "دعوت‌نامه‌های شما ارسال شد!", "Those email addresses are already invited": "Those email addresses are already invited", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "متأسفانه شما تنها می‌توانید {{MAX_INVITES}} دعوت‌نامه به صورت همزمان ارسال نمایید", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "به عنوان مدیر همچنین می‌توانید <2>ورود به سیستم با ایمیل را فعال نمایید.", - "Want a link to share directly with your team?": "آیا پیوندی برای اشتراک مستقیم با تیم خود می‌خواهید؟", - "Email": "ایمیل", + "Invite as": "Invite as", "Role": "نقش", - "Remove invite": "حذف دعوت‌نامه", + "Email": "ایمیل", "Add another": "افزودن یک مورد دیگر", "Inviting": "در حال دعوت", "Send Invites": "ارسال دعوت‌نامه‌ها", @@ -701,6 +711,9 @@ "Continue with Email": "ادامه با ایمیل", "Continue with {{ authProviderName }}": "با {{ authProviderName }} ادامه دهید", "Back to home": "بازگشت به خانه", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "ایمیل خود را بررسی کنید", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "بازگشت به صفحه ورود", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "قطع اتصال", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Where do I find the file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.", "Last active": "آخرین فعالیت", + "Guest": "Guest", "Shared": "اشتراک گذاشته شده", "by {{ name }}": "توسط {{ name }}", "Last accessed": "آخرین دسترسی", @@ -796,8 +813,10 @@ "Date shared": "Date shared", "Domain": "Domain", "Views": "Views", - "Everyone": "همه", + "All roles": "All roles", "Admins": "مدیران", + "Editors": "Editors", + "All status": "All status", "Settings saved": "تنظیمات ذخیره شد", "Logo updated": "لوگو به روز شد", "Unable to upload new logo": "امکان بارگذاری لوگوی جدید وجود نداشت", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "وارد کردن صفحات از یک نمونه Confluence", "Enterprise": "Enterprise", "Recent imports": "وارد شده‌های اخیر", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "فیلتر", "Receive a notification whenever a new document is published": "هر زمان سند جدیدی منتشر شد، اعلانی دریافت کنید", "Document updated": "به‌روزرسانی سند", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "برای استفاده از این تنظیمات، سرور باید تنظیمات SMTP را داشته باشد", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "پیوندها به سایت‌ها و سرویس‌های پشتیبانی شده به صورت جاسازی‌های غنی در سندها نمایش داده می‌شود", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "سطل زباله در حال حاضر خالی است.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "این ماه", "Last month": "ماه قبل", "This year": "امسال", + "Connect": "اتصال", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "افزودن به Slack", "document published": "سند منتشر شد", "document updated": "سند به روز شد", "Posting to the {{ channelName }} channel on": "پست کردن در کانال {{ channelName }}", "These events should be posted to Slack": "این رویدادها باید در Slack پست شوند", - "Disconnect": "قطع اتصال", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "اتصال", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "ادغام Slack غیرفعال است. لطفاً متغیرهای محیطی مربوطه را تنظیم کرده و سرور را دوباره راه‌اندازی کنید تا اعلان‌ها را فعال کنید.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/fr_FR/translation.json b/shared/i18n/locales/fr_FR/translation.json index c424278c1590..202c809c748b 100644 --- a/shared/i18n/locales/fr_FR/translation.json +++ b/shared/i18n/locales/fr_FR/translation.json @@ -25,7 +25,7 @@ "Published {{ documentName }}": "Publication de {{ documentName }}", "Publish document": "Publier le document", "Unpublish": "Dépublier", - "Unpublished {{ documentName }}": "Dépublication de {{ documentName }}", + "Unpublished {{ documentName }}": "{{ documentName }} retiré", "Subscribe": "S'abonner", "Subscribed to document notifications": "Abonné aux notifications du document", "Unsubscribe": "Se désabonner", @@ -34,11 +34,11 @@ "Share this document": "Partager ce document", "HTML": "HTML", "PDF": "PDF", - "Exporting": "Export en cours", + "Exporting": "Exportation en cours", "Markdown": "Markdown", "Download": "Télécharger", "Download document": "Télécharger le document", - "Copy as Markdown": "Copier en Markdown", + "Copy as Markdown": "Copier en tant que Markdown", "Markdown copied to clipboard": "Markdown copié dans le presse-papier", "Copy link": "Copier le lien", "Link copied to clipboard": "Lien copié dans le presse-papiers", @@ -50,7 +50,7 @@ "Pin to {{collectionName}}": "Épingler à {{collectionName}}", "Pinned to collection": "Épinglé à la collection", "Pin to home": "Épingler sur la page d'accueil", - "Pinned to home": "Épinglé à l'écran d'accueil", + "Pinned to home": "Épinglé à l'accueil", "Pin": "Épingler", "Print": "Imprimer", "Print document": "Imprimer le document", @@ -69,8 +69,8 @@ "Comments": "Commentaires", "History": "Historique", "Insights": "Analyses", - "Disable viewer insights": "Disable viewer insights", - "Enable viewer insights": "Enable viewer insights", + "Disable viewer insights": "Désactiver le visualisateur d'analyses", + "Enable viewer insights": "Activer le visualisateur d'analyses", "Home": "Accueil", "Drafts": "Brouillons", "Trash": "Corbeille", @@ -79,6 +79,7 @@ "Templates": "Modèles", "Notifications": "Notifications", "Preferences": "Préférences", + "Documentation": "Documentation", "API documentation": "Documentation de l'API", "Toggle sidebar": "Afficher/Masquer la barre latérale", "Send us feedback": "Donnez-nous votre avis", @@ -96,12 +97,17 @@ "System": "Système", "Appearance": "Apparence", "Change theme": "Changer le thème", - "Change theme to": "Changer le thème pour", + "Change theme to": "Changer vers le thème", "Switch workspace": "Changer d'espace de travail", "Select a workspace": "Sélectionner un espace de travail", "New workspace": "Nouvel espace de travail", "Create a workspace": "Créer un espace de travail", + "Login to workspace": "Login to workspace", "Invite people": "Inviter des personnes", + "Invite to workspace": "Inviter à l'espace de travail", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Supprimer l’utilisateur", "Collection": "Collection", "Debug": "Débogage", @@ -139,7 +145,7 @@ "Are you sure you want to permanently delete this entire comment thread?": "Êtes-vous sûr de vouloir supprimer définitivement ce fil de commentaires ?", "Are you sure you want to permanently delete this comment?": "Êtes-vous sûr de vouloir supprimer définitivement ce commentaire ?", "Confirm": "Confirmer", - "Document is too large": "Le document est trop volumineux", + "Document is too large": "Le document est trop grand", "This document has reached the maximum size and can no longer be edited": "Ce document a atteint la taille maximale et ne peut plus être modifié", "Authentication failed": "L'authentification a échoué", "Please try logging out and back in again": "Veuillez essayer de vous déconnecter et de vous reconnecter", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Vu il y a {{ timeAgo }}", "Copy of {{ documentName }}": "Copie de {{ documentName }}", "Title": "Titre", + "Published": "Published", "Include nested documents": "Inclure les documents imbriqués", "Emoji Picker": "Sélecteur d'émojis", "Remove": "Supprimer", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} membre", "{{ count }} member_plural": "{{ count }} membres", "Group members": "Membres du groupe", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Afficher le menu", "Choose icon": "Choisir une icône", "Loading": "Chargement", @@ -309,11 +318,12 @@ "No results": "Aucun résultat", "Previous page": "Page précédente", "Next page": "Page suivante", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Êtes-vous sûr de vouloir faire de {{ userName }} un utilisateur en lecture seule ? Il ne sera pas en mesure de modifier de contenu", - "Are you sure you want to make {{ userName }} a member?": "Êtes-vous sûr de vouloir faire de {{ userName }} un membre ?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "J’ai compris, supprimer", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Êtes-vous sûr de vouloir supprimer définitivement {{ userName }} ? Cette opération est irréversible, envisagez plutôt de suspendre l'utilisateur.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Voulez-vous vraiment faire de {{ userName }} un administrateur ? Les administrateurs peuvent modifier les équipes et la facturation.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Voulez-vous vraiment suspendre {{ userName }} ? Les utilisateurs suspendus ne pourront plus se connecter.", "New name": "Nouveau nom", "Name can't be empty": "Le champ Nom ne peut pas être vide", @@ -450,13 +460,11 @@ "Contents": "Contenu", "Headings you add to the document will appear here": "Les titres que vous ajoutez au document apparaîtront ici", "Table of contents": "Table des matières", - "Change role to admin": "Changer le rôle en administrateur", - "Change role to editor": "Changer le rôle en éditeur", - "Change role to viewer": "Changer le rôle en lecteur", "Change name": "Changement de nom", "Suspend user": "Suspendre l'Utilisateur", "An error occurred while sending the invite": "Une erreur est survenue lors de l'envoi de l'invitation", "User options": "Options utilisateur", + "Change role": "Change role", "Resend invite": "Renvoyer l'invitation", "Revoke invite": "Révoquer l'invitation", "Activate user": "Activer l'utilisateur", @@ -654,15 +662,17 @@ "We sent out your invites!": "Nous avons envoyé vos invitations !", "Those email addresses are already invited": "Un lien d'invitation a déjà été envoyé à ces adresses email", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Désolé, vous pouvez seulement envoyer {{MAX_INVITES}} invitations à la fois", - "Invited members will receive access to": "Les membres invités auront accès à", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invitez des membres ou des invités à rejoindre votre espace de travail. Ils peuvent se connecter avec {{signinMethods}} ou utiliser leur adresse e-mail.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invitez des membres à rejoindre votre espace de travail. Ils devront se connecter avec {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "En tant qu'administrateur, vous pouvez également <2>activer la connexion par e-mail .", - "Want a link to share directly with your team?": "Vous voulez un lien à partager directement avec votre équipe ?", - "Email": "E-mail", + "Invite as": "Invite as", "Role": "Rôle", - "Remove invite": "Supprimer l'invitation", + "Email": "E-mail", "Add another": "En ajouter une autre", "Inviting": "Invitation en cours", "Send Invites": "Envoyer les invitations", @@ -701,6 +711,9 @@ "Continue with Email": "Continuer avec un e-mail", "Continue with {{ authProviderName }}": "Continuer avec {{ authProviderName }}", "Back to home": "Retour à l’accueil", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "sous-domaine", "The domain associated with your email address has not been allowed for this workspace.": "Le domaine associé à votre adresse e-mail n'a pas été autorisé pour cet espace de travail.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Impossible de se connecter. Veuillez accéder à l'URL personnalisée de votre espace de travail, puis réessayez de vous connecter.<1> Si vous avez été invité à rejoindre un espace de travail, vous trouverez un lien vers celui-ci dans l'e-mail d'invitation.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Désolé, un nouveau compte ne peut pas être créé avec une adresse Gmail personnelle.<1> Veuillez plutôt utiliser un compte Google Workspaces.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Votre domaine personnalisé pointe avec succès sur Outline. Pour terminer le processus d'installation, veuillez contacter le support.", "Choose workspace": "Choisir un espace de travail", "This login method requires choosing your workspace to continue": "Cette méthode de connexion nécessite de choisir votre espace de travail pour continuer", - "subdomain": "sous-domaine", "Check your email": "Vérifiez votre messagerie", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Si cet utilisateur existe, un lien de connexion automatique lui a été envoyé sur {{ emailLinkSentTo }}.", "Back to login": "Retour à la page d'identification", @@ -760,6 +772,10 @@ "Copied": "Copié", "Revoking": "Supression en cours", "Are you sure you want to revoke the {{ tokenName }} token?": "Voulez-vous vraiment supprimer le jeton {{ tokenName }}?", + "Disconnect integration": "Déconnecter l'intégration", + "Connected": "Connecté", + "Disconnect": "Se déconnecter", + "Disconnecting": "Déconnexion en cours", "Allowed domains": "Domaines autorisés", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Domaines autorisés à créer de nouveaux comptes en utilisant le SSO. La modification de ce paramètre n'affecte pas les comptes d'utilisateurs existants.", "Remove domain": "Supprimer le domaine", @@ -789,6 +805,7 @@ "Where do I find the file?": "Où se trouve le fichier ?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Dans Notion, cliquez sur Paramètres & Membres dans la barre latérale gauche et ouvrez Paramètres. Recherchez la section Exportation, puis cliquez sur Exporter tout le contenu de l'espace de travail. Choisissez HTML comme format pour la meilleure compatibilité des données.", "Last active": "Dernière activité", + "Guest": "Guest", "Shared": "Partagé", "by {{ name }}": "par {{ name }}", "Last accessed": "Dernier accès", @@ -796,8 +813,10 @@ "Date shared": "Date du partage", "Domain": "Domaine", "Views": "Vues", - "Everyone": "Tout le monde", + "All roles": "All roles", "Admins": "Administrateurs", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Paramètres enregistrés", "Logo updated": "Logo mis à jour", "Unable to upload new logo": "Impossible de charger le logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importer des pages depuis une instance Confluence", "Enterprise": "Entreprise", "Recent imports": "Importé récemment", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Toutes les personnes qui se sont connectées à {{appName}} s'affichent ici. Il est possible que d'autres utilisateurs aient accès via {team.signinMethods} mais ne se soient pas encore connectés.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtre", "Receive a notification whenever a new document is published": "Recevez une notification chaque fois qu'un nouveau document est publié", "Document updated": "Document mis à jour", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Les nouveaux utilisateurs devront être invités pour pouvoir créer un compte. Le Rôle par défaut et les Domaines autorisés ne s'appliqueront plus.", "Settings that impact the access, security, and content of your workspace.": "Paramètres agissant sur l'accès, la sécurité et le contenu de votre espace de travail.", "Allow members to sign-in with {{ authProvider }}": "Autoriser les membres à se connecter avec {{ authProvider }}", - "Connected": "Connecté", "Disabled": "Désactivé", "Allow members to sign-in using their email address": "Autoriser les membres à se connecter en utilisant leur adresse e-mail", "The server must have SMTP configured to enable this setting": "Le serveur doit avoir SMTP configuré pour activer ce paramètre", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Les liens vers les services pris en charge sont affichés comme des intégrations avancées", "Collection creation": "Création de collections", "Allow editors to create new collections within the workspace": "Autoriser les éditeurs à créer de nouvelles collections dans l'espace de travail", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Déploiement de Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Ajoutez ici l'url de votre installation draw.io auto-hébergée pour activer l'intégration automatique des diagrammes dans les documents.", "Grist deployment": "Déploiement Grist", @@ -933,6 +953,7 @@ "Workspace name": "Nom de l'espace de travail", "You are creating a new workspace using your current account — {{email}}": "Vous êtes en train de créer un nouvel espace de travail avec votre compte actuel — {{email}}", "To create a workspace under another email please sign up from the homepage": "Pour créer un espace de travail sous une autre adresse e-mail, veuillez vous inscrire sur la page d'accueil", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "La corbeille est vide pour le moment.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Un code de confirmation a été envoyé à votre adresse e-mail, veuillez saisir le code ci-dessous pour supprimer définitivement votre compte.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Êtes-vous sûr ? La suppression de votre compte détruira les données d'identification associées à votre utilisateur et ne pourra pas être annulé. Vous serez immédiatement déconnecté de {{appName}} et tous vos jetons API seront révoqués.", @@ -943,25 +964,37 @@ "This month": "Ce mois-ci", "Last month": "Le mois dernier", "This year": "Cette année", + "Connect": "Se connecter", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Une erreur s'est produite lors de l'authentification de votre requête. Veuillez essayer de vous connecter à nouveau.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Ajouter à Slack", "document published": "document publié", "document updated": "document mis à jour", "Posting to the {{ channelName }} channel on": "Envoi sur le canal {{ channelName }}", "These events should be posted to Slack": "Ces événements doivent être publiés sur Slack", - "Disconnect": "Se déconnecter", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Oups, vous devez accepter les autorisations dans Slack pour connecter {{appName}} à votre espace de travail. Réessayer ?", - "Something went wrong while authenticating your request. Please try logging in again.": "Une erreur s'est produite lors de l'authentification de votre requête. Veuillez essayer de vous connecter à nouveau.", + "Personal account": "Compte personnel", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Commande Slash", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Obtenez un aperçu complets des liens {{ appName }} partagés dans Slack et utilisez la commande {{ command }} pour chercher des documents sans quitter la discussion.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "Cela supprimera la commande slash Outline de votre espace de travail Slack. Êtes-vous sûr ?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connectez les collections {{appName}} aux canaux Slack . Les messages seront automatiquement publiés sur Slack lorsque des documents sont publiés ou mis à jour.", - "Connect": "Se connecter", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "L'intégration de Slack est actuellement désactivée. Veuillez définir les variables d'environnement associées et redémarrer le serveur pour activer l'intégration.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Comment utiliser {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Pour rechercher dans votre espace de travail, utilisez {{ command }}. \nAppuyez sur {{ command2 }} pour afficher ce texte d'aide.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Désolé, nous n'avons pas trouvé d'intégration pour votre équipe. Rendez-vous dans vos paramètres {{ appName }} pour en configurer un.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Il semble que vous ne vous soyez pas encore authentifié à {{ appName }} , les résultats peuvent donc être limités", "Post to Channel": "Publier sur le canal", "This is what we found for \"{{ term }}\"": "Voici ce que nous avons trouvé pour \"{{ term }}\"", "No results for \"{{ term }}\"": "Aucun résultat pour {{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "Il semble que vous n’ayez pas encore lié votre compte {{ appName }} à Slack", + "Link your account": "Associer votre compte", + "Link your account in {{ appName }} settings to search from Slack": "Lier votre compte dans les paramètres de {{ appName }} pour rechercher depuis Slack", "Are you sure you want to delete the {{ name }} webhook?": "Êtes-vous sûr de vouloir supprimer le webhook {{ name }}?", "Webhook updated": "Le webhook a été mis à jour", "Update": "Actualiser", diff --git a/shared/i18n/locales/he_IL/translation.json b/shared/i18n/locales/he_IL/translation.json index 83874f5c1ead..95f362379d2d 100644 --- a/shared/i18n/locales/he_IL/translation.json +++ b/shared/i18n/locales/he_IL/translation.json @@ -79,6 +79,7 @@ "Templates": "Templates", "Notifications": "Notifications", "Preferences": "Preferences", + "Documentation": "Documentation", "API documentation": "API documentation", "Toggle sidebar": "Toggle sidebar", "Send us feedback": "Send us feedback", @@ -101,7 +102,12 @@ "Select a workspace": "Select a workspace", "New workspace": "New workspace", "Create a workspace": "Create a workspace", + "Login to workspace": "Login to workspace", "Invite people": "Invite people", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Delete user", "Collection": "Collection", "Debug": "Debug", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Remove", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} member", "{{ count }} member_plural": "{{ count }} members", "Group members": "Group members", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Show menu", "Choose icon": "Choose icon", "Loading": "Loading", @@ -309,11 +318,12 @@ "No results": "No results", "Previous page": "Previous page", "Next page": "Next page", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content", - "Are you sure you want to make {{ userName }} a member?": "Are you sure you want to make {{ userName }} a member?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "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 suspend {{ userName }}? Suspended users will be prevented from logging in.": "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "Contents", "Headings you add to the document will appear here": "Headings you add to the document will appear here", "Table of contents": "Table of contents", - "Change role to admin": "Change role to admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Change role to viewer", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "User options", + "Change role": "Change role", "Resend invite": "Resend invite", "Revoke invite": "Revoke invite", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "We sent out your invites!", "Those email addresses are already invited": "Those email addresses are already invited", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Sorry, you can only send {{MAX_INVITES}} invites at a time", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "As an admin you can also <2>enable email sign-in.", - "Want a link to share directly with your team?": "Want a link to share directly with your team?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Role", - "Remove invite": "Remove invite", + "Email": "Email", "Add another": "Add another", "Inviting": "Inviting", "Send Invites": "Send Invites", @@ -701,6 +711,9 @@ "Continue with Email": "Continue with Email", "Continue with {{ authProviderName }}": "Continue with {{ authProviderName }}", "Back to home": "Back to home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Check your email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "Back to login", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "Disconnect", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Where do I find the file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.", "Last active": "Last active", + "Guest": "Guest", "Shared": "Shared", "by {{ name }}": "by {{ name }}", "Last accessed": "Last accessed", @@ -796,8 +813,10 @@ "Date shared": "Date shared", "Domain": "Domain", "Views": "Views", - "Everyone": "Everyone", + "All roles": "All roles", "Admins": "Admins", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Settings saved", "Logo updated": "Logo updated", "Unable to upload new logo": "Unable to upload new logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Import pages from a Confluence instance", "Enterprise": "Enterprise", "Recent imports": "Recent imports", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "The server must have SMTP configured to enable this setting", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links to supported services are shown as rich embeds within your documents", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Trash is empty at the moment.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "This month", "Last month": "Last month", "This year": "This year", + "Connect": "Connect", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Add to Slack", "document published": "document published", "document updated": "document updated", "Posting to the {{ channelName }} channel on": "Posting to the {{ channelName }} channel on", "These events should be posted to Slack": "These events should be posted to Slack", - "Disconnect": "Disconnect", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "Connect", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/hu_HU/translation.json b/shared/i18n/locales/hu_HU/translation.json index fe2f970182d4..13d1824ddd12 100644 --- a/shared/i18n/locales/hu_HU/translation.json +++ b/shared/i18n/locales/hu_HU/translation.json @@ -79,6 +79,7 @@ "Templates": "Sablonok", "Notifications": "Értesítések", "Preferences": "Testreszabás", + "Documentation": "Documentation", "API documentation": "API dokumentáció", "Toggle sidebar": "Oldalsáv váltása", "Send us feedback": "Visszajelzés küldése", @@ -101,7 +102,12 @@ "Select a workspace": "Válasszon munkaterületet", "New workspace": "Új munkaterület", "Create a workspace": "Munkaterület létrehozása", + "Login to workspace": "Login to workspace", "Invite people": "Mások meghívása", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Felhasználó törlése", "Collection": "Gyűjtemény", "Debug": "Hibakeresés", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Megtekintve: {{ timeAgo }}", "Copy of {{ documentName }}": "{{ documentName }} másolata", "Title": "Cím", + "Published": "Published", "Include nested documents": "Beágyazott dokumentumokkal együtt", "Emoji Picker": "Emoji választó", "Remove": "Eltávolítás", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} tag", "{{ count }} member_plural": "{{ count }} tag", "Group members": "Csoport tagok", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Menü megjelenítése", "Choose icon": "Válasszon ikont", "Loading": "Betöltés", @@ -309,11 +318,12 @@ "No results": "Nincs találat", "Previous page": "Előző oldal", "Next page": "Következő oldal", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Bizhogy, hogy {{ userName }} csak olvasó/megtekintő legyen? Nem tud majd semmilyen tartalmat szerkeszteni", - "Are you sure you want to make {{ userName }} a member?": "Biztos, hogy {{ userName }} tag legyen?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Megértettem, töröljük", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Biztos, hogy {{ userName }} véglegesen törölve legyen? Ez a művelet nem vonható vissza, fontolja meg a felfüggesztést helyette.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Biztos, hogy {{ userName }} adminisztrátor legyen? Az adminisztrátorok módosíthatják a csapatot és a számlázási információkat.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Bizthogy, hogy {{ userName }} fel legyen függesztve? A felfüggesztett felhasználók belépni sem tudnak.", "New name": "Új név", "Name can't be empty": "A név nem lehet üres", @@ -450,13 +460,11 @@ "Contents": "Tartalom", "Headings you add to the document will appear here": "A dokumentumhoz adott főcímek itt jelennek meg", "Table of contents": "Tartalomjegyzék", - "Change role to admin": "Szerepkör admin-ra váltása", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Szerepkör nézőre váltása", "Change name": "Név módosítása", "Suspend user": "Felfüggesztett felhasználó", "An error occurred while sending the invite": "Valami hiba történt a meghívó küldése közben", "User options": "Felhasználó beállításai", + "Change role": "Change role", "Resend invite": "Meghívó újraküldése", "Revoke invite": "Meghívó visszavonása", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "We sent out your invites!", "Those email addresses are already invited": "Those email addresses are already invited", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Sorry, you can only send {{MAX_INVITES}} invites at a time", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "As an admin you can also <2>enable email sign-in.", - "Want a link to share directly with your team?": "Want a link to share directly with your team?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Szerepkör", - "Remove invite": "Remove invite", + "Email": "Email", "Add another": "Add another", "Inviting": "Inviting", "Send Invites": "Send Invites", @@ -701,6 +711,9 @@ "Continue with Email": "Continue with Email", "Continue with {{ authProviderName }}": "Continue with {{ authProviderName }}", "Back to home": "Back to home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Check your email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "Back to login", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "Disconnect", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Where do I find the file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.", "Last active": "Last active", + "Guest": "Guest", "Shared": "Shared", "by {{ name }}": "by {{ name }}", "Last accessed": "Last accessed", @@ -796,8 +813,10 @@ "Date shared": "Date shared", "Domain": "Domain", "Views": "Megtekintések", - "Everyone": "Everyone", + "All roles": "All roles", "Admins": "Admins", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Settings saved", "Logo updated": "Logo updated", "Unable to upload new logo": "Unable to upload new logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Import pages from a Confluence instance", "Enterprise": "Enterprise", "Recent imports": "Recent imports", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "The server must have SMTP configured to enable this setting", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links to supported services are shown as rich embeds within your documents", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Trash is empty at the moment.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "This month", "Last month": "Last month", "This year": "This year", + "Connect": "Connect", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Add to Slack", "document published": "document published", "document updated": "document updated", "Posting to the {{ channelName }} channel on": "Posting to the {{ channelName }} channel on", "These events should be posted to Slack": "These events should be posted to Slack", - "Disconnect": "Disconnect", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "Connect", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/id_ID/translation.json b/shared/i18n/locales/id_ID/translation.json index 14d15b72fd69..ce821291e350 100644 --- a/shared/i18n/locales/id_ID/translation.json +++ b/shared/i18n/locales/id_ID/translation.json @@ -79,6 +79,7 @@ "Templates": "Template", "Notifications": "Notifikasi", "Preferences": "Preferensi", + "Documentation": "Documentation", "API documentation": "Dokumentasi API", "Toggle sidebar": "Buka sidebar", "Send us feedback": "Kirimkan kami masukan", @@ -101,7 +102,12 @@ "Select a workspace": "Pilih ruang kerja", "New workspace": "Ruang kerja baru", "Create a workspace": "Buat ruang kerja", + "Login to workspace": "Login to workspace", "Invite people": "Undang orang", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Hapus Pengguna", "Collection": "Koleksi", "Debug": "Debug", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Hapus", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} anggota", "{{ count }} member_plural": "{{ count }} anggota", "Group members": "Anggota grup", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Tampilkan menu", "Choose icon": "Pilih ikon", "Loading": "Memuat", @@ -309,11 +318,12 @@ "No results": "Tak ada hasil", "Previous page": "Halaman sebelumnya", "Next page": "Halaman berikutnya", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Anda yakin ingin menjadikan {{ userName }} sebagai read-only viewer? Mereka tidak akan dapat mengedit konten apa pun", - "Are you sure you want to make {{ userName }} a member?": "Apakah Anda yakin ingin menjadikan {{ userName }} sebagai anggota?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Saya mengerti, hapus", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Anda yakin ingin menghapus {{ userName }} secara permanen? Operasi ini tidak dapat dipulihkan, sebagai gantinya pertimbangkan untuk menangguhkan pengguna.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Apa Anda yakin ingin membuat {{ userName }} seorang admin? Admin dapat mengubah informasi tim dan informasi tagihan.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Anda yakin ingin menangguhkan {{ userName }}? Pengguna yang ditangguhkan akan dicegah untuk masuk.", "New name": "Nama baru", "Name can't be empty": "Nama tidak boleh kosong", @@ -450,13 +460,11 @@ "Contents": "Isi", "Headings you add to the document will appear here": "Judul yang Anda tambahkan ke dokumen akan muncul di sini", "Table of contents": "Daftar isi", - "Change role to admin": "Ubah peran menjadi admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Ubah peran menjadi viewer", "Change name": "Ganti Nama", "Suspend user": "Tangguhkan pengguna", "An error occurred while sending the invite": "Terjadi kesalahan saat mengirim undangan", "User options": "Opsi pengguna", + "Change role": "Change role", "Resend invite": "Kirim ulang undangan", "Revoke invite": "Tarik undangan", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Kami mengirimkan undangan Anda!", "Those email addresses are already invited": "Alamat email tersebut sudah diundang", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Maaf, Anda hanya dapat mengirim {{MAX_INVITES}} undangan sekaligus", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Undang anggota atau tamu untuk bergabung dengan workspace Anda. Mereka dapat masuk dengan {{signinMethods}} atau menggunakan alamat email mereka.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Undang anggota untuk bergabung dengan workspace Anda. Mereka harus masuk dengan {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Sebagai admin, Anda juga dapat <2>mengaktifkan email sign-in.", - "Want a link to share directly with your team?": "Ingin tautan untuk dibagikan langsung dengan tim Anda?", - "Email": "Surel", + "Invite as": "Invite as", "Role": "Peran", - "Remove invite": "Hapus undangan", + "Email": "Surel", "Add another": "Tambah lagi", "Inviting": "Mengundang", "Send Invites": "Kirim undangan", @@ -701,6 +711,9 @@ "Continue with Email": "Lanjutkan dengan Surel", "Continue with {{ authProviderName }}": "Lanjutkan dengan {{ authProviderName }}", "Back to home": "Kembali ke beranda", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "Domain yang dikaitkan dengan alamat email Anda belum diizinkan untuk workspace ini.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Tidak dapat masuk. Buka URL khusus workspace Anda, lalu coba masuk lagi.<1> Jika Anda diundang ke workspace, Anda akan menemukan tautan ke workspace tersebut di email undangan.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Maaf, akun baru tidak dapat dibuat dengan alamat Gmail pribadi.<1> Harap gunakan akun Google Workspaces sebagai gantinya.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Domain kustom Anda berhasil diarahkan ke Outline. Untuk menyelesaikan proses penyiapan, silakan hubungi admin support.", "Choose workspace": "Pilih workspace", "This login method requires choosing your workspace to continue": "Metode login ini mengharuskan memilih workspace Anda untuk melanjutkan", - "subdomain": "subdomain", "Check your email": "Periksa surel Anda", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Tautan ajaib untuk masuk sudah dikirim ke {{ emailLinkSentTo }} jika akun tersebut ada.", "Back to login": "Kembali ke Login", @@ -760,6 +772,10 @@ "Copied": "Disalin", "Revoking": "Mencabut", "Are you sure you want to revoke the {{ tokenName }} token?": "Apakah Anda yakin ingin mencabut token {{ tokenName }}?", + "Disconnect integration": "Disconnect integration", + "Connected": "Terhubung", + "Disconnect": "Memutuskan", + "Disconnecting": "Disconnecting", "Allowed domains": "Domain yang diizinkan", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Domain yang seharusnya diizinkan untuk membuat akun baru menggunakan SSO. Mengubah setelan ini tidak memengaruhi akun pengguna yang ada.", "Remove domain": "Hapus domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Di mana saya menemukan file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Di Notion, klik Pengaturan & Anggota di sidebar kiri dan buka Pengaturan. Cari bagian Export, dan klik Export all workspace content. Pilih HTML sebagai format untuk kompatibilitas data terbaik.", "Last active": "Terakhir aktif", + "Guest": "Guest", "Shared": "Dibagikan", "by {{ name }}": "oleh {{ name }}", "Last accessed": "Terakhir diakses", @@ -796,8 +813,10 @@ "Date shared": "Tanggal dibagikan", "Domain": "Domain", "Views": "Dilihat", - "Everyone": "Semua orang", + "All roles": "All roles", "Admins": "Admin", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Pengaturan disimpan", "Logo updated": "Logo diperbarui", "Unable to upload new logo": "Tidak dapat mengunggah logo baru", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Impor halaman dari instansi Confluence", "Enterprise": "Enterprise", "Recent imports": "Impor terbaru", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Setiap orang yang masuk ke {{appName}} terdaftar di sini. Mungkin ada pengguna lain yang memiliki akses melalui {team.signinMethods} tetapi belum masuk.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Terima pemberitahuan setiap kali dokumen baru diterbitkan", "Document updated": "Dokumen diperbarui", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Pengguna baru pertama-tama harus diundang untuk membuat akun. Peran default dan Domain yang diizinkan tidak akan berlaku lagi.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Izinkan anggota untuk masuk dengan {{ authProvider }}", - "Connected": "Terhubung", "Disabled": "Dinonaktifkan", "Allow members to sign-in using their email address": "Izinkan anggota untuk masuk menggunakan alamat email mereka", "The server must have SMTP configured to enable this setting": "Server harus memiliki konfigurasi SMTP untuk mengaktifkan setelan ini", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Tautan ke layanan yang didukung ditampilkan sebagai Rich Embeds dalam dokumen Anda", "Collection creation": "Pembuatan koleksi", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Deploy Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Tambahkan url penginstalan draw.io yang dihosting sendiri di sini untuk mengaktifkan penyematan otomatis diagram di dalam dokumen.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Nama Workspace", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Sampah kosong saat ini.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Anda yakin? Menghapus akun Anda akan menghancurkan data pengidentifikasi yang terkait dengan pengguna Anda dan tidak dapat dibatalkan. Anda akan segera keluar dari {{appName}} dan semua token API Anda akan dicabut.", @@ -943,25 +964,37 @@ "This month": "Bulan ini", "Last month": "Bulan lalu", "This year": "Tahun ini", + "Connect": "Hubungkan", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Tambahkan ke Slack", "document published": "dokumen diterbitkan", "document updated": "dokumen diperbarui", "Posting to the {{ channelName }} channel on": "Posting ke saluran {{ channelName }}", "These events should be posted to Slack": "Event ini akan diposting ke Slack", - "Disconnect": "Memutuskan", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Dapatkan pratinjau kaya dari {{ appName }} tautan yang dibagikan di Slack dan gunakan perintah garis miring {{ command }} untuk mencari dokumen tanpa meninggalkan obrolan Anda.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Hubungkan {{appName}} koleksi ke saluran Slack. Pesan akan diposting secara otomatis ke Slack saat dokumen diterbitkan atau diperbarui.", - "Connect": "Hubungkan", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Integrasi Slack saat ini dinonaktifkan. Harap atur variabel lingkungan terkait dan mulai ulang server untuk mengaktifkan integrasi.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Maaf, kami tidak dapat menemukan integrasi untuk tim Anda. Buka pengaturan {{ appName }} Anda untuk menyiapkannya.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Sepertinya Anda belum masuk ke {{ appName }} , hasil yang Anda lihat mungkin terbatas", "Post to Channel": "Posting ke Saluran", "This is what we found for \"{{ term }}\"": "Ini yang kami temukan untuk \"{{ term }}\"", "No results for \"{{ term }}\"": "Tidak ada hasil untuk \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Anda yakin ingin menghapus {{ name }} webhook?", "Webhook updated": "Webhook diperbarui", "Update": "Perbarui", diff --git a/shared/i18n/locales/it_IT/translation.json b/shared/i18n/locales/it_IT/translation.json index 93cfff2051c9..0c37a41a7eb0 100644 --- a/shared/i18n/locales/it_IT/translation.json +++ b/shared/i18n/locales/it_IT/translation.json @@ -79,6 +79,7 @@ "Templates": "Templates", "Notifications": "Notifiche", "Preferences": "Impostazioni", + "Documentation": "Documentation", "API documentation": "Documentazione API", "Toggle sidebar": "Mostra/nascondi barra laterale", "Send us feedback": "Inviaci il tuo feedback", @@ -101,7 +102,12 @@ "Select a workspace": "Seleziona un'area di lavoro", "New workspace": "Nuova area di lavoro", "Create a workspace": "Crea area di lavoro", + "Login to workspace": "Login to workspace", "Invite people": "Invita persone", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Delete user", "Collection": "Raccolta", "Debug": "Debug", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Elimina", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} membro", "{{ count }} member_plural": "{{ count }} membri", "Group members": "Membri del gruppo", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Mostra menu", "Choose icon": "Scegli icona", "Loading": "Caricamento in corso", @@ -309,11 +318,12 @@ "No results": "Nessun risultato", "Previous page": "Pagina precedente", "Next page": "Pagina successiva", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Sei sicuro di voler impostare {{ userName }} in sola lettura? Non potrà modificare i contenuti", - "Are you sure you want to make {{ userName }} a member?": "Sei sicuro di voler rendere {{ userName }} un membro?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Sei sicuro di voler rendere {{ userName }} un amministratore? Gli amministratori possono modificare le informazioni sul team e sulla fatturazione.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Sei sicuro di voler sospendere {{ userName }}? Gli utenti sospesi non potranno accedere.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "Contenuti", "Headings you add to the document will appear here": "Le intestazioni aggiunte al documento appariranno qui", "Table of contents": "Indice contenuti", - "Change role to admin": "Cambia ruolo in amministratore", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Cambia ruolo in visualizzatore", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "Si è verificato un errore durante l’invio dell'invito", "User options": "Opzioni utente", + "Change role": "Change role", "Resend invite": "Invia nuovamente l'invito", "Revoke invite": "Revoca invito", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Abbiamo inviato i tuoi inviti!", "Those email addresses are already invited": "Agli indirizzi email è stato già inviato un invito", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Spiacenti, puoi inviare solo {{MAX_INVITES}} inviti alla volta", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invita membri od ospiti a unirsi alla tua area di lavoro. Possono accedere con {{signinMethods}} o utilizzare il loro indirizzo email.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invita membri a unirsi alla tua area di lavoro. Dovranno accedere con {{signinMethods}} o utilizzare il loro indirizzo email.", "As an admin you can also <2>enable email sign-in.": "Come amministratore puoi anche <2>abilitare l'autenticazione via email.", - "Want a link to share directly with your team?": "Vuoi un link per condividere direttamente con il tuo team?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Ruolo", - "Remove invite": "Rimuovi invito", + "Email": "Email", "Add another": "Aggiungi ancora", "Inviting": "Sto invitando", "Send Invites": "Spedisci gli inviti", @@ -701,6 +711,9 @@ "Continue with Email": "Continua con email", "Continue with {{ authProviderName }}": "Continua con {{ authProviderName }}", "Back to home": "Torna alla home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "Il dominio associato al tuo indirizzo email non è permesso in questa area di lavoro.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Impossibile effettuare l'accesso. Per favore vai all'URL personalizzato della tua area di lavoro, quindi prova di nuovo ad accedere.<1>Se sei stato invitato in un'area di lavoro, troverai un link di accesso nella mail d'invito.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Spiacenti, non è possibile creare un nuovo account con un indirizzo Gmail personale.<1>Utilizza invece un account Google Workspaces.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Il tuo dominio personalizzato punta con successo a Outline. Per completare il processo d'installazione contatta il supporto.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Controlla la tua email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Un link di accesso è stato inviato all'email {{ emailLinkSentTo }} se esiste un account associato.", "Back to login": "Torna all'accesso", @@ -760,6 +772,10 @@ "Copied": "Copiato", "Revoking": "Sto revocando", "Are you sure you want to revoke the {{ tokenName }} token?": "Sei sicuro di voler revocare il token {{ tokenName }}?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connesso", + "Disconnect": "Disconnetti", + "Disconnecting": "Disconnecting", "Allowed domains": "Domini consentiti", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "I domini che dovrebbero essere autorizzati a creare nuovi account utilizzando SSO. La modifica di questa impostazione non influisce sugli utenti esistenti.", "Remove domain": "Rimuovi dominio", @@ -789,6 +805,7 @@ "Where do I find the file?": "Dove trovo il file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, fai clic su Settings & Members nella barra laterale sinistra e apri Settings. Cerca la sezione Export content e fai clic su Export all workspace content. Scegli HTML come formato per la migliore compatibilità dei dati.", "Last active": "Ultima attività", + "Guest": "Guest", "Shared": "Condiviso", "by {{ name }}": "da {{ name }}", "Last accessed": "Ultima visita", @@ -796,8 +813,10 @@ "Date shared": "Data condivisa", "Domain": "Domain", "Views": "Visualizzazioni", - "Everyone": "Tutti", + "All roles": "All roles", "Admins": "Amministratori", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Impostazioni salvate", "Logo updated": "Logo aggiornato", "Unable to upload new logo": "Impossibile caricare il nuovo logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importa pagine da un'istanza di Confluence", "Enterprise": "Enterprise", "Recent imports": "Importazioni recenti", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Tutti coloro che hanno effettuato l'accesso a {{appName}} vengono visualizzati qui. È possibile che ci siano altri utenti che possono accedere tramite {team.signinMethods} ma non hanno ancora effettuato il login.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtro", "Receive a notification whenever a new document is published": "Ricevi una notifica ogni volta che viene pubblicato un nuovo documento", "Document updated": "Documento aggiornato", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "I nuovi utenti dovranno prima essere invitati a creare un account. Le opzioni Ruolo predefinito e Domini consentiti non saranno più applicabili.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Consenti ai membri di accedere con {{ authProvider }}", - "Connected": "Connesso", "Disabled": "Disattivato", "Allow members to sign-in using their email address": "Consenti ai membri di accedere utilizzando il loro indirizzo email", "The server must have SMTP configured to enable this setting": "Il server deve disporre di SMTP configurato per abilitare questa impostazione", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "I link ai servizi supportati vengono incorporati all'interno dei tuoi documenti", "Collection creation": "Creazione delle raccolte", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Distribuzione Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Aggiungi l'URL d'installazione di draw.io per abilitare l'incorporazione automatica dei diagrammi all'interno dei documenti.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Nome dell'area di lavoro", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Al momento il cestino è vuoto.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Sei sicuro? L'eliminazione del tuo account distruggerà i dati identificativi associati al tuo utente e non può essere annullata. Verrai immediatamente disconnesso da {{appName}} e tutti i tuoi token API verranno revocati.", @@ -943,25 +964,37 @@ "This month": "Questo mese", "Last month": "Mese scorso", "This year": "Quest'anno", + "Connect": "Connetti", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Aggiungi a Slack", "document published": "documento pubblicato", "document updated": "documento aggiornato", "Posting to the {{ channelName }} channel on": "Pubblicazione sul canale {{ channelName }} su", "These events should be posted to Slack": "Questi eventi dovrebbero essere pubblicati su Slack", - "Disconnect": "Disconnetti", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Ottieni anteprime dei link {{ appName }} condivisi in Slack e usa il comando slash {{ command }} per cercare documenti senza uscire dalla chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Collega le raccolte di {{appName}} ai canali Slack e i messaggi verranno automaticamente pubblicati su Slack quando i documenti vengono pubblicati o aggiornati.", - "Connect": "Connetti", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "L'integrazione Slack è attualmente disabilitata. Impostare le variabili di ambiente associate e riavviare il server per abilitare l'integrazione.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Spiacenti, non siamo riusciti a trovare un'integrazione per il tuo team. Vai sulle impostazioni di {{ appName }} per impostarne una.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Sembra che tu non abbia ancora effettuato l'accesso a {{ appName }}, i risultati potrebbero essere limitati", "Post to Channel": "Pubblica sul Canale", "This is what we found for \"{{ term }}\"": "Questo è quanto trovato per \"{{ term }}\"", "No results for \"{{ term }}\"": "Nessun risultato per {{ term }}", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Sei sicuro di voler eliminare il webhook {{ name }}?", "Webhook updated": "Webhook aggiornato", "Update": "Aggiorna", diff --git a/shared/i18n/locales/ja_JP/translation.json b/shared/i18n/locales/ja_JP/translation.json index 0b1261b70d1d..b116925ccb62 100644 --- a/shared/i18n/locales/ja_JP/translation.json +++ b/shared/i18n/locales/ja_JP/translation.json @@ -79,6 +79,7 @@ "Templates": "テンプレート", "Notifications": "通知", "Preferences": "設定", + "Documentation": "Documentation", "API documentation": "API ドキュメント", "Toggle sidebar": "サイドバーを切り替え", "Send us feedback": "フィードバック", @@ -101,7 +102,12 @@ "Select a workspace": "ワークスペースを選択", "New workspace": "新しいワークスペース", "Create a workspace": "ワークスペースを作成", + "Login to workspace": "Login to workspace", "Invite people": "他の人を招待", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "ユーザーを削除", "Collection": "コレクション", "Debug": "デバッグ", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "{{ timeAgo }} 前に見た", "Copy of {{ documentName }}": "{{ documentName }} をコピー", "Title": "タイトル", + "Published": "Published", "Include nested documents": "入れ子になったドキュメントを含める", "Emoji Picker": "絵文字の選択", "Remove": "削除", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} 人のメンバー", "{{ count }} member_plural": "{{ count }} 人のメンバー", "Group members": "グループのメンバー", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "メニューを表示", "Choose icon": "アイコンの選択", "Loading": "ローディング", @@ -309,11 +318,12 @@ "No results": "検索結果はありません", "Previous page": "前のページ", "Next page": "次のページ", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "{{ userName }} を読み取り専用ビューアにしますか。コンテンツを編集することはできなくなります。", - "Are you sure you want to make {{ userName }} a member?": "本当に{{ userName }}をメンバーにしていいのか?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "わかりました、削除します", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "{{ userName }} を完全に削除してもよろしいですか?この操作を元に戻すことはできません。代わりにユーザーを一時停止することを検討してください。", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "本当に{{ userName }}を管理者にしていいのか?管理者は課金情報を修正することができます。また、チームを変更することもできます。", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "{{ userName }} を停止してもよろしいですか? これにより、ユーザーはログインできなくなります。", "New name": "新しい名前", "Name can't be empty": "名前を空にすることはできません", @@ -450,13 +460,11 @@ "Contents": "Contents", "Headings you add to the document will appear here": "ドキュメントに追加した見出しがここに表示されます", "Table of contents": "目次", - "Change role to admin": "管理者に変更", - "Change role to editor": "Change role to editor", - "Change role to viewer": "閲覧者に変更", "Change name": "名前の変更", "Suspend user": "ユーザーの利用停止", "An error occurred while sending the invite": "招待状の送信にエラーが発生しました。", "User options": "ユーザーオプション", + "Change role": "Change role", "Resend invite": "招待を再送信", "Revoke invite": "招待を取り消す", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "招待状を送信しました!", "Those email addresses are already invited": "これらのメールアドレスは、すでに招待されています。", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "一度に送信できる招待状は最大{{MAX_INVITES}}枚までです。", - "Invited members will receive access to": "招待されたメンバーは次のメンバーにアクセスできます:", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} コレクション", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "メンバーやゲストをワークスペースに招待します。 {{signinMethods}} でサインインするか、メール アドレスを使用できます。", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "メンバーをワークスペースに招待します。 {{signinMethods}} でサインインする必要があります。", "As an admin you can also <2>enable email sign-in.": "管理者として、<2>電子メールによるサインインを有効にすることもできます。", - "Want a link to share directly with your team?": "チーム内で直接共有するためのURLが必要ですか?", - "Email": "メール", + "Invite as": "Invite as", "Role": "ロール", - "Remove invite": "招待を削除", + "Email": "メール", "Add another": "更に追加", "Inviting": "招待中", "Send Invites": "招待を送信する", @@ -701,6 +711,9 @@ "Continue with Email": "Eメールで続行", "Continue with {{ authProviderName }}": "{{ authProviderName }} でログイン", "Back to home": "ホームへ戻る", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "サブドメイン", "The domain associated with your email address has not been allowed for this workspace.": "メールアドレスに関連付けられたドメインは、このワークスペースで許可されていません。", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "サインインできません。ワークスペースのカスタム URL に移動し、再度サインインしてみてください。<1>ワークスペースに招待された場合、招待メールにリンクが表示されます。", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "申し訳ありませんが、個人のGmailアドレスで新しいアカウントを作成することはできません。<1>代わりにGoogle Workspaceのアカウントを使用してください。", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "カスタムドメインは正常にOutlineを認識しています。セットアッププロセスを完了するには、サポートにお問い合わせください。", "Choose workspace": "ワークスペースを選択", "This login method requires choosing your workspace to continue": "現在のログインでは、ワークスペースを選択して続行する必要があります", - "subdomain": "サブドメイン", "Check your email": "メールをご確認ください", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "{{ emailLinkSentTo }}がこのインスタンスにアカウントを登録している場合、そのアドレスにサインイン用のURLがメールで送信されているはずです。", "Back to login": "ログイン画面に戻る", @@ -760,6 +772,10 @@ "Copied": "コピーしました", "Revoking": "取り消し中", "Are you sure you want to revoke the {{ tokenName }} token?": "{{ tokenName }}トークンを失効させようとしています。本当にいいんですか?", + "Disconnect integration": "Disconnect integration", + "Connected": "接続されました", + "Disconnect": "接続を解除", + "Disconnecting": "Disconnecting", "Allowed domains": "許可されているドメイン", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "SSO を使用して新しいアカウントを作成できるドメイン。この設定を変更しても、既存のユーザー アカウントには影響しません。", "Remove domain": "ドメインを削除", @@ -789,6 +805,7 @@ "Where do I find the file?": "ファイルはどこにありますか?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Notionの場合、左側のサイドバーにある 設定 & メンバー をクリックし、設定を開きます。 エクスポートセクションを探し、 すべてのワークスペースコンテンツをエクスポートをクリックします。最高のデータ互換性を得るには、形式として HTML を選択します。", "Last active": "最終ログイン", + "Guest": "Guest", "Shared": "共有済み", "by {{ name }}": "{{ name }}", "Last accessed": "最終アクセス", @@ -796,8 +813,10 @@ "Date shared": "共有日", "Domain": "ドメイン", "Views": "閲覧数", - "Everyone": "すべてのユーザー", + "All roles": "All roles", "Admins": "管理者", + "Editors": "Editors", + "All status": "All status", "Settings saved": "設定が保存されました", "Logo updated": "ロゴが更新されました", "Unable to upload new logo": "ロゴをアップロードできませんでした", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Confluenceからコンテンツをインポートする", "Enterprise": "エンタープライズ", "Recent imports": "最近のインポート", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "{{appName}} にサインインしたことのあるすべてのユーザーがここに表示されています。{team.signinMethods} での認証は可能だが、まだサインインはしていないユーザーがいる可能性があります。", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "フィルター", "Receive a notification whenever a new document is published": "新しいドキュメントが公開されたら、メッセージを受信する", "Document updated": "ドキュメントが更新されました", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "新しいユーザーは、最初にアカウントを作成するために招待される必要があります。 デフォルトのロール および 許可されたドメイン は適用されなくなります。", "Settings that impact the access, security, and content of your workspace.": "ワークスペースのアクセス、セキュリティ、およびコンテンツに影響する設定。", "Allow members to sign-in with {{ authProvider }}": "メンバーが {{ authProvider }} でサインインできるようにする", - "Connected": "接続されました", "Disabled": "無効化済み", "Allow members to sign-in using their email address": "メンバーが自分のメール アドレスを使用してサインインできるようにする", "The server must have SMTP configured to enable this setting": "この設定を有効にするには、サーバーにSMTPが設定されている必要があります。", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "サポートされたURLは、ドキュメント内にリッチエンベッドとして表示されます。", "Collection creation": "コレクションの作成", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.ioのデプロイ", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "自己ホスト型の draw.io インストール Url をここに追加して、ドキュメント内の図の自動埋め込みを有効にします。", "Grist deployment": "Gristのデプロイ", @@ -933,6 +953,7 @@ "Workspace name": "ワークスペース名", "You are creating a new workspace using your current account — {{email}}": "現在のアカウントを使用して新しいワークスペースを作成しています — {{email}}", "To create a workspace under another email please sign up from the homepage": "別のメールアドレスでワークスペースを作成するには、ホームページからサインアップしてください", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "ゴミ箱には何もない", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "認証用のコードがメールアドレスに送信されました。認証コードを入力してアカウントを削除してください。", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "アカウントを削除すると、あなたのユーザーに関連付けられている識別データが破壊され、元に戻すことはできません。すぐに{{appName}} からログアウトされ、すべてのAPIトークンが無効になります。よろしいですか?", @@ -943,25 +964,37 @@ "This month": "今月", "Last month": "先月", "This year": "今年", + "Connect": "接続", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "リクエストの認証中に問題が発生しました。もう一度ログインしてみてください。", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "スラックに追加", "document published": "ドキュメントの公開", "document updated": "ドキュメントの更新", "Posting to the {{ channelName }} channel on": "{{ channelName }} チャンネルへ投稿", "These events should be posted to Slack": "これらのイベントは Slack に投稿する必要があります", - "Disconnect": "接続を解除", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "{{appName}} をワークスペースに接続するには、Slack で権限を受け入れる必要があります。 もう一度やり直しますか?", - "Something went wrong while authenticating your request. Please try logging in again.": "リクエストの認証中に問題が発生しました。もう一度ログインしてみてください。", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Slackで共有された{{ appName }} のリンクのプレビューを取得し、チャットを離れずにドキュメントを検索するには、{{ command }} スラッシュコマンドを使用してください。", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "{{appName}} コレクションを Slack のチャンネルに接続します。ドキュメントが公開または更新されると、メッセージは Slack に自動的に投稿されます。", - "Connect": "接続", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "現在、Slackとの連携は無効になっています。関連する環境変数を正しく設定し、サーバを再起動することで統合が可能になります。", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "{{ command }} の使用方法", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "ワークスペースを検索するには、 {{ command }} を使用します。\n {{ command2 }} と入力するとこのヘルプテキストを表示します。", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "申し訳ありませんが、チームとの連携が見つかりませんでした。 {{ appName }} の設定に進み、セットアップしてください。", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "{{ appName }} にサインインしていないようです。結果が制限されている可能性があります。", "Post to Channel": "チャンネルに投稿", "This is what we found for \"{{ term }}\"": "これは \"{{ term }}\" の結果です", "No results for \"{{ term }}\"": "{{ term }} に該当する検索結果はありませんでした。", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "「{{ name }}」 という名前のWebhookを削除しようとしています。本当にこれで良いのでしょうか?", "Webhook updated": "Webhookを更新しました", "Update": "更新", diff --git a/shared/i18n/locales/ko_KR/translation.json b/shared/i18n/locales/ko_KR/translation.json index e016c7cf768d..3f6d214b4486 100644 --- a/shared/i18n/locales/ko_KR/translation.json +++ b/shared/i18n/locales/ko_KR/translation.json @@ -79,6 +79,7 @@ "Templates": "템플릿", "Notifications": "알림", "Preferences": "기본 설정", + "Documentation": "Documentation", "API documentation": "API 문서", "Toggle sidebar": "사이드바 전환", "Send us feedback": "의견 보내기", @@ -101,7 +102,12 @@ "Select a workspace": "워크스페이스 선택", "New workspace": "새 워크스페이스", "Create a workspace": "워크스페이스 만들기", + "Login to workspace": "Login to workspace", "Invite people": "초대하기", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "사용자 삭제", "Collection": "컬렉션", "Debug": "디버그", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "전에 봄 {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "제목", + "Published": "Published", "Include nested documents": "중첩된 문서 포함", "Emoji Picker": "이모지 선택기", "Remove": "제거", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }}명", "{{ count }} member_plural": "{{ count }}명", "Group members": "그룹 구성원", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "메뉴 보기", "Choose icon": "아이콘 선택", "Loading": "로딩 중", @@ -309,11 +318,12 @@ "No results": "결과 없음", "Previous page": "이전 페이지", "Next page": "다음 페이지", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "{{ userName }} 을 뷰어로 바꾸시겠습니까? 해당 사용자는 내용을 수정할 수 없습니다", - "Are you sure you want to make {{ userName }} a member?": "정말로 {{ userName }} 에게 멤버 권한을 부여 하시겠습니까?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "이해했으며, 삭제합니다.", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "{{ userName }} 를 영구 삭제하시겠습니까? 이 작업은 복구할 수 없으므로 대신 사용자를 일시 정지하는 것이 좋습니다.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "정말로 {{ userName }} 에게 관리자 권한을 부여 하시겠습니까? 관리자는 팀과 결제 정보를 수정할 수 있습니다.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "{{ userName }} 계정 사용을 중지 하시겠습니까? 중지된 사용자는 로그인 할 수 없습니다.", "New name": "새 이름", "Name can't be empty": "이름은 비어 있을 수 없습니다.", @@ -450,13 +460,11 @@ "Contents": "콘텐츠", "Headings you add to the document will appear here": "문서에 추가한 제목이 여기에 표시됩니다.", "Table of contents": "목차", - "Change role to admin": "관리자 권한으로 변경", - "Change role to editor": "Change role to editor", - "Change role to viewer": "뷰어 권한으로 변경", "Change name": "이름 변경", "Suspend user": "사용자 일시 정지", "An error occurred while sending the invite": "초대를 보내는 중 오류가 발생했습니다.", "User options": "사용자 옵션", + "Change role": "Change role", "Resend invite": "초대 재전송", "Revoke invite": "초대 취소", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "초대장을 보냈습니다!", "Those email addresses are already invited": "해당 이메일 주소는 이미 초대되어 있습니다.", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "죄송합니다. 한 번에 {{MAX_INVITES}} 명만 초대할 수 있습니다.", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "워크스페이스에 참여하도록 멤버나 게스트를 초대합니다. 멤버는 {{signinMethods}} 혹은 이메일 주소를 통해 가입할 수 있습니다.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "워크스페이스에 참여하도록 멤버를 초대합니다. {{signinMethods}} 으로 로그인해야 합니다.", "As an admin you can also <2>enable email sign-in.": "관리자는 <2>이메일 로그인을 활성화를 할 수 있습니다.", - "Want a link to share directly with your team?": "직접 공유할 수 있는 링크를 원하십니까?", - "Email": "이메일", + "Invite as": "Invite as", "Role": "역할", - "Remove invite": "초대 제거", + "Email": "이메일", "Add another": "사용자 추가 초대", "Inviting": "초대 중", "Send Invites": "초대 보내기", @@ -701,6 +711,9 @@ "Continue with Email": "이메일로 계속하기", "Continue with {{ authProviderName }}": "{{ authProviderName }} 사용하여 계속하기", "Back to home": "홈으로 돌아가기", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "하위 도메인", "The domain associated with your email address has not been allowed for this workspace.": "귀하의 이메일 주소와 연결된 도메인이 이 워크스페이스에 허용되지 않았습니다.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "로그인할 수 없습니다. 워크스페이스의 맞춤 URL로 이동한 다음 다시 로그인을 시도하세요.<1> 워크스페이스에 초대받은 경우 초대 이메일에서 해당 링크를 찾을 수 있습니다.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "죄송합니다. 개인 Gmail 주소로는 새 계정을 만들 수 없습니다.<1> 대신 Google Workspaces 계정을 사용하세요.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "사용자 지정 도메인이 성공적으로 Outline을 가리키고 있습니다. 설정 프로세스를 완료하려면 지원팀에 문의하세요.", "Choose workspace": "워크스페이스 선택", "This login method requires choosing your workspace to continue": "이 로그인 방법으로 계속하려면 워크스페이스를 선택해야 합니다.", - "subdomain": "하위 도메인", "Check your email": "이메일을 확인하십시오", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "계정이 있는 경우 로그인 가능한 매직 링크가 이메일 {{ emailLinkSentTo }} 로 전송되었습니다.", "Back to login": "로그인으로 돌아가기", @@ -760,6 +772,10 @@ "Copied": "복사됨", "Revoking": "취소", "Are you sure you want to revoke the {{ tokenName }} token?": "{{ tokenName }} 토큰을 취소하시겠습니까?", + "Disconnect integration": "Disconnect integration", + "Connected": "연결됨", + "Disconnect": "연결 해제", + "Disconnecting": "Disconnecting", "Allowed domains": "허용된 도메인", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "SSO를 사용하여 새 계정을 만들 수 있도록 허용해야 하는 도메인입니다. 이 설정을 변경해도 기존 사용자 계정에는 영향을 미치지 않습니다.", "Remove domain": "도메인 삭제", @@ -789,6 +805,7 @@ "Where do I find the file?": "파일은 어디에서 찾을 수 있습니까?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Notion에서 왼쪽 사이드바의 Settings & Members 클릭하고 Settings를 엽니다. 내보내기 섹션을 찾고 모든 작업 공간 콘텐츠 내보내기클릭하십시오. 최상의 데이터 호환성을 위해선 HTML 선택하십시오.", "Last active": "최근 활동", + "Guest": "Guest", "Shared": "공유됨", "by {{ name }}": "{{ name }} 설정", "Last accessed": "마지막으로 액세스", @@ -796,8 +813,10 @@ "Date shared": "공유 날짜", "Domain": "Domain", "Views": "열람", - "Everyone": "모두", + "All roles": "All roles", "Admins": "관리자", + "Editors": "Editors", + "All status": "All status", "Settings saved": "설정이 저장되었습니다", "Logo updated": "로고 업데이트됨", "Unable to upload new logo": "새 로고를 업로드할 수 없습니다.", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Confluence 인스턴스에서 페이지 가져오기", "Enterprise": "엔터프라이즈", "Recent imports": "최근에 가져온", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "{{appName}} 에 로그인한 모든 사람이 여기에 나열됩니다. {team.signinMethods} 을 통해서도 접근할 수 있지만, 아직 로그인하지 않은 다른 사용자가 있을 수도 있습니다.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "필터", "Receive a notification whenever a new document is published": "새 문서가 게시될 때마다 알림을 받습니다", "Document updated": "문서 업데이트됨", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "계정을 만들려면 먼저 새 사용자를 초대해야 합니다. 기본 역할허용된 도메인 은 더 이상 적용되지 않습니다.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "멤버가 {{ authProvider }} 으로 로그인하도록 허용", - "Connected": "연결됨", "Disabled": "비활성화됨", "Allow members to sign-in using their email address": "멤버가 이메일 주소를 사용하여 로그인하도록 허용", "The server must have SMTP configured to enable this setting": "이 설정을 사용하려면 서버에 SMTP가 구성되어 있어야 합니다.", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "지원되는 서비스에 대한 링크는 문서 내에서 확장 임베딩으로 표시됩니다", "Collection creation": "컬렉션 생성됨", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io 설치", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "여기에 자체 호스팅된 draw.io의 URL을 추가하여 문서 내에 다이어그램을 자동으로 삽입할 수 있습니다.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "워크스페이스명", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "현재 휴지통이 비어 있습니다.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "정말 계정을 삭제하시겠습니까? 계정을 삭제하면 계정과 연관된 식별 데이터가 삭제되며 되돌려질 수 없습니다. 계속할 경우 {{appName}} 에서 즉시 로그아웃되며 발급된 모든 API 토큰은 삭제됩니다.", @@ -943,25 +964,37 @@ "This month": "이번 달", "Last month": "지난 달", "This year": "올해", + "Connect": "연결", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Slack에 추가", "document published": "문서 게시됨", "document updated": "문서 업데이트됨", "Posting to the {{ channelName }} channel on": "{{ channelName }}의 채널에 게시", "These events should be posted to Slack": "이러한 이벤트는 Slack에 게시되어야 합니다.", - "Disconnect": "연결 해제", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "죄송합니다. {{appName}} 을 워크스페이스에 연결하려면 Slack에서 권한을 수락해야 합니다. 다시 시도하시겠습니까?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Slack에서 공유되는 {{ appName }} 링크에 대한 미리보기를 받고 {{ command }} 슬래시 명령을 사용하여 채팅에서 문서를 검색하세요.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "{{appName}} 컬렉션을 Slack 채널에 연결합니다. 문서가 게시되거나 업데이트되면 메시지가 자동으로 Slack에 게시됩니다.", - "Connect": "연결", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Slack 통합은 현재 비활성화되어 있습니다. 관련 환경 변수를 설정하고 서버를 다시 시작하여 통합을 활성화하십시오.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "{{ command }} 사용 방법", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "죄송합니다. 귀하의 팀에 대한 통합을 찾을 수 없습니다. 설정하려면 {{ appName }} 설정으로 이동하세요.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "아직 {{ appName }} 에 로그인하지 않은 것 같아서 결과가 제한될 수 있습니다.", "Post to Channel": "채널에 게시하기", "This is what we found for \"{{ term }}\"": "\"{{ term }}\"에 대해 찾은 것입니다.", "No results for \"{{ term }}\"": "{{ term }} 에 대한 검색결과가 없습니다.", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "{{ name }} 웹훅을 삭제하시겠습니까?", "Webhook updated": "웹훅 업데이트됨", "Update": "변경하기", diff --git a/shared/i18n/locales/nb_NO/translation.json b/shared/i18n/locales/nb_NO/translation.json index 021627b7180f..0ed46e5db21d 100644 --- a/shared/i18n/locales/nb_NO/translation.json +++ b/shared/i18n/locales/nb_NO/translation.json @@ -79,6 +79,7 @@ "Templates": "Maler", "Notifications": "Varsler", "Preferences": "Preferanser", + "Documentation": "Documentation", "API documentation": "API-dokumentasjon", "Toggle sidebar": "Veksle sidefelt", "Send us feedback": "Send oss tilbakemelding", @@ -101,7 +102,12 @@ "Select a workspace": "Velg et arbeidsområde", "New workspace": "Nytt arbeidsområde", "Create a workspace": "Opprett et arbeidsområde", + "Login to workspace": "Login to workspace", "Invite people": "Inviter personer", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Slett bruker", "Collection": "Samling", "Debug": "Feilsøk", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Sett {{ timeAgo }}", "Copy of {{ documentName }}": "Kopi av {{ documentName }}", "Title": "Tittel", + "Published": "Published", "Include nested documents": "Inkluder underdokumenter", "Emoji Picker": "Emoji-velger", "Remove": "Fjern", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} medlem", "{{ count }} member_plural": "{{ count }} medlemmer", "Group members": "Gruppemedlemmer", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Vis meny", "Choose icon": "Velg ikon", "Loading": "Laster", @@ -309,11 +318,12 @@ "No results": "Ingen resultater", "Previous page": "Forrige side", "Next page": "Neste side", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Er du sikker på at du vil gjøre {{ userName }} til en skrivebeskyttet seer? De vil ikke kunne redigere noe innhold", - "Are you sure you want to make {{ userName }} a member?": "Er du sikker på at du vil gjøre {{ userName }} til et medlem?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Jeg forstår, slett", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Er du sikker på at du vil slette {{ userName }} permanent? Denne operasjonen kan ikke omgjøres, vurder å suspendere brukeren i stedet.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Er du sikker på at du vil gjøre {{ userName }} til en admin? Administratorer kan endre lag- og faktureringsinformasjon.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Er du sikker på at du vil suspendere {{ userName }}? Suspendering vil hindre brukeren i å logge inn.", "New name": "Nytt navn", "Name can't be empty": "Navn kan ikke være tomt", @@ -450,13 +460,11 @@ "Contents": "Innhold", "Headings you add to the document will appear here": "Overskrifter du legger til i dokumentet vil vises her", "Table of contents": "Innholdsfortegnelse", - "Change role to admin": "Endre rolle til admin", - "Change role to editor": "Endre rolle til redaktør", - "Change role to viewer": "Endre rolle til seer", "Change name": "Endre navn", "Suspend user": "Suspendere bruker", "An error occurred while sending the invite": "En feil oppstod under sending av invitasjonen", "User options": "Brukeralternativer", + "Change role": "Change role", "Resend invite": "Send invitasjon på nytt", "Revoke invite": "Opphev invitasjon", "Activate user": "Aktiver bruker", @@ -654,15 +662,17 @@ "We sent out your invites!": "Vi sendte ut dine invitasjoner!", "Those email addresses are already invited": "De e-postadressene er allerede invitert", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Beklager, du kan bare sende {{MAX_INVITES}} invitasjoner om gangen", - "Invited members will receive access to": "Inviterte medlemmer vil motta tilgang til", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} samlinger", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Inviter medlemmer eller gjester til å bli med i ditt arbeidsområde. De kan logge inn med {{signinMethods}} eller bruke sin e-postadresse.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Inviter medlemmer til å bli med i ditt arbeidsområde. De må logge inn med {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Som admin kan du også <2>aktivere e-postinnlogging.", - "Want a link to share directly with your team?": "Ønsker du en lenke for å dele direkte med teamet ditt?", - "Email": "E-post", + "Invite as": "Invite as", "Role": "Rolle", - "Remove invite": "Fjern invitasjon", + "Email": "E-post", "Add another": "Legg til en annen", "Inviting": "Inviterer", "Send Invites": "Send invitasjoner", @@ -701,6 +711,9 @@ "Continue with Email": "Fortsett med e-post", "Continue with {{ authProviderName }}": "Fortsett med {{ authProviderName }}", "Back to home": "Tilbake til hjem", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "underdomene", "The domain associated with your email address has not been allowed for this workspace.": "Domene tilknyttet din e-postadresse har ikke blitt tillatt for dette arbeidsområdet.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Kan ikke logge inn. Vennligst naviger til din arbeidsområdes tilpassede URL, og prøv å logge inn igjen.<1>Hvis du ble invitert til et arbeidsområde, finner du en lenke til det i invitasjons-e-posten.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Beklager, en ny konto kan ikke opprettes med en personlig Gmail-adresse.<1>Vennligst bruk en Google Workspaces-konto i stedet.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Ditt tilpassede domene peker vellykket på Outline. For å fullføre oppsettsprosessen, vennligst kontakt støtte.", "Choose workspace": "Velg arbeidsområde", "This login method requires choosing your workspace to continue": "Denne innloggingsmetoden krever at du velger arbeidsområdet ditt for å fortsette", - "subdomain": "underdomene", "Check your email": "Sjekk e-posten din", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "En magisk innloggingslenke har blitt sendt til e-posten {{ emailLinkSentTo }} hvis en konto eksisterer.", "Back to login": "Tilbake til innlogging", @@ -760,6 +772,10 @@ "Copied": "Kopiert", "Revoking": "Tilbakekaller", "Are you sure you want to revoke the {{ tokenName }} token?": "Er du sikker på at du vil tilbakekalle {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Tilkoblet", + "Disconnect": "Koble fra", + "Disconnecting": "Disconnecting", "Allowed domains": "Tillatte domener", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Domenene som skal tillates å opprette nye kontoer ved bruk av SSO. Å endre denne innstillingen påvirker ikke eksisterende brukerkontoer.", "Remove domain": "Fjern domene", @@ -789,6 +805,7 @@ "Where do I find the file?": "Hvor finner jeg filen?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "I Notion, klikk på Innstillinger & Medlemmer i venstre sidestolpe og åpne Innstillinger. Se etter eksportseksjonen og klikk på Eksporter alt arbeidsområdeinnhold. Velg HTML som format for best datakompatibilitet.", "Last active": "Sist aktiv", + "Guest": "Guest", "Shared": "Delt", "by {{ name }}": "av {{ name }}", "Last accessed": "Sist tilgjengelig", @@ -796,8 +813,10 @@ "Date shared": "Dato delt", "Domain": "Domene", "Views": "Visninger", - "Everyone": "Alle", + "All roles": "All roles", "Admins": "Administratorer", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Innstillinger lagret", "Logo updated": "Logo oppdatert", "Unable to upload new logo": "Kan ikke laste opp ny logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importer sider fra en Confluence-instans", "Enterprise": "Bedrift", "Recent imports": "Nylige importer", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Alle som har logget inn i {{appName}} er oppført her. Det er mulig at det er andre brukere som har tilgang gjennom {team.signinMethods}, men som ennå ikke har logget inn.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Motta et varsel hver gang et nytt dokument blir publisert", "Document updated": "Dokument oppdatert", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Nye brukere må først inviteres for å opprette en konto. Standardrolle og Tillatte domener vil ikke lenger gjelde.", "Settings that impact the access, security, and content of your workspace.": "Innstillinger som påvirker tilgang, sikkerhet og innhold i arbeidsområdet ditt.", "Allow members to sign-in with {{ authProvider }}": "Tillat medlemmer å logge inn med {{ authProvider }}", - "Connected": "Tilkoblet", "Disabled": "Deaktivert", "Allow members to sign-in using their email address": "Tillat medlemmer å logge inn med sin e-postadresse", "The server must have SMTP configured to enable this setting": "Serveren må ha SMTP konfigurert for å aktivere denne innstillingen", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Lenker til støttede tjenester vises som rike innbedninger i dokumentene dine", "Collection creation": "Opprettelse av samling", "Allow editors to create new collections within the workspace": "Tillat redaktører å opprette nye samlinger i arbeidsområdet", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io-implementering", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Legg til URL-en for din egen-hostede draw.io-installasjon her for å aktivere automatisk innbedning av diagrammer i dokumenter.", "Grist deployment": "Grist-implementering", @@ -933,6 +953,7 @@ "Workspace name": "Navn på arbeidsområde", "You are creating a new workspace using your current account — {{email}}": "Du oppretter et nytt arbeidsområde ved hjelp av din nåværende konto — {{email}}", "To create a workspace under another email please sign up from the homepage": "For å opprette et arbeidsområde under en annen e-post, vennligst registrer deg fra hjemmesiden", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Søppelkassen er tom for øyeblikket.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "En bekreftelseskode har blitt sendt til din e-postadresse, vennligst skriv inn koden nedenfor for å permanent ødelegge kontoen din.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Er du sikker? Sletting av kontoen din vil ødelegge identifiserende data knyttet til brukeren din og kan ikke angres. Du vil umiddelbart bli logget ut av {{appName}}, og alle API-tokenene dine vil bli tilbakekalt.", @@ -943,25 +964,37 @@ "This month": "Denne måneden", "Last month": "Forrige måned", "This year": "I år", + "Connect": "Koble til", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Noe gikk galt under autentisering av forespørselen din. Vennligst prøv å logge inn igjen.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Legg til i Slack", "document published": "dokument publisert", "document updated": "dokument oppdatert", "Posting to the {{ channelName }} channel on": "Innlegg til {{ channelName }}-kanalen på", "These events should be posted to Slack": "Disse hendelsene bør postes til Slack", - "Disconnect": "Koble fra", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Oisann, du må akseptere tillatelsene i Slack for å koble {{appName}} til arbeidsområdet ditt. Prøv igjen?", - "Something went wrong while authenticating your request. Please try logging in again.": "Noe gikk galt under autentisering av forespørselen din. Vennligst prøv å logge inn igjen.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Få rike forhåndsvisninger av {{ appName }}-lenker delt i Slack og bruk {{ command }}-skråstrek-kommandoen for å søke etter dokumenter uten å forlate chatten din.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Koble {{appName}}-samlinger til Slack-kanaler. Meldinger vil automatisk bli postet til Slack når dokumenter publiseres eller oppdateres.", - "Connect": "Koble til", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Slack-integrasjonen er for øyeblikket deaktivert. Vennligst sett de tilhørende miljøvariablene og start serveren på nytt for å aktivere integrasjonen.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Hvordan bruke {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "For å søke i arbeidsområdet ditt, bruk {{ command }}. \nSkriv {{ command2 }} hjelp for å vise denne hjelpeteksten.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Beklager, vi kunne ikke finne en integrasjon for teamet ditt. Gå til {{ appName }}-innstillingene dine for å sette opp en.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Det ser ut som du ikke har logget inn på {{ appName }} ennå, så resultatene kan være begrensede", "Post to Channel": "Post til kanal", "This is what we found for \"{{ term }}\"": "Dette er hva vi fant for \"{{ term }}\"", "No results for \"{{ term }}\"": "Ingen resultater for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Er du sikker på at du vil slette {{ name }}-webkroken?", "Webhook updated": "Webkrok oppdatert", "Update": "Oppdater", diff --git a/shared/i18n/locales/nl_NL/translation.json b/shared/i18n/locales/nl_NL/translation.json index 9c8d5b097d9b..ad84847b518c 100644 --- a/shared/i18n/locales/nl_NL/translation.json +++ b/shared/i18n/locales/nl_NL/translation.json @@ -79,6 +79,7 @@ "Templates": "Sjablonen", "Notifications": "Meldingen", "Preferences": "Voorkeuren", + "Documentation": "Documentation", "API documentation": "API-documentatie", "Toggle sidebar": "Zijbalk tonen/verbergen", "Send us feedback": "Stuur ons feedback", @@ -101,7 +102,12 @@ "Select a workspace": "Selecteer een workspace", "New workspace": "Nieuwe workspace", "Create a workspace": "Maak een workspace aan", + "Login to workspace": "Login to workspace", "Invite people": "Personen uitnodigen", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Gebruiker verwijderen", "Collection": "Collectie", "Debug": "Fout opsporen", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "{{ timeAgo }} bekeken", "Copy of {{ documentName }}": "Kopie van {{ documentName }}", "Title": "Titel", + "Published": "Published", "Include nested documents": "Inclusief geneste documenten", "Emoji Picker": "Emoji-kiezer", "Remove": "Verwijder", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} lid", "{{ count }} member_plural": "{{ count }} leden", "Group members": "Groepeer leden", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Toon menu", "Choose icon": "Kies icoon", "Loading": "Aan het laden", @@ -309,11 +318,12 @@ "No results": "Geen resultaten", "Previous page": "Vorige pagina", "Next page": "Volgende pagina", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Weet je zeker dat je {{ userName }} een alleen-lezen kijker wilt maken? Ze kunnen geen inhoud bewerken", - "Are you sure you want to make {{ userName }} a member?": "Weet je zeker dat je {{ userName }} lid wilt maken?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Ik begrijp het, verwijder", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Weet u zeker dat u {{ userName }} permanent wilt verwijderen? Deze bewerking kan niet worden hersteld. Overweeg in plaats daarvan de gebruiker te blokkeren.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Weet je zeker dat je {{ userName }} een beheerder wilt maken? Beheerders kunnen team- en facturatiegegevens wijzigen.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Weet je zeker dat je het account {{ userName }} wilt blokkeren? Geblokeerde gebruikers kunnen niet meer inloggen.", "New name": "Nieuwe naam", "Name can't be empty": "Naam mag niet leeg zijn", @@ -450,13 +460,11 @@ "Contents": "Inhoud", "Headings you add to the document will appear here": "Koppen die u aan het document toevoegt, verschijnen hier", "Table of contents": "Inhoudsopgave", - "Change role to admin": "Rol wijzigen in beheerder", - "Change role to editor": "Rol wijzigen in bewerker", - "Change role to viewer": "Rol wijzigen in kijker", "Change name": "Naam wijzigen", "Suspend user": "Gebruiker blokkeren", "An error occurred while sending the invite": "Er is een fout opgetreden bij het verzenden van de uitnodiging", "User options": "Gebruikersopties", + "Change role": "Change role", "Resend invite": "Uitnodiging opnieuw verzenden", "Revoke invite": "Uitnodiging intrekken", "Activate user": "Activeer gebruiker", @@ -654,15 +662,17 @@ "We sent out your invites!": "We hebben je uitnodigingen verstuurd!", "Those email addresses are already invited": "Deze e-mailadressen zijn al uitgenodigd", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Sorry, je kunt enkel {{MAX_INVITES}} uitnodigingen tegelijk verzenden", - "Invited members will receive access to": "Uitgenodigde leden zullen toegang krijgen tot", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collecties", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Nodig teamleden of gasten uit om lid te worden van jouw team. Teamleden kunnen inloggen met {{signinMethods}} of hun e-mailadres gebruiken.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Nodig teamleden uit om deel te nemen aan je team. Ze moeten zich aanmelden met {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Als beheerder kun je ook <2>inloggen via e-mail inschakelen.", - "Want a link to share directly with your team?": "Wil je een link om rechtstreeks met je team te delen?", - "Email": "E-mail", + "Invite as": "Invite as", "Role": "Rol", - "Remove invite": "Verwijder uitnodiging", + "Email": "E-mail", "Add another": "Meer toevoegen", "Inviting": "Uitnodigen", "Send Invites": "Verstuur uitnodigingen", @@ -701,6 +711,9 @@ "Continue with Email": "Verdergaan met e-mailadres", "Continue with {{ authProviderName }}": "Ga verder met {{ authProviderName }}", "Back to home": "Terug naar home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomein", "The domain associated with your email address has not been allowed for this workspace.": "Het aan uw e-mailadres gekoppelde domein is niet toegestaan voor deze werkruimte.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Inloggen niet mogelijk. Navigeer naar de aangepaste URL van uw werkruimte en probeer dan opnieuw in te loggen. <1>Wanneer u uitgenodigd bent voor een werkruimte, vind u de link hiernaar in de uitnodigingsmail.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, een nieuw account kan niet worden aangemaakt met een persoonlijk Gmail adres.<1>Gebruik in plaats daarvan een Google Workspaces account.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Je aangepaste domein verwijst met succes naar Outline. Neem contact op met de ondersteuning om het installatieproces te voltooien.", "Choose workspace": "Werkruimte kiezen", "This login method requires choosing your workspace to continue": "Deze login methode vereist dat je je werkruimte kiest om verder te gaan", - "subdomain": "subdomein", "Check your email": "Controleer je e-mail", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Er is een magische aanmeldlink verzonden naar de e-mail {{ emailLinkSentTo }} als er een account bestaat.", "Back to login": "Terug naar inloggen", @@ -760,6 +772,10 @@ "Copied": "Gekopieerd", "Revoking": "Intrekken", "Are you sure you want to revoke the {{ tokenName }} token?": "Weet je zeker dat je de {{ tokenName }} token wilt intrekken?", + "Disconnect integration": "Disconnect integration", + "Connected": "Verbonden", + "Disconnect": "Ontkoppel", + "Disconnecting": "Disconnecting", "Allowed domains": "Toegestane domeinen", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "De domeinen die moeten kunnen worden toegestaan om nieuwe accounts met behulp van SSO te maken. Het wijzigen van deze instelling heeft geen invloed op bestaande gebruikersaccounts.", "Remove domain": "Domein verwijderen", @@ -789,6 +805,7 @@ "Where do I find the file?": "Waar vind ik dit?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Klik in Notion op Instellingen en leden in de linkerzijbalk en open Instellingen. Zoek het gedeelte Exporteren en klik op Alle inhoud van de werkruimte exporteren. Kies HTML als het formaat voor de beste gegevenscompatibiliteit.", "Last active": "Laatst actief", + "Guest": "Guest", "Shared": "Gedeeld", "by {{ name }}": "op {{ name }}", "Last accessed": "Laatst geopend", @@ -796,8 +813,10 @@ "Date shared": "Datum gedeeld", "Domain": "Domein", "Views": "Weergaven", - "Everyone": "Iedereen", + "All roles": "All roles", "Admins": "Beheerders", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Instellingen opgeslagen", "Logo updated": "Logo bijgewerkt", "Unable to upload new logo": "Kan het nieuwe logo niet uploaden", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Pagina's importeren van een Confluence instantie", "Enterprise": "Zakelijk", "Recent imports": "Recent geïmporteerd", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Iedereen die zich heeft aangemeld bij {{appName}} wordt hier weergegeven. Het is mogelijk dat er andere gebruikers zijn die toegang hebben via {team.signinMethods} maar zich nog niet hebben aangemeld.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Ontvang een melding wanneer een nieuw document wordt gepubliceerd", "Document updated": "Document bijgewerkt", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Nieuwe gebruikers moeten eerst worden uitgenodigd om een account aan te maken. Standaard rol en Toegestane domeinen zullen niet langer van toepassing zijn.", "Settings that impact the access, security, and content of your workspace.": "Instellingen die van invloed zijn op de toegang, beveiliging en inhoud van je workspace.", "Allow members to sign-in with {{ authProvider }}": "Sta leden toe om in te loggen met {{ authProvider }}", - "Connected": "Verbonden", "Disabled": "Uitgeschakeld", "Allow members to sign-in using their email address": "Sta leden toe om in te loggen met hun e-mailadres", "The server must have SMTP configured to enable this setting": "De server moet SMTP hebben geconfigureerd om deze instelling in te schakelen", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links naar ondersteunde diensten worden weergegeven als rich embeds in je documenten", "Collection creation": "Collectie aanmaken", "Allow editors to create new collections within the workspace": "Bewerkers toestaan om nieuwe collecties te maken binnen de workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io installatie", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Voeg je self-hosted draw.io installatie URL hier toe om automatische embedding van diagrammen binnen onderliggende documenten aan te zetten.", "Grist deployment": "Grist installatie", @@ -933,6 +953,7 @@ "Workspace name": "Naam workspace", "You are creating a new workspace using your current account — {{email}}": "Je maakt een nieuwe workspace met je huidige account — {{email}}", "To create a workspace under another email please sign up from the homepage": "Om een workspace te maken onder een ander e-mailadres, registreer een nieuw account via de startpagina", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Prullenbak is momenteel leeg.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Een bevestigingscode is naar je e-mailadres verzonden, voer de code hieronder in om je account permanent te verwijderen.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Weet je het zeker? Het verwijderen van je account zal de identificerende gegevens van je gebruiker vernietigen en kan niet ongedaan worden gemaakt. Je wordt onmiddellijk uitgelogd bij {{appName}} en al je API-tokens worden ingetrokken.", @@ -943,25 +964,37 @@ "This month": "Deze maand", "Last month": "Afgelopen maand", "This year": "Dit jaar", + "Connect": "Verbinden", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Er is iets misgegaan bij het verifiëren van je verzoek. Probeer opnieuw in te loggen.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Voeg toe aan Slack", "document published": "document gepubliceerd", "document updated": "document bijgewerkt", "Posting to the {{ channelName }} channel on": "Posten op het {{ channelName }} kanaal op", "These events should be posted to Slack": "Deze evenementen moeten worden gepost op Slack", - "Disconnect": "Ontkoppel", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Oeps, je moet de machtiging in Slack accepteren om {{appName}} te koppen aan je workspace. Opnieuw proberen?", - "Something went wrong while authenticating your request. Please try logging in again.": "Er is iets misgegaan bij het verifiëren van je verzoek. Probeer opnieuw in te loggen.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Krijg uitgebreide voorbeelden van {{ appName }}-links gedeeld in Slack en gebruik het {{ command }} slash-commando om naar documenten te zoeken zonder je chat te verlaten.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Verbind {{appName}}-collecties met Slack-kanalen. Berichten worden automatisch naar Slack gepost wanneer documenten worden gepubliceerd of bijgewerkt.", - "Connect": "Verbinden", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "De Slack-integratie is momenteel uitgeschakeld. Stel de bijbehorende omgevingsvariabelen in en start de server opnieuw op om de integratie in te schakelen.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Hoe gebruik je {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Gebruik {{ command }} om je workspace te doorzoeken. \nTyp {{ command2 }} om deze helptekst weer te geven.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we konden geen integratie voor je team vinden. Ga naar je {{ appName }}-instellingen om er een in te stellen.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Het lijkt erop dat je je nog niet hebt aangemeld bij {{ appName }}, dus de resultaten kunnen beperkt zijn", "Post to Channel": "Post naar kanaal", "This is what we found for \"{{ term }}\"": "Dit is wat we hebben gevonden voor \"{{ term }}\"", "No results for \"{{ term }}\"": "Geen resultaten voor \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Weet je zeker dat je de {{ name }} webhook wilt verwijderen?", "Webhook updated": "Webhook is bijgewerkt", "Update": "Update", diff --git a/shared/i18n/locales/pl_PL/translation.json b/shared/i18n/locales/pl_PL/translation.json index 96442132aabe..a7f024f3b9cd 100644 --- a/shared/i18n/locales/pl_PL/translation.json +++ b/shared/i18n/locales/pl_PL/translation.json @@ -79,6 +79,7 @@ "Templates": "Szablony", "Notifications": "Powiadomienia", "Preferences": "Ustawienia", + "Documentation": "Documentation", "API documentation": "Dokumentacja API", "Toggle sidebar": "Przełącz pasek boczny", "Send us feedback": "Prześlij nam swoją opinię", @@ -101,7 +102,12 @@ "Select a workspace": "Wybierz obszar roboczy", "New workspace": "Nowy obszar roboczy", "Create a workspace": "Stwórz obszar roboczy", + "Login to workspace": "Login to workspace", "Invite people": "Zaproś ludzi", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Usuń użytkownika", "Collection": "Kolekcja", "Debug": "Debuguj", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Przeglądnięty {{ timeAgo }}", "Copy of {{ documentName }}": "Kopiuj jako {{ documentName }}", "Title": "Tytuł", + "Published": "Published", "Include nested documents": "Dołącz zagnieżdżone dokumenty", "Emoji Picker": "Wybór emoji", "Remove": "Usuń", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} członek", "{{ count }} member_plural": "{{ count }} członków", "Group members": "Członkowie grupy", + "{{authorName}} created <3>": "{{authorName}} stworzył <3>", + "{{authorName}} opened <3>": "{{authorName}} otworzył <3>", "Show menu": "Pokaż menu", "Choose icon": "Wybierz ikonę", "Loading": "Ładowanie", @@ -309,11 +318,12 @@ "No results": "Brak wyników", "Previous page": "Poprzednia strona", "Next page": "Następna strona", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Czy na pewno chcesz przyjąć użytkownika {{ userName }} jako członka tylko do odczytu? Nie będzie mógł edytować żadnych treści", - "Are you sure you want to make {{ userName }} a member?": "Czy na pewno chcesz przyjąć{{ userName }} jako członka?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Rozumiem, usuń", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Czy na pewno chcesz trwale usunąć {{ userName }}? Ta operacja jest nieodwracalna, zamiast tego rozważ zawieszenie użytkownika.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Czy na pewno chcesz uczynić {{ userName }} administratorem? Administratorzy mogą modyfikować informacje o zespole i rozliczeniach.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Czy na pewno chcesz zawiesić konto {{ userName }}? Zawieszeni użytkownicy nie będą mogli się zalogować.", "New name": "Nowa nazwa", "Name can't be empty": "Nazwa nie może być pusta", @@ -329,8 +339,8 @@ "Replace": "Zamień", "Replace all": "Zamień wszystko", "Profile picture": "Zdjęcie profilowe", - "Insert after": "Insert after", - "Insert before": "Insert before", + "Insert after": "Wstaw po", + "Insert before": "Wstaw przed", "Align center": "Wyrównaj do środka", "Align left": "Wyrównanie do lewej", "Align right": "Wyrównaj do prawej", @@ -384,8 +394,8 @@ "Strikethrough": "Przekreślenie", "Bold": "Pogrubienie", "Subheading": "Podtytuł", - "Sort ascending": "Sort ascending", - "Sort descending": "Sort descending", + "Sort ascending": "Sortuj rosnąco", + "Sort descending": "Sortuj malejąco", "Table": "Tabela", "Math inline (LaTeX)": "Matematyka w linii (LaTeX)", "Math block (LaTeX)": "Blok matematyczny (LaTeX)", @@ -450,13 +460,11 @@ "Contents": "Treść", "Headings you add to the document will appear here": "Tutaj pojawią się nagłówki, które dodasz do dokumentu", "Table of contents": "Spis treści", - "Change role to admin": "Zmień rolę na administratora", - "Change role to editor": "Zmień rolę do edytora", - "Change role to viewer": "Zmień rolę na widza", "Change name": "Zmień nazwę", "Suspend user": "Zawieś użytkownika", "An error occurred while sending the invite": "Wystąpił błąd podczas wysyłania zaproszenia", "User options": "Opcje użytkownika", + "Change role": "Change role", "Resend invite": "Wyślij zaproszenie ponownie", "Revoke invite": "Odwołaj zaproszenie", "Activate user": "Aktywuj użytkownika", @@ -654,15 +662,17 @@ "We sent out your invites!": "Wysłaliśmy Twoje zaproszenia!", "Those email addresses are already invited": "Te adresy e-mail już zostały zaproszone", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Przepraszamy, można wysłać tylko {{MAX_INVITES}} zaproszeń na raz", - "Invited members will receive access to": "Zaproszeni członkowie otrzymają dostęp do", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} kolekcji", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Zaproś członków lub gości do dołączenia do Twojego obszaru roboczego. Mogą się zalogować przy użyciu {{signinMethods}} lub użyć swojego adresu e-mail.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Zaproś członków do dołączenia do Twojego obszaru roboczego. Będą musieli się zalogować przy użyciu {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Jako administrator możesz także <2>włączyć logowanie przez e-mail.", - "Want a link to share directly with your team?": "Chcesz link do bezpośredniego udostępnienia swojemu zespołowi?", - "Email": "E-mail", + "Invite as": "Invite as", "Role": "Rola", - "Remove invite": "Usuń zaproszenie", + "Email": "E-mail", "Add another": "Dodaj więcej", "Inviting": "Zapraszanie", "Send Invites": "Wyślij zaproszenia", @@ -701,6 +711,9 @@ "Continue with Email": "Kontynuuj przy użyciu e-maila", "Continue with {{ authProviderName }}": "Kontynuuj za pomocą {{ authProviderName }}", "Back to home": "Wróć do strony głównej", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomena", "The domain associated with your email address has not been allowed for this workspace.": "Domena powiązana z Twoim adresem e-mail nie została zezwolona dla tego obszaru roboczego.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Nie można się zalogować. Przejdź do niestandardowego adresu URL swojego obszaru roboczego, a następnie spróbuj ponownie się zalogować.<1>Jeśli zostałeś zaproszony do obszaru roboczego, znajdziesz link do niego w e-mailu z zaproszeniem.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Przepraszamy, nie można utworzyć nowego konta przy użyciu osobistego adresu Gmail.<1>Prosimy zamiast tego użyć konta Google Workspaces", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Twoja niestandardowa domena skutecznie wskazuje na Outline. Aby zakończyć proces konfiguracji, skontaktuj się z wsparciem.", "Choose workspace": "Wybierz obszar roboczy", "This login method requires choosing your workspace to continue": "Ta metoda logowania wymaga wyboru obszaru roboczego, aby kontynuować", - "subdomain": "subdomena", "Check your email": "Sprawdź swoją skrzynkę e-mail", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Magiczny link do logowania został wysłany na adres e-mail {{ emailLinkSentTo }}, jeśli konto istnieje.", "Back to login": "Wróć do logowania", @@ -760,6 +772,10 @@ "Copied": "Skopiowano", "Revoking": "Unieważnianie...", "Are you sure you want to revoke the {{ tokenName }} token?": "Czy na pewno chcesz unieważnić token {{ tokenName }}?", + "Disconnect integration": "Rozłącz integrację", + "Connected": "Połączono", + "Disconnect": "Rozłącz", + "Disconnecting": "Rozłączanie", "Allowed domains": "Dozwolone domeny", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Domeny, które powinny być dozwolone do tworzenia nowych kont przy użyciu SSO. Zmiana tego ustawienia nie wpływa na istniejące konta użytkowników.", "Remove domain": "Usuń domenę", @@ -789,6 +805,7 @@ "Where do I find the file?": "Gdzie znajdę plik?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "W Notion kliknij Ustawienia i członkowie na lewym pasku bocznym i otwórz Ustawienia. Znajdź sekcję Eksport i kliknij Eksportuj całą zawartość obszaru roboczego. Wybierz format HTML dla najlepszej kompatybilności danych.", "Last active": "Ostatnio aktywny", + "Guest": "Guest", "Shared": "Udostępnione", "by {{ name }}": "przez {{ name }}", "Last accessed": "Ostatnio otwarto", @@ -796,8 +813,10 @@ "Date shared": "Data udostępnienia", "Domain": "Domena", "Views": "Wyświetleń", - "Everyone": "Wszyscy", + "All roles": "All roles", "Admins": "Administratorzy", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Ustawienia zapisane", "Logo updated": "Logo zaktualizowane", "Unable to upload new logo": "Nie można przesłać nowego logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importuj strony z instancji Confluence", "Enterprise": "Przedsiębiorstwo", "Recent imports": "Ostatnio zaimportowane", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Tutaj są wyświetlane wszystkie osoby, które zalogowały się w {{appName}}. Możliwe, że istnieją inni użytkownicy, którzy mają dostęp przez {team.signinMethods} ale jeszcze się nie zalogowali.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtr", "Receive a notification whenever a new document is published": "Otrzymuj powiadomienie o każdym nowym opublikowanym dokumencie", "Document updated": "Dokument zaktualizowany", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Nowi użytkownicy będą musieli najpierw zostać zaproszeni do utworzenia konta. Domyślna rola i Dozwolone domeny nie będą już obowiązywać.", "Settings that impact the access, security, and content of your workspace.": "Ustawienia wpływające na dostęp, bezpieczeństwo i zawartość twojego obszaru roboczego.", "Allow members to sign-in with {{ authProvider }}": "Zezwalaj członkom na logowanie się za pomocą {{ authProvider }}", - "Connected": "Połączono", "Disabled": "Wyłączony", "Allow members to sign-in using their email address": "Zezwalaj członkom na logowanie się za pomocą swojego adresu e-mail", "The server must have SMTP configured to enable this setting": "Serwer musi mieć skonfigurowane SMTP, aby włączyć to ustawienie", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Linki do obsługiwanych usług są wyświetlane jako bogate osadzenia w dokumentach", "Collection creation": "Tworzenie kolekcji", "Allow editors to create new collections within the workspace": "Zezwalaj edytorom na tworzenie nowych kolekcji w obszarze roboczym", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Wdrożenie Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Dodaj tutaj adres swojej instalacji draw.io, aby umożliwić automatyczne osadzanie diagramów w dokumentach.", "Grist deployment": "Wdrożenie Grist", @@ -933,6 +953,7 @@ "Workspace name": "Nazwa obszaru roboczego", "You are creating a new workspace using your current account — {{email}}": "Tworzysz nowy obszar roboczy przy użyciu bieżącego konta — {{email}}", "To create a workspace under another email please sign up from the homepage": "Aby utworzyć obszar roboczy pod innym adresem e-mail, zarejestruj się ze strony głównej", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Kosz jest w tej chwili pusty.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Na Twój adres e-mail został wysłany kod potwierdzający, wpisz poniżej kod, aby trwale zniszczyć Twoje konto.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Jesteś pewny? Usunięcie konta spowoduje zniszczenie danych identyfikujących użytkownika i nie będzie można tego cofnąć. Zostaniesz natychmiast wylogowany z {{appName}}, a wszystkie Twoje tokeny API zostaną unieważnione.", @@ -943,25 +964,37 @@ "This month": "Ten miesiąc", "Last month": "Zeszły miesiąc", "This year": "Ten rok", + "Connect": "Połącz", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Coś poszło nie tak podczas uwierzytelniania Twojego żądania. Proszę spróbuj zalogować się ponownie.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Włączone przez {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Dodaj do Slacka", "document published": "dokument opublikowany", "document updated": "dokument zaktualizowany", "Posting to the {{ channelName }} channel on": "Wysyłanie do kanału {{ channelName }} włączone", "These events should be posted to Slack": "Te wydarzenia należy opublikować na Slack", - "Disconnect": "Rozłącz", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Ups, musisz zaakceptować uprawnienia w Slack, aby połączyć {{appName}} z Twoim obszarem roboczym. Spróbować ponownie?", - "Something went wrong while authenticating your request. Please try logging in again.": "Coś poszło nie tak podczas uwierzytelniania Twojego żądania. Proszę spróbuj zalogować się ponownie.", + "Personal account": "Konto osobiste", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Komendy z ukośnikiem", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Uzyskaj bogaty podgląd linków {{ appName }} udostępnianych w Slack i użyj komendy {{ command }} do wyszukiwania dokumentów bez opuszczania czatu.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Połącz kolekcje {{appName}} z kanałami Slack, a wiadomości będą automatycznie publikowane w Slack po opublikowaniu lub zaktualizowaniu dokumentów.", - "Connect": "Połącz", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Integracja ze Slackiem jest obecnie wyłączona. Ustaw powiązane zmienne środowiskowe i zrestartuj serwer, aby włączyć integrację.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Jak używać {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Aby wyszukać w swoim obszarze roboczym użyj {{ command }}. \nWpisz {{ command2 }} help, aby wyświetlić tekst pomocy.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Przepraszamy, nie mogliśmy znaleźć integracji dla Twojego zespołu. Przejdź do ustawień {{ appName }}, aby ją skonfigurować.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Wygląda na to, że nie zalogowałeś się jeszcze do {{ appName }}, więc wyniki mogą być ograniczone", "Post to Channel": "Opublikuj na kanale", "This is what we found for \"{{ term }}\"": "Oto co znaleźliśmy dla „{{ term }}”", "No results for \"{{ term }}\"": "Brak wyników dla „{{ term }}”", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Połącz swoje konto", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Czy na pewno chcesz usunąć webhook {{ name }}?", "Webhook updated": "Webhook zaktualizowany", "Update": "Aktualizuj", diff --git a/shared/i18n/locales/pt_BR/translation.json b/shared/i18n/locales/pt_BR/translation.json index 78a9156e76f8..ee48982b40a6 100644 --- a/shared/i18n/locales/pt_BR/translation.json +++ b/shared/i18n/locales/pt_BR/translation.json @@ -79,6 +79,7 @@ "Templates": "Modelos", "Notifications": "Notificações", "Preferences": "Preferências", + "Documentation": "Documentation", "API documentation": "Documentação da API", "Toggle sidebar": "Alternar visualização da barra lateral", "Send us feedback": "Envie-nos a sua opinião", @@ -101,7 +102,12 @@ "Select a workspace": "Selecionar um espaço de trabalho", "New workspace": "Novo espaço de trabalho", "Create a workspace": "Criar um espaço de trabalho", + "Login to workspace": "Login to workspace", "Invite people": "Convidar pessoas", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Excluir usuário", "Collection": "Coleção", "Debug": "Depurar", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Visualizou {{ timeAgo }} atrás", "Copy of {{ documentName }}": "Cópia de {{ documentName }}", "Title": "Título", + "Published": "Published", "Include nested documents": "Incluir documentos aninhados", "Emoji Picker": "Seletor de Emoji", "Remove": "Remover", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} membro", "{{ count }} member_plural": "{{ count }} membros", "Group members": "Membros do grupo", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Mostrar menu", "Choose icon": "Escolha o ícone", "Loading": "Carregando", @@ -309,11 +318,12 @@ "No results": "Sem resultados", "Previous page": "Página anterior", "Next page": "Próxima página", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Tem certeza de que deseja tornar {{ userName }} um visualizador somente leitura? Eles não poderão editar nenhum conteúdo", - "Are you sure you want to make {{ userName }} a member?": "Tem certeza de que deseja tornar {{ userName }} um membro?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Eu entendo, excluir", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Tem certeza que deseja excluir {{ userName }} permanentemente? Esta operação não é recuperável, considere suspender o usuário.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Tem certeza que deseja tornar {{ userName }} um administrador? Os administradores podem modificar as informações da equipe e do faturamento.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Tem certeza que deseja suspender {{ userName }}? Usuários suspensos serão impedidos de acessar a aplicação.", "New name": "Novo nome", "Name can't be empty": "O nome não pode estar vazio", @@ -450,13 +460,11 @@ "Contents": "Conteúdo", "Headings you add to the document will appear here": "Os cabeçalhos que você adicionar ao documento aparecerão aqui", "Table of contents": "Índice", - "Change role to admin": "Alterar função para administrador", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Alterar função para visualizador", "Change name": "Renomear", "Suspend user": "Suspender usuário", "An error occurred while sending the invite": "Ocorreu um erro ao enviar o convite", "User options": "Opções do usuário", + "Change role": "Change role", "Resend invite": "Reenviar convite", "Revoke invite": "Revogar convite", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Enviamos seus convites!", "Those email addresses are already invited": "Estes endereços de e-mail já foram convidados", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Desculpe, você só pode enviar {{MAX_INVITES}} convites por vez", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Convide membros ou convidados para ingressar no seu espaço de trabalho. Eles podem entrar com {{signinMethods}} ou utilizar o endereço de e-mail deles.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Convide membros para ingressar seu espaço de trabalho. Eles precisam entrar com {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Como administrador, você também pode <2> ativar o login de email.", - "Want a link to share directly with your team?": "Quer um link para compartilhar diretamente com sua equipe?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Função", - "Remove invite": "Remover convite", + "Email": "Email", "Add another": "Adicionar outra", "Inviting": "Convidando", "Send Invites": "Enviar Convites", @@ -701,6 +711,9 @@ "Continue with Email": "Continuar com E-mail", "Continue with {{ authProviderName }}": "Continuar com {{ authProviderName }}", "Back to home": "Voltar à página inicial", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomínio", "The domain associated with your email address has not been allowed for this workspace.": "O domínio associado ao seu endereço de email não foi permitido para este espaço de trabalho.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Não foi possível entrar. Navegue até a URL personalizada do seu espaço de trabalho e tente iniciar a sessão novamente. <1>Se você foi convidado para uma área de trabalho, você encontrará um link no e-mail do convite.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Desculpe, não é possível criar uma nova conta com um endereço pessoal do Gmail. <1>Em vez disso, utilize uma conta do Google Workspaces.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Seu domínio personalizado está apontando com sucesso para o Outline. Para concluir o processo de configuração, entre em contato com o suporte.", "Choose workspace": "Escolha o espaço de trabalho", "This login method requires choosing your workspace to continue": "Este método de login requer a escolha do seu espaço de trabalho para continuar", - "subdomain": "subdomínio", "Check your email": "Verifique seu e-mail", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Um link de login mágico foi enviado para o e-mail {{ emailLinkSentTo }} se uma conta existir.", "Back to login": "Voltar ao login", @@ -760,6 +772,10 @@ "Copied": "Copiado", "Revoking": "Revogando", "Are you sure you want to revoke the {{ tokenName }} token?": "Tem certeza de que deseja revogar a chave de api {{ tokenName }}?", + "Disconnect integration": "Disconnect integration", + "Connected": "Conectado", + "Disconnect": "Desconectar", + "Disconnecting": "Disconnecting", "Allowed domains": "Domínios permitidos", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Os domínios que devem ser autorizados a criar novas contas usando SSO. Alterar esta configuração não afeta as contas de usuários existentes.", "Remove domain": "Remover domínio", @@ -789,6 +805,7 @@ "Where do I find the file?": "Onde eu encontro o arquivo?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "No Notion, clique em Configurações e membros na barra lateral esquerda e abra Configurações. Procure a seção Exportar, e clique em Exportar todo o conteúdo do espaço de trabalho. Escolha HTML como formato para melhor compatibilidade de dados.", "Last active": "Última atividade", + "Guest": "Guest", "Shared": "Compartilhado", "by {{ name }}": "por {{ name }}", "Last accessed": "Último acessado", @@ -796,8 +813,10 @@ "Date shared": "Data de compartilhamento", "Domain": "Domínio", "Views": "Visualizações", - "Everyone": "Todos", + "All roles": "All roles", "Admins": "Administradores", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Configurações salvas", "Logo updated": "Logo atualizado", "Unable to upload new logo": "Não foi possível carregar o novo logotipo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importar páginas de uma instância do Confluence", "Enterprise": "Empresarial", "Recent imports": "Importações recentes", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Todos que fizeram login em {{appName}} estão listados aqui. É possível que existam outros usuários que tenham acesso através de {team.signinMethods}, mas que ainda não tenham feito login.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtro", "Receive a notification whenever a new document is published": "Receba uma notificação sempre que um novo documento for publicado", "Document updated": "Documento atualizado", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Novos usuários precisarão primeiro ser convidados para criar uma conta. Função padrão e Os domínios permitidos não serão mais aplicáveis.", "Settings that impact the access, security, and content of your workspace.": "Configurações que afetam o acesso, a segurança e o conteúdo de sua base de conhecimento.", "Allow members to sign-in with {{ authProvider }}": "Permitir que membros façam login com {{ authProvider }}", - "Connected": "Conectado", "Disabled": "Desabilitado", "Allow members to sign-in using their email address": "Permitir que membros façam login usando endereço de e-mail", "The server must have SMTP configured to enable this setting": "O servidor deve ter o SMTP configurado para habilitar esta configuração", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links para serviços suportados são exibidos como incorporações ricas nos seus documentos", "Collection creation": "Criação da coleção", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Implantação do Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Adicione sua url de instalação auto-hospedada do draw.io aqui para permitir a incorporação automática de diagramas em documentos.", "Grist deployment": "Implantação do Grist", @@ -933,6 +953,7 @@ "Workspace name": "Nome do espaço de trabalho", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "Para criar um espaço de trabalho com outro e-mail, inscreva-se na página inicial", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "A Lixeira está vazia no momento.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "Um código de confirmação foi enviado para seu endereço de e-mail, por favor insira o código abaixo para excluir sua conta permanentemente.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Você tem certeza? Apagar sua conta destruirá os dados de identificação associados ao seu usuário e não poderá ser desfeito. Você será imediatamente desconectado do {{appName}} e todos os seus tokens de API serão revogados.", @@ -943,25 +964,37 @@ "This month": "Este mês", "Last month": "Último mês", "This year": "Este ano", + "Connect": "Conectar", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Algo deu errado durante a autenticação da sua solicitação. Por favor, tente realizar o login novamente.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Adicionar ao Slack", "document published": "documento publicado", "document updated": "documento atualizado", "Posting to the {{ channelName }} channel on": "Postando no canal {{ channelName }} em", "These events should be posted to Slack": "Esses eventos devem ser postados no Slack", - "Disconnect": "Desconectar", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Ops, você precisa aceitar as permissões no Slack para conectar {{appName}} à sua equipe. Tentar novamente?", - "Something went wrong while authenticating your request. Please try logging in again.": "Algo deu errado durante a autenticação da sua solicitação. Por favor, tente realizar o login novamente.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Obtenha pré visualizações ricas de links do {{ appName }} compartilhados no Slack e use o {{ command }} para pesquisar documentos sem sair do chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Conecte coleções do {{appName}} aos canais do Slack. Mensagens serão automaticamente publicadas no Slack quando os documentos forem publicados ou atualizados.", - "Connect": "Conectar", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "A integração do Slack está desativada no momento. Defina as variáveis de ambiente associadas e reinicie o servidor para habilitar a integração.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Como utilizar {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "Para pesquisar sua base de conhecimento, use {{ command }}. \nDigite {{ command2 }} help para exibir esse texto de ajuda.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Desculpe, não conseguimos encontrar uma integração para a sua equipe. Vá até as configurações do {{ appName }} para definir uma.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Parece que você ainda não fez login no {{ appName }} , então os resultados podem ser limitados", "Post to Channel": "Publicar no Canal", "This is what we found for \"{{ term }}\"": "Isto é o que encontramos para \"{{ term }}\"", "No results for \"{{ term }}\"": "Nenhum resultado para \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Tem certeza que deseja excluir o webhook {{ name }}?", "Webhook updated": "Webhook atualizado", "Update": "Atualizar", diff --git a/shared/i18n/locales/pt_PT/translation.json b/shared/i18n/locales/pt_PT/translation.json index bbdb57642a36..348acca7172f 100644 --- a/shared/i18n/locales/pt_PT/translation.json +++ b/shared/i18n/locales/pt_PT/translation.json @@ -79,6 +79,7 @@ "Templates": "Modelos", "Notifications": "Notificações", "Preferences": "Preferences", + "Documentation": "Documentation", "API documentation": "Documentação da API", "Toggle sidebar": "Toggle sidebar", "Send us feedback": "Envia-nos Feedback", @@ -101,7 +102,12 @@ "Select a workspace": "Select a workspace", "New workspace": "New workspace", "Create a workspace": "Create a workspace", + "Login to workspace": "Login to workspace", "Invite people": "Convidar pessoas", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Delete user", "Collection": "Coleção", "Debug": "Debug", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Remover", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} member", "{{ count }} member_plural": "{{ count }} members", "Group members": "Group members", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Show menu", "Choose icon": "Choose icon", "Loading": "A carregar", @@ -309,11 +318,12 @@ "No results": "Sem resultados", "Previous page": "Previous page", "Next page": "Next page", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content", - "Are you sure you want to make {{ userName }} a member?": "Tem a certeza de que deseja tornar {{ userName }} um membro?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Tem a certeza que deseja tornar {{ userName }} um administrador? Os administradores podem modificar as informações de faturação e da equipa.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "Contents", "Headings you add to the document will appear here": "Headings you add to the document will appear here", "Table of contents": "Índice de conteúdos", - "Change role to admin": "Change role to admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Change role to viewer", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "An error occurred while sending the invite", "User options": "User options", + "Change role": "Change role", "Resend invite": "Resend invite", "Revoke invite": "Revogar convite", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "We sent out your invites!", "Those email addresses are already invited": "Those email addresses are already invited", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Sorry, you can only send {{MAX_INVITES}} invites at a time", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "As an admin you can also <2>enable email sign-in.", - "Want a link to share directly with your team?": "Want a link to share directly with your team?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Role", - "Remove invite": "Remove invite", + "Email": "Email", "Add another": "Add another", "Inviting": "Inviting", "Send Invites": "Send Invites", @@ -701,6 +711,9 @@ "Continue with Email": "Continue with Email", "Continue with {{ authProviderName }}": "Continue with {{ authProviderName }}", "Back to home": "Back to home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Check your email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "Back to login", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "Disconnect", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Where do I find the file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.", "Last active": "Last active", + "Guest": "Guest", "Shared": "Shared", "by {{ name }}": "by {{ name }}", "Last accessed": "Last accessed", @@ -796,8 +813,10 @@ "Date shared": "Date shared", "Domain": "Domain", "Views": "Views", - "Everyone": "Everyone", + "All roles": "All roles", "Admins": "Admins", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Settings saved", "Logo updated": "Logo updated", "Unable to upload new logo": "Unable to upload new logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Import pages from a Confluence instance", "Enterprise": "Enterprise", "Recent imports": "Recent imports", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "The server must have SMTP configured to enable this setting", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links to supported services are shown as rich embeds within your documents", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "A reciclagem encontra-se de momento vazia.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "This month", "Last month": "Last month", "This year": "This year", + "Connect": "Connect", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Add to Slack", "document published": "document published", "document updated": "document updated", "Posting to the {{ channelName }} channel on": "Posting to the {{ channelName }} channel on", "These events should be posted to Slack": "These events should be posted to Slack", - "Disconnect": "Disconnect", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "Connect", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/sv_SE/translation.json b/shared/i18n/locales/sv_SE/translation.json index 5e3820286e84..e3773a0df606 100644 --- a/shared/i18n/locales/sv_SE/translation.json +++ b/shared/i18n/locales/sv_SE/translation.json @@ -79,6 +79,7 @@ "Templates": "Mallar", "Notifications": "Notifieringar", "Preferences": "Inställningar", + "Documentation": "Documentation", "API documentation": "API-dokumentation", "Toggle sidebar": "Växla sidofältet", "Send us feedback": "Skicka feedback", @@ -101,7 +102,12 @@ "Select a workspace": "Välj en arbetsyta", "New workspace": "Ny arbetsyta", "Create a workspace": "Skapa arbetsyta", + "Login to workspace": "Login to workspace", "Invite people": "Bjud in personer", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Ta bort användare", "Collection": "Samling", "Debug": "Felsök", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Visades för {{ timeAgo }} sedan", "Copy of {{ documentName }}": "Kopia av {{ documentName }}", "Title": "Titel", + "Published": "Published", "Include nested documents": "Inkludera nästlade dokument", "Emoji Picker": "Emoji väljare", "Remove": "Ta bort", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} medlem", "{{ count }} member_plural": "{{ count }} medlemmar", "Group members": "Gruppmedlemmar", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Visa meny", "Choose icon": "Välj ikon", "Loading": "Laddar", @@ -309,11 +318,12 @@ "No results": "Inga resultat", "Previous page": "Föregående sida", "Next page": "Nästa sida", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Är du säker på att du vill göra {{ userName }} till en skrivskyddad läsare? De kommer inte att kunna redigera något innehåll", - "Are you sure you want to make {{ userName }} a member?": "Är du säker på att du vill göra {{ userName }} till medlem?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Jag förstår, ta bort", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Är du säker på att du vill ta bort {{ userName }} permanent? Denna åtgärd är oåterkallelig, överväg att stänga av användaren istället.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Är du säker på att du vill göra {{ userName }} en administratör? Administratörer kan ändra team- och faktureringsinformation.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Är du säker på att du vill stänga av {{ userName }}? Avstängda användare kommer att hindras från att logga in.", "New name": "Nytt namn", "Name can't be empty": "Namnet kan inte vara tomt", @@ -450,13 +460,11 @@ "Contents": "Innehåll", "Headings you add to the document will appear here": "Rubriker som du lägger till i dokumentet visas här", "Table of contents": "Innehållsförteckning", - "Change role to admin": "Ändra roll till administratör", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Ändra roll till läsare", "Change name": "Ändra namn", "Suspend user": "Stäng av användaren", "An error occurred while sending the invite": "Ett fel inträffade när inbjudan skulle skickas", "User options": "Användaralternativ", + "Change role": "Change role", "Resend invite": "Skicka inbjudan igen", "Revoke invite": "Återkalla inbjudan", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Vi skickade ut dina inbjudningar!", "Those email addresses are already invited": "Dessa e-postadresser är redan inbjudna", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Tyvärr, du kan bara skicka {{MAX_INVITES}} inbjudningar åt gången", - "Invited members will receive access to": "Inbjudna medlemmar kommer att få åtkomst till", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} samlingar", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Bjud in medlemmar eller gäster att gå med i din arbetsyta. De kan logga in med {{signinMethods}} eller använda deras e-postadress.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Bjud in medlemmar att gå med i din arbetsyta. De måste logga in med {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Som administratör kan du också <2>aktivera e-postinloggning.", - "Want a link to share directly with your team?": "Vill du ha en länk för att dela direkt med ditt team?", - "Email": "E-post", + "Invite as": "Invite as", "Role": "Roll", - "Remove invite": "Ta bort inbjudan", + "Email": "E-post", "Add another": "Lägg till en till", "Inviting": "Bjuder in", "Send Invites": "Skicka inbjudningar", @@ -701,6 +711,9 @@ "Continue with Email": "Fortsätt med e-post", "Continue with {{ authProviderName }}": "Fortsätt med {{ authProviderName }}", "Back to home": "Tillbaka till startsidan", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomän", "The domain associated with your email address has not been allowed for this workspace.": "Domänen som är kopplad till din e-postadress har inte tillåtits för denna arbetsyta.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Det gick inte att logga in. Vänligen navigera till arbetsytans anpassade URL, försök sedan logga in igen. <1>Om du blev inbjuden till en arbetsyta, hittar du en länk till den i inbjudningsmailet.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Tyvärr, ett nytt konto kan inte skapas med en personlig Gmail-adress.<1>Använd ett Google Workspaces konto istället.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Din anpassade domän pekar framgångsrikt på Outline. För att slutföra installationsprocessen vänligen kontakta support.", "Choose workspace": "Välj arbetsyta", "This login method requires choosing your workspace to continue": "Denna inloggningsmetod kräver att du väljer din arbetsyta för att fortsätta", - "subdomain": "subdomän", "Check your email": "Kolla din e-post", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "En magisk inloggningslänk har skickats till e-postmeddelandet {{ emailLinkSentTo }} om det finns ett konto.", "Back to login": "Tillbaka till inloggning", @@ -760,6 +772,10 @@ "Copied": "Kopierad", "Revoking": "Återkallar", "Are you sure you want to revoke the {{ tokenName }} token?": "Är du säker på att du vill återkalla {{ tokenName }} -token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Ansluten", + "Disconnect": "Koppla från", + "Disconnecting": "Disconnecting", "Allowed domains": "Tillåtna domäner", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "De domäner som bör tillåtas att skapa nya konton med SSO. Ändra denna inställning påverkar inte befintliga användarkonton.", "Remove domain": "Ta bort domän", @@ -789,6 +805,7 @@ "Where do I find the file?": "Var hittar jag filen?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "I Notisen klickar du på Inställningar och Medlemmar i vänstra sidofältet och öppna Inställningar. Titta efter avsnittet Export och klicka på Exportera allt arbetsytans innehåll. Välj HTML som format för bästa datakompabilitet.", "Last active": "Senast aktiv", + "Guest": "Gäst", "Shared": "Delad", "by {{ name }}": "av {{ name }}", "Last accessed": "Senast besökt", @@ -796,8 +813,10 @@ "Date shared": "Datum delat", "Domain": "Domän", "Views": "Visningar", - "Everyone": "Alla", + "All roles": "Alla roller", "Admins": "Administratörer", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Inställningarna sparades", "Logo updated": "Logotyp uppdaterad", "Unable to upload new logo": "Kunde inte ladda upp ny logotyp", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Importera sidor från en Confluence instans", "Enterprise": "Enterprise", "Recent imports": "Senaste importer", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Alla som har skrivit in sig på {{appName}} listas här. Det är möjligt att det finns andra användare som har åtkomst genom {team.signinMethods} men inte har loggat in ännu.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Få en avisering när ett nytt dokument publiceras", "Document updated": "Dokument uppdaterat", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Nya användare måste först bjudas in för att skapa ett konto. Standardroll och Tillåtna domäner kommer inte längre att gälla.", "Settings that impact the access, security, and content of your workspace.": "Inställningar som påverkar åtkomst, säkerhet och innehåll i din arbetsyta.", "Allow members to sign-in with {{ authProvider }}": "Tillåt medlemmar att logga in med {{ authProvider }}", - "Connected": "Ansluten", "Disabled": "Inaktiverad", "Allow members to sign-in using their email address": "Tillåt medlemmar att logga in med sin e-postadress", "The server must have SMTP configured to enable this setting": "Servern måste ha SMTP konfigurerat för att aktivera denna inställning", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Länkar till stödda tjänster visas som \" rich embeds\" i dina dokument", "Collection creation": "Skapande av samling", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io distribution", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Lägg till din egen draw.io installation url här för att aktivera automatisk inbäddning av diagram i dokument.", "Grist deployment": "Grist utrullning", @@ -933,6 +953,7 @@ "Workspace name": "Arbetsytans namn", "You are creating a new workspace using your current account — {{email}}": "Du skapar en ny arbetsyta med ditt nuvarande konto — {{email}}", "To create a workspace under another email please sign up from the homepage": "För att skapa en arbetsyta under ett annat e-postmeddelande vänligen registrera dig från hemsidan", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Papperskorgen är tom för tillfället.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "En bekräftelsekod har skickats till din e-postadress, ange koden nedan för att permanent ta bort ditt konto.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Är du säker? Radering av ditt konto kommer att förstöra identifierande data som är kopplade till din användare och kan inte ångras. Du kommer omedelbart loggas ut från {{appName}} och alla dina API-tokens kommer att återkallas.", @@ -943,25 +964,37 @@ "This month": "Den här månaden", "Last month": "Förra månaden", "This year": "Det här året", + "Connect": "Anslut", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Något gick fel vid autentisering av din begäran. Var god försök logga in igen.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Lägg till i Slack", "document published": "dokument publicerat", "document updated": "dokument uppdaterat", "Posting to the {{ channelName }} channel on": "Skickar till {{ channelName }} kanalen på", "These events should be posted to Slack": "Dessa händelser ska publiceras på Slack", - "Disconnect": "Koppla från", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Hoppsan, du måste acceptera behörigheterna i Slack för att ansluta {{appName}} till din arbetsyta. Försök igen?", - "Something went wrong while authenticating your request. Please try logging in again.": "Något gick fel vid autentisering av din begäran. Var god försök logga in igen.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Få detaljerade förhandsvisningar av {{ appName }} länkar delade i Slack och använd kommandot {{ command }} för att söka efter dokument utan att lämna din chatt.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Anslut {{appName}} samlingar till Slack kanaler. Meddelanden kommer automatiskt att skickas till Slack när dokument publiceras eller uppdateras.", - "Connect": "Anslut", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Slack integrationen är för närvarande inaktiverad. Ange de associerade miljövariablerna och starta om servern för att aktivera integreringen.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Hur man använder {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "För att söka i din arbetsyta använder du {{ command }}. \nSkriv {{ command2 }} help för att visa denna hjälptext.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Tyvärr, vi kunde inte hitta en integration för ditt team. Gå till dina {{ appName }} inställningar för att konfigurera en.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Det verkar som om du inte har loggat in på {{ appName }} ännu, så resultaten kan vara begränsade", "Post to Channel": "Posta till kanal", "This is what we found for \"{{ term }}\"": "Detta är vad vi hittade för \"{{ term }}\"", "No results for \"{{ term }}\"": "Inga resultat för \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Är du säker på att du vill ta bort {{ name }} webhooken?", "Webhook updated": "Webhook uppdaterad", "Update": "Uppdatera", diff --git a/shared/i18n/locales/th_TH/translation.json b/shared/i18n/locales/th_TH/translation.json index a15c630cd967..71592c20403e 100644 --- a/shared/i18n/locales/th_TH/translation.json +++ b/shared/i18n/locales/th_TH/translation.json @@ -79,6 +79,7 @@ "Templates": "เทมเพลต", "Notifications": "การแจ้งเตือน", "Preferences": "Preferences", + "Documentation": "Documentation", "API documentation": "API documentation", "Toggle sidebar": "เปิด/ปิดแถบด้านข้าง", "Send us feedback": "ส่งคำติชมถึงเรา", @@ -101,7 +102,12 @@ "Select a workspace": "Select a workspace", "New workspace": "New workspace", "Create a workspace": "Create a workspace", + "Login to workspace": "Login to workspace", "Invite people": "เชิญผู้คน", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Delete user", "Collection": "คอลเลคชั่น", "Debug": "ดีบัก", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "ลบ", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} member", "{{ count }} member_plural": "{{ count }} members", "Group members": "Group members", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "แสดงเมนู", "Choose icon": "เลือกไอคอน", "Loading": "กำลังโหลด", @@ -309,11 +318,12 @@ "No results": "ไม่มีผลลัพธ์", "Previous page": "หน้าก่อน", "Next page": "หน้าต่อไป", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "คุณแน่ใจหรือไม่ว่าต้องการทำให้ {{ userName }} เป็นผู้อ่านอย่างเดียว พวกเขาจะไม่สามารถแก้ไขเนื้อหาใดๆ ได้", - "Are you sure you want to make {{ userName }} a member?": "คุณแน่ใจหรือไม่ว่าต้องการทำให้ {{ userName }} เป็นสมาชิก?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "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 suspend {{ userName }}? Suspended users will be prevented from logging in.": "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "Contents", "Headings you add to the document will appear here": "Headings you add to the document will appear here", "Table of contents": "Table of contents", - "Change role to admin": "Change role to admin", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Change role to viewer", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "เกิดข้อผิดพลาดขณะส่งคำเชิญ", "User options": "ตัวเลือกผู้ใช้", + "Change role": "Change role", "Resend invite": "ส่งคำเชิญอีกครั้ง", "Revoke invite": "เพิกถอนคำเชิญ", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "We sent out your invites!", "Those email addresses are already invited": "Those email addresses are already invited", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Sorry, you can only send {{MAX_INVITES}} invites at a time", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "As an admin you can also <2>enable email sign-in.", - "Want a link to share directly with your team?": "Want a link to share directly with your team?", - "Email": "Email", + "Invite as": "Invite as", "Role": "บทบาท", - "Remove invite": "Remove invite", + "Email": "Email", "Add another": "Add another", "Inviting": "Inviting", "Send Invites": "Send Invites", @@ -701,6 +711,9 @@ "Continue with Email": "Continue with Email", "Continue with {{ authProviderName }}": "Continue with {{ authProviderName }}", "Back to home": "Back to home", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "Check your email", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.", "Back to login": "Back to login", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "Disconnect", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Where do I find the file?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.", "Last active": "Last active", + "Guest": "Guest", "Shared": "Shared", "by {{ name }}": "by {{ name }}", "Last accessed": "Last accessed", @@ -796,8 +813,10 @@ "Date shared": "Date shared", "Domain": "Domain", "Views": "Views", - "Everyone": "Everyone", + "All roles": "All roles", "Admins": "Admins", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Settings saved", "Logo updated": "Logo updated", "Unable to upload new logo": "Unable to upload new logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Import pages from a Confluence instance", "Enterprise": "Enterprise", "Recent imports": "Recent imports", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filter", "Receive a notification whenever a new document is published": "Receive a notification whenever a new document is published", "Document updated": "Document updated", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "The server must have SMTP configured to enable this setting", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Links to supported services are shown as rich embeds within your documents", "Collection creation": "Collection creation", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Trash is empty at the moment.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "This month", "Last month": "Last month", "This year": "This year", + "Connect": "Connect", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Add to Slack", "document published": "document published", "document updated": "document updated", "Posting to the {{ channelName }} channel on": "Posting to the {{ channelName }} channel on", "These events should be posted to Slack": "These events should be posted to Slack", - "Disconnect": "Disconnect", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "Connect", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/tr_TR/translation.json b/shared/i18n/locales/tr_TR/translation.json index baf807496ec4..1193f09cb773 100644 --- a/shared/i18n/locales/tr_TR/translation.json +++ b/shared/i18n/locales/tr_TR/translation.json @@ -79,6 +79,7 @@ "Templates": "Şablonlar", "Notifications": "Bildirimler", "Preferences": "Tercihler", + "Documentation": "Documentation", "API documentation": "API dokümantasyonu", "Toggle sidebar": "Kenar çubuğunu aç/kapat", "Send us feedback": "Geri bildirim gönder", @@ -101,7 +102,12 @@ "Select a workspace": "Bir çalışma alanı seçin", "New workspace": "Yeni çalışma alanı", "Create a workspace": "Yeni çalışma alanı oluştur", + "Login to workspace": "Login to workspace", "Invite people": "Kişileri davet et", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Delete user", "Collection": "Koleksiyon", "Debug": "Hata ayıklama", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Kaldır", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} üye", "{{ count }} member_plural": "{{ count }} üyeler", "Group members": "Grup üyeleri", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Menüyü göster", "Choose icon": "İkon seç", "Loading": "Yükleniyor", @@ -309,11 +318,12 @@ "No results": "Sonuç bulunamadı", "Previous page": "Önceki sayfa", "Next page": "Sonraki sayfa", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "{{ userName }} kullanıcısını salt okunur bir görüntüleyici yapmak istediğinize emin misiniz? Herhangi bir içeriği düzenleyemeyecekler", - "Are you sure you want to make {{ userName }} a member?": "{{ userName }} kullanıcısını üye yapmak istediğinize emin misiniz?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "I understand, delete", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "{{ userName }} kullanıcısını yönetici yapmak istediğinize emin misiniz? Yöneticiler takımları ve fatura bilgilerini değiştirebilir.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "{{ userName }} askıya almak istediğinizden emin misiniz? Askıya alınan kullanıcıların giriş yapması engellenecektir.", "New name": "New name", "Name can't be empty": "Name can't be empty", @@ -450,13 +460,11 @@ "Contents": "İçindekiler", "Headings you add to the document will appear here": "Belgeye eklediğiniz başlıklar burada görünecek", "Table of contents": "İçindekiler", - "Change role to admin": "Rolü yönetici olarak değiştir", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Rolü görüntüleyici olarak değiştir", "Change name": "Change name", "Suspend user": "Suspend user", "An error occurred while sending the invite": "Davet gönderilirken bir hata meydana geldi", "User options": "Kullanıcı seçenekleri", + "Change role": "Change role", "Resend invite": "Daveti tekrar gönder", "Revoke invite": "Daveti iptal et", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Davetlerinizi gönderdik!", "Those email addresses are already invited": "Bu e-posta adresleri zaten davet edildi", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Üzgünüz, bir seferde yalnızca {{MAX_INVITES}} davet gönderebilirsiniz", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Yönetici olarak, <2>e-posta ile oturum açmayı da etkinleştirebilirsiniz..", - "Want a link to share directly with your team?": "Ekibinizle doğrudan paylaşmak için bir bağlantı ister misiniz?", - "Email": "E-posta", + "Invite as": "Invite as", "Role": "Rol", - "Remove invite": "Daveti kaldır", + "Email": "E-posta", "Add another": "Başka birtane ekle", "Inviting": "Davet ediliyor", "Send Invites": "Davetleri gönder", @@ -701,6 +711,9 @@ "Continue with Email": "E-posta ile devam et", "Continue with {{ authProviderName }}": "{{ authProviderName }} ile devam et", "Back to home": "Anasayfaya geri dön", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "subdomain", "The domain associated with your email address has not been allowed for this workspace.": "The domain associated with your email address has not been allowed for this workspace.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.", "Choose workspace": "Choose workspace", "This login method requires choosing your workspace to continue": "This login method requires choosing your workspace to continue", - "subdomain": "subdomain", "Check your email": "E-postanı kontrol et", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Bir hesap varsa, {{ emailLinkSentTo }} e-postasına sihirli bir oturum açma bağlantısı gönderildi.", "Back to login": "Oturum açma ekranına geri dön", @@ -760,6 +772,10 @@ "Copied": "Copied", "Revoking": "Revoking", "Are you sure you want to revoke the {{ tokenName }} token?": "Are you sure you want to revoke the {{ tokenName }} token?", + "Disconnect integration": "Disconnect integration", + "Connected": "Connected", + "Disconnect": "Bağlantıyı kes", + "Disconnecting": "Disconnecting", "Allowed domains": "Allowed domains", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.", "Remove domain": "Remove domain", @@ -789,6 +805,7 @@ "Where do I find the file?": "Dosyayı nerede bulurum?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Notion'da, sol kenar çubuğunda Ayarlar ve Üyeler'e tıklayın ve Ayarlar'ı açın. Dışa Aktar bölümünü bulun ve Tüm çalışma alanı içeriğini dışa aktar'a tıklayın. En iyi veri uyumluluğu için format olarak HTML'i seçin.", "Last active": "Son aktiflik", + "Guest": "Guest", "Shared": "Paylaşıldı", "by {{ name }}": "{{ name }} ile", "Last accessed": "Son erişim", @@ -796,8 +813,10 @@ "Date shared": "Paylaşılan tarih", "Domain": "Domain", "Views": "Görüntülenme", - "Everyone": "Herkes", + "All roles": "All roles", "Admins": "Yöneticiler", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Ayarlar kaydedildi", "Logo updated": "Logo güncellendi", "Unable to upload new logo": "Yeni logo yüklenemiyor", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Confluence'daki sayfaları içe aktarma", "Enterprise": "Enterprise", "Recent imports": "Son içe aktarmalar", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Filtre", "Receive a notification whenever a new document is published": "Yeni bir belge yayınlandığında bildirim alın", "Document updated": "Belge güncellendi", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Allow members to sign-in with {{ authProvider }}", - "Connected": "Connected", "Disabled": "Disabled", "Allow members to sign-in using their email address": "Allow members to sign-in using their email address", "The server must have SMTP configured to enable this setting": "Bu ayarı etkinleştirmek için sunucuda SMTP yapılandırılmış olmalıdır", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Desteklenen hizmetlere bağlantılar, belgelerinizde zengin yerleştirmeler olarak gösterilir", "Collection creation": "Koleksiyon oluşturma", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io deployment", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Workspace name", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Çöp kutusu şu anda boş.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.", @@ -943,25 +964,37 @@ "This month": "Bu ay", "Last month": "Geçen ay", "This year": "Bu yıl", + "Connect": "Bağla", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Slack'e Ekle", "document published": "belge yayınlandı", "document updated": "belge güncellendi", "Posting to the {{ channelName }} channel on": "{{ channelName }} kanalına gönderiliyor", "These events should be posted to Slack": "Bu olaylar Slack'e gönderilmelidir", - "Disconnect": "Bağlantıyı kes", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.", - "Connect": "Bağla", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Slack entegrasyonu şu anda devre dışı. Lütfen ilgili ortam değişkenlerini ayarlayın ve entegrasyonu etkinleştirmek için sunucuyu yeniden başlatın.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited", "Post to Channel": "Post to Channel", "This is what we found for \"{{ term }}\"": "This is what we found for \"{{ term }}\"", "No results for \"{{ term }}\"": "No results for \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Are you sure you want to delete the {{ name }} webhook?", "Webhook updated": "Webhook updated", "Update": "Update", diff --git a/shared/i18n/locales/uk_UA/translation.json b/shared/i18n/locales/uk_UA/translation.json index f4541d992d88..a3e301c2cf7b 100644 --- a/shared/i18n/locales/uk_UA/translation.json +++ b/shared/i18n/locales/uk_UA/translation.json @@ -11,8 +11,8 @@ "Delete": "Видалити", "Delete collection": "Видалити колекцію", "Copy ID": "Скопіювати ID", - "Clear IndexedDB cache": "Clear IndexedDB cache", - "IndexedDB cache cleared": "IndexedDB cache cleared", + "Clear IndexedDB cache": "Очистити кеш IndexedDB", + "IndexedDB cache cleared": "Кеш IndexedDB очищено", "Toggle debug logging": "Ввімкнути/вимкнути ведення журналу відлагодження", "Debug logging enabled": "Журнал налагодження увімкнено", "Debug logging disabled": "Журнал налагодження вимкнено", @@ -22,10 +22,10 @@ "New from template": "Новий з шаблону", "New nested document": "Новий вкладений документ", "Publish": "Зробити публічним", - "Published {{ documentName }}": "Published {{ documentName }}", + "Published {{ documentName }}": "Опубліковано {{ documentName }}", "Publish document": "Опублікувати документ", "Unpublish": "Скасувати публікацію", - "Unpublished {{ documentName }}": "Unpublished {{ documentName }}", + "Unpublished {{ documentName }}": "Знято з публікації {{ documentName }}", "Subscribe": "Підписатися", "Subscribed to document notifications": "Підписано на сповіщення про документи", "Unsubscribe": "Відписатися", @@ -38,19 +38,19 @@ "Markdown": "Markdown", "Download": "Завантажити", "Download document": "Завантажити документ", - "Copy as Markdown": "Copy as Markdown", - "Markdown copied to clipboard": "Markdown copied to clipboard", + "Copy as Markdown": "Скопіювати як Markdown", + "Markdown copied to clipboard": "Markdown скопійовано в буфер обміну", "Copy link": "Скопіювати лінк", "Link copied to clipboard": "Посилання скопійовано в буфер обміну", "Copy": "Копіювати", "Duplicate": "Дублювати", "Duplicate document": "Дублювати документ", - "Copy document": "Copy document", + "Copy document": "Копіювати документ", "collection": "колекція", "Pin to {{collectionName}}": "Закріпити у {{collectionName}}", "Pinned to collection": "Закріплено в колекції", "Pin to home": "Закріпити на головній", - "Pinned to home": "Pinned to home", + "Pinned to home": "Закріплено на домашню сторінку", "Pin": "Закріпити", "Print": "Друкувати", "Print document": "Надрукувати документ", @@ -69,8 +69,8 @@ "Comments": "Коментарі", "History": "Історія", "Insights": "Статистика", - "Disable viewer insights": "Disable viewer insights", - "Enable viewer insights": "Enable viewer insights", + "Disable viewer insights": "Вимкнути статистику перегляду", + "Enable viewer insights": "Увімкнути статистику перегляду", "Home": "Головна", "Drafts": "Чернетки", "Trash": "Кошик", @@ -79,6 +79,7 @@ "Templates": "Шаблони", "Notifications": "Сповіщення", "Preferences": "Налаштування", + "Documentation": "Документація", "API documentation": "API документація", "Toggle sidebar": "Увімкнути/Вимкнути бічну панель", "Send us feedback": "Надіслати відгук", @@ -88,7 +89,7 @@ "Download {{ platform }} app": "Завантажити {{ platform }} додаток", "Log out": "Вийти", "Mark notifications as read": "Позначити сповіщення як прочитані", - "Archive all notifications": "Archive all notifications", + "Archive all notifications": "Архівувати всі сповіщення", "Restore revision": "Відновити версію", "Link copied": "Посилання скопійовано", "Dark": "Темна", @@ -101,7 +102,12 @@ "Select a workspace": "Вибрати робочий простір", "New workspace": "Новий робочий простір", "Create a workspace": "Створити робочий простір", + "Login to workspace": "Login to workspace", "Invite people": "Запросити інших", + "Invite to workspace": "Запросити в робоче середовище", + "Promote to {{ role }}": "Підвищити до {{ role }}", + "Demote to {{ role }}": "Понизити до {{ role }}", + "Update role": "Оновити роль", "Delete user": "Видалити користувача", "Collection": "Колекція", "Debug": "Режим відладки", @@ -117,11 +123,11 @@ "previously edited": "відредаговано раніше", "You": "Ви", "Viewers": "Глядачі", - "Collections are used to group documents and choose permissions": "Collections are used to group documents and choose permissions", + "Collections are used to group documents and choose permissions": "Колекції використовуються для групування документів та вибору прав доступу", "Name": "Назва", - "The default access for workspace members, you can share with more users or groups later.": "The default access for workspace members, you can share with more users or groups later.", + "The default access for workspace members, you can share with more users or groups later.": "За замовчуванням доступ до членів робочої області, ви можете поділитися з більшою кількістю користувачів або груп пізніше.", "Public document sharing": "Публічний обмін документами", - "Allow documents within this collection to be shared publicly on the internet.": "Allow documents within this collection to be shared publicly on the internet.", + "Allow documents within this collection to be shared publicly on the internet.": "Дозволити документам у цій колекції публічно ділитись в інтернеті.", "Saving": "Зберегти", "Save": "Зберегти", "Creating": "Створення", @@ -152,7 +158,7 @@ "Submenu": "Підменю", "Collections could not be loaded, please reload the app": "Не вдалося завантажити колекції. Перезавантажте програму", "Default collection": "Колекція за замовчуванням", - "Install now": "Install now", + "Install now": "Встановити зараз", "Deleted Collection": "Видалена колекція", "Unpin": "Відкріпити", "Search collections & documents": "Пошук колекцій і документів", @@ -169,7 +175,7 @@ "You archived": "Ви заархівували", "{{ userName }} archived": "Заархівовано {{ userName }}", "{{ userName }} created": "Створено {{ userName }}", - "Imported": "Imported", + "Imported": "Імпортовано", "You created": "Ви створили", "You published": "Ви опублікували", "{{ userName }} published": "Опубліковано {{ userName }}", @@ -190,10 +196,11 @@ "Currently editing": "Зараз редагується", "Currently viewing": "Зараз переглядають", "Viewed {{ timeAgo }}": "Переглянуто {{ timeAgo }}", - "Copy of {{ documentName }}": "Copy of {{ documentName }}", - "Title": "Title", - "Include nested documents": "Include nested documents", - "Emoji Picker": "Emoji Picker", + "Copy of {{ documentName }}": "Копія {{ documentName }}", + "Title": "Заголовок", + "Published": "Published", + "Include nested documents": "Включаючи вкладені документи", + "Emoji Picker": "Вибір Emoji", "Remove": "Видалити", "Module failed to load": "Не вдалося завантажити модуль", "Loading Failed": "Не вдалося завантажити", @@ -202,21 +209,21 @@ "Something Unexpected Happened": "Щось пішло не так", "Sorry, an unrecoverable error occurred{{notified}}. Please try reloading the page, it may have been a temporary glitch.": "Вибачте, сталася невиправна помилка{{notified}}. Спробуйте перезавантажити сторінку, можливо, це був тимчасовий збій.", "our engineers have been notified": "наші інженери були повідомлені", - "Show detail": "Show detail", + "Show detail": "Показати деталі", "Current version": "Поточна версія", "{{userName}} edited": "{{userName}} відредаговано", "{{userName}} archived": "{{userName}} заархівовано", "{{userName}} restored": "{{userName}} відновлено", "{{userName}} deleted": "{{userName}} видалено", - "{{userName}} added {{addedUserName}}": "{{userName}} added {{addedUserName}}", - "{{userName}} removed {{removedUserName}}": "{{userName}} removed {{removedUserName}}", + "{{userName}} added {{addedUserName}}": "{{userName}} додав(-ла) {{addedUserName}}", + "{{userName}} removed {{removedUserName}}": "{{userName}} видалив(-ла) {{removedUserName}}", "{{userName}} moved from trash": "{{userName}} переміщено з кошика", "{{userName}} published": "{{userName}} опубліковано", "{{userName}} unpublished": "{{userName}} знятий з публікації", "{{userName}} moved": "{{userName}} переміщено", "Export started": "Експорт розпочато", - "Your file will be available in {{ location }} soon": "Your file will be available in {{ location }} soon", - "View": "View", + "Your file will be available in {{ location }} soon": "Скоро ваш файл буде доступний в {{ location }}", + "View": "Перегляд", "A ZIP file containing the images, and documents in the Markdown format.": "ZIP-файл із зображеннями та документами у форматі Markdown.", "A ZIP file containing the images, and documents as HTML files.": "ZIP-файл із зображеннями та документами у форматі HTML.", "Structured data that can be used to transfer data to another compatible {{ appName }} instance.": "Структуровані дані, які можна використовувати для передачі даних до іншого сумісного екземпляра {{ appName }}.", @@ -228,13 +235,15 @@ "{{ count }} member": "{{ count }} учасник", "{{ count }} member_plural": "{{ count }} учасників", "Group members": "Учасники групи", + "{{authorName}} created <3>": "{{authorName}} створив <3>", + "{{authorName}} opened <3>": "{{authorName}} відкрив <3>", "Show menu": "Показати меню", "Choose icon": "Оберіть іконку", "Loading": "Завантаження", "Select a color": "Виберіть колір", "Search": "Пошук", - "Permission": "Permission", - "Can edit": "Can edit", + "Permission": "Права доступу", + "Can edit": "Можна редагувати", "View only": "Тільки перегляд", "No access": "Немає доступу", "Default access": "Доступ за замовчуванням", @@ -309,11 +318,12 @@ "No results": "Нічого не знайдено", "Previous page": "Попередня сторінка", "Next page": "Наступна сторінка", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Ви впевнені, що бажаєте зробити {{ userName }} читачем? Він не зможе редагувати будь-який контент", - "Are you sure you want to make {{ userName }} a member?": "Ви впевнені, що хочете зробити {{ userName }} учасником?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Я розумію, видалити", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Ви впевнені, що бажаєте остаточно видалити {{ userName }}? Цю операцію неможливо скасувати, подумайте натомість про деактивацію користувача.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Ви впевнені, що хочете зробити {{ userName }} адміністратором? Адміністратори можуть змінювати налаштування команди та платіжну інформацію.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Ви впевнені, що хочете заблокувати {{ userName }}? Заблоковані користувачі не зможуть увійти.", "New name": "Нова назва", "Name can't be empty": "Назва не може бути незаповненою", @@ -450,13 +460,11 @@ "Contents": "Зміст", "Headings you add to the document will appear here": "Тут з’являться заголовки, які ви додасте до документа", "Table of contents": "Зміст", - "Change role to admin": "Змінити роль на адміністратора", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Змінити роль на глядача", "Change name": "Змінити ім'я", "Suspend user": "Тимчасово заблокувати користувача", "An error occurred while sending the invite": "Помилка при відправленні запрошення", "User options": "Параметри користувача", + "Change role": "Change role", "Resend invite": "Повторно надіслати запрошення", "Revoke invite": "Відкликати запрошення", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Ми надіслали вам запрошення!", "Those email addresses are already invited": "Ці електронні адреси вже запрошені", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Вибачте, ви можете надіслати лише {{MAX_INVITES}} запрошень одночасно", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Запросіть учасників або гостей приєднатися до вашого робочого простору. Вони можуть увійти за допомогою {{signinMethods}} або використати свою електронну адресу.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Запросіть учасників приєднатися до вашого робочого простору. Їм потрібно буде ввійти за допомогою {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Як адміністратор ви також можете <2>увімкнути вхід за допомогою електронної пошти.", - "Want a link to share directly with your team?": "Хочете отримати посилання, яким можна поділитися безпосередньо зі своєю командою?", - "Email": "Електронна пошта", + "Invite as": "Invite as", "Role": "Роль", - "Remove invite": "Видалити запрошення", + "Email": "Електронна пошта", "Add another": "Додати інше", "Inviting": "Запрошується", "Send Invites": "Надіслати запрошення", @@ -701,6 +711,9 @@ "Continue with Email": "Продовжити з електронною поштою", "Continue with {{ authProviderName }}": "Продовжити з {{ authProviderName }}", "Back to home": "Повернутися на головну", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "піддомен", "The domain associated with your email address has not been allowed for this workspace.": "Домен, пов'язаний з вашою електронною адресою, не був дозволений для робочої області.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Неможливо увійти. Будь ласка, перейдіть до користувацької URL-адреси робочої області, потім спробуйте увійти знову. <1>Якщо ви були запрошені на робочу область, знайдіть посилання на неї в електронному листі із запрошенням.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "На жаль, новий обліковий запис не можна створити з особистою адресою Gmail.<1> Натомість використовуйте обліковий запис Google Workspaces.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Ваш власний домен успішно вказує на Outline. Щоб завершити процес налаштування, зверніться до служби підтримки.", "Choose workspace": "Вибрати робочий простір", "This login method requires choosing your workspace to continue": "Цей метод входу вимагає вибору робочого простору, щоб продовжити", - "subdomain": "піддомен", "Check your email": "Перевірте свою е-пошту", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Чарівне посилання для входу було надіслано на електронну адресу {{ emailLinkSentTo }} , якщо обліковий запис існує.", "Back to login": "Повернутися на сторінку входу", @@ -760,6 +772,10 @@ "Copied": "Скопійовано", "Revoking": "Анулювання", "Are you sure you want to revoke the {{ tokenName }} token?": "Ви впевнені, що хочете відкликати {{ tokenName }} токен?", + "Disconnect integration": "Disconnect integration", + "Connected": "Підключено", + "Disconnect": "Від'єднатись", + "Disconnecting": "Disconnecting", "Allowed domains": "Дозволені домени", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Домени, яким має бути дозволено створювати нові облікові записи за допомогою системи єдиного входу. Зміна цього параметра не впливає на наявні облікові записи користувачів.", "Remove domain": "Видалити домен", @@ -789,6 +805,7 @@ "Where do I find the file?": "Де я можу знайти файл?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "У Notion натисніть Налаштування та учасники на лівій бічній панелі та відкрийте Налаштування. Знайдіть розділ «Експорт» і натисніть «Експортувати весь вміст робочого простору. Виберіть HTML як формат для найкращої сумісності даних.", "Last active": "Остання активність", + "Guest": "Guest", "Shared": "Поширено", "by {{ name }}": "{{ name }}", "Last accessed": "Останній доступ", @@ -796,8 +813,10 @@ "Date shared": "Дата публікації", "Domain": "Domain", "Views": "Перегляди", - "Everyone": "Усі", + "All roles": "All roles", "Admins": "Адміністратори", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Налаштування збережено", "Logo updated": "Логотип оновлено", "Unable to upload new logo": "Не вдалося завантажити новий логотип", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Імпортувати сторінки з Confluence", "Enterprise": "Enterprise", "Recent imports": "Останні імпорти", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Усі, хто увійшов у {{appName}}, перераховані тут. Можливо, є інші користувачі, які мають доступ через {team.signinMethods}, але ще не увійшли.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Фільтр", "Receive a notification whenever a new document is published": "Отримувати сповіщення щоразу, коли публікується новий документ", "Document updated": "Документ оновлено", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Нових користувачів спочатку потрібно буде запросити для створення облікового запису. Роль за замовчуванням і Дозволені домени більше не застосовуватимуться.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Дозволити учасникам входити за допомогою {{ authProvider }}", - "Connected": "Підключено", "Disabled": "Вимкнено", "Allow members to sign-in using their email address": "Дозволити учасникам входити, використовуючи свою адресу електронної пошти", "The server must have SMTP configured to enable this setting": "Щоб активувати цей параметр, на сервері має бути налаштований SMTP", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Посилання до підтримуваних сервісів показані як багатофункціональні вкладення у ваші документи", "Collection creation": "Створення колекції", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Розгортання Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Додайте сюди URL-адресу інсталяції для самостійного розміщення draw.io, щоб увімкнути автоматичне вбудовування діаграм у документи.", "Grist deployment": "Grist розгортання", @@ -933,6 +953,7 @@ "Workspace name": "Назва робочого простору", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Кошик на даний момент порожній.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Ви впевнені? Видалення вашого облікового запису знищить ідентифікаційні дані, пов'язані з вашим користувачем, і не може бути скасоване. Ви одразу вийдете з {{appName}} і всі ваші API токени будуть відкликані.", @@ -943,25 +964,37 @@ "This month": "Цього місяця", "Last month": "Минулого місяця", "This year": "Цього року", + "Connect": "Під’єднатися", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Додати в Slack", "document published": "документ опубліковано", "document updated": "документ оновлено", "Posting to the {{ channelName }} channel on": "Публікація на каналі {{ channelName }} на", "These events should be posted to Slack": "Ці події повинні бути опубліковані в Slack", - "Disconnect": "Від'єднатись", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Отримайте багаті превью {{ appName }} посилань, розділених у Slack, і використовуйте команду {{ command }} для пошуку документів без виходу з вашого чату.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Підключіть {{appName}} колекцій до каналів Slack. Повідомлення будуть автоматично опубліковані в Slack, коли документи будуть опубліковані або оновлені.", - "Connect": "Під’єднатися", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Інтеграція Slack наразі вимкнена. Встановіть відповідні змінні середовища та перезапустіть сервер, щоб увімкнути інтеграцію.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "Як використовувати {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "На жаль, нам не вдалося знайти інтеграцію для вашої команди. Перейдіть до налаштувань {{ appName }} , щоб налаштувати один.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Схоже, ви ще не увійшли в систему {{ appName }} , тому результати можуть бути обмеженими", "Post to Channel": "Опублікувати в каналі", "This is what we found for \"{{ term }}\"": "Ось що ми знайшли для \"{{ term }}\"", "No results for \"{{ term }}\"": "0 результатів пошуку за запитом «{{ terms }}»", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Ви впевнені, що хочете видалити вебхук {{ name }}?", "Webhook updated": "Вебхук оновлено", "Update": "Оновити", diff --git a/shared/i18n/locales/vi_VN/translation.json b/shared/i18n/locales/vi_VN/translation.json index 1b0a967572ed..93a07126ddfd 100644 --- a/shared/i18n/locales/vi_VN/translation.json +++ b/shared/i18n/locales/vi_VN/translation.json @@ -79,6 +79,7 @@ "Templates": "Thư viện mẫu", "Notifications": "Thông báo", "Preferences": "Cài đặt", + "Documentation": "Documentation", "API documentation": "Tài liệu API", "Toggle sidebar": "Bật/tắt Sidebar", "Send us feedback": "Gửi phản hồi", @@ -101,7 +102,12 @@ "Select a workspace": "Chọn workspace", "New workspace": "Workspace mới", "Create a workspace": "Tạo workspace", + "Login to workspace": "Login to workspace", "Invite people": "Mời mọi người", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "Xóa người dùng", "Collection": "Bộ sưu tập", "Debug": "Gỡ lỗi", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "Viewed {{ timeAgo }}", "Copy of {{ documentName }}": "Copy of {{ documentName }}", "Title": "Title", + "Published": "Published", "Include nested documents": "Include nested documents", "Emoji Picker": "Emoji Picker", "Remove": "Bỏ", @@ -228,6 +235,8 @@ "{{ count }} member": "{{$count}} Thành viên", "{{ count }} member_plural": "{{$count}} Thành viên", "Group members": "Thành viên trong nhóm", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "Hiện Menu", "Choose icon": "Chọn biểu tượng", "Loading": "Đang tải", @@ -309,11 +318,12 @@ "No results": "Không có kết quả", "Previous page": "Trang trước", "Next page": "Trang sau", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "Bạn có chắc chắn muốn đặt thành viên {{ userName }} thành chỉ đọc không? Họ sẽ không thể chỉnh sửa bất kỳ nội dung nào", - "Are you sure you want to make {{ userName }} a member?": "Bạn có chắc chắn muốn đặt {{ userName }} làm thành viên không?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "Tôi hiểu, xóa", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "Bạn có chắc muốn xóa vĩnh viễn {{ userName }}? Thao tác này không thể khôi phục được, hãy cân nhắc treo tài khoản đó.", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "Bạn có chắc chắn muốn đặt {{ userName }} làm quản trị viên không? Quản trị viên có thể sửa đổi nhóm và thông tin thanh toán.", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "Bạn có chắc chắn muốn tạm ngưng tài khoản này không? Người dùng bị treo sẽ bị ngăn đăng nhập.", "New name": "Tên mới", "Name can't be empty": "Không được để trống tên", @@ -450,13 +460,11 @@ "Contents": "Nội Dung", "Headings you add to the document will appear here": "Các tiêu đề bạn thêm vào tài liệu sẽ xuất hiện ở đây", "Table of contents": "Mục lục", - "Change role to admin": "Đổi vai trò thành quản trị viên", - "Change role to editor": "Change role to editor", - "Change role to viewer": "Thay đổi vai trò thành người xem", "Change name": "Đổi tên", "Suspend user": "Treo tài khoản", "An error occurred while sending the invite": "Đã xảy ra lỗi khi gửi lời mời", "User options": "Tùy chọn người dùng", + "Change role": "Change role", "Resend invite": "Gửi lại lời mời", "Revoke invite": "Thu hồi lời mời", "Activate user": "Activate user", @@ -654,15 +662,17 @@ "We sent out your invites!": "Chúng tôi đã gửi lời mời của bạn!", "Those email addresses are already invited": "Những địa chỉ email đó đã được mời", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "Xin lỗi, bạn chỉ có thể gửi {{MAX_INVITES}} lời mời cùng một lúc", - "Invited members will receive access to": "Invited members will receive access to", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Mời thành viên hoặc khách tham gia không gian làm việc của bạn. Họ có thể đăng nhập bằng {{signinMethods}} hoặc sử dụng địa chỉ email của họ.", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "Mời các thành viên tham gia không gian làm việc của bạn. Họ sẽ cần đăng nhập bằng {{signinMethods}}.", "As an admin you can also <2>enable email sign-in.": "Với tư cách là quản trị viên, bạn cũng có thể <2> bật đăng nhập email.", - "Want a link to share directly with your team?": "Muốn có một Link để chia sẻ trực tiếp với nhóm của bạn?", - "Email": "Email", + "Invite as": "Invite as", "Role": "Vai trò", - "Remove invite": "Thu hồi lời mời", + "Email": "Email", "Add another": "Thêm khác", "Inviting": "Mời", "Send Invites": "Gửi Lời mời", @@ -701,6 +711,9 @@ "Continue with Email": "Tiếp tục với email", "Continue with {{ authProviderName }}": "Tiếp tục với {{ authProviderName }}", "Back to home": "Quay lại trang chủ", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "tên miền phụ", "The domain associated with your email address has not been allowed for this workspace.": "Tên miền email của bạn không được chấp nhận cho không gian làm việc này.", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "Miền tùy chỉnh của bạn đang trỏ thành công vào Outline. Để hoàn tất quá trình thiết lập, vui lòng liên hệ với bộ phận hỗ trợ.", "Choose workspace": "Chọn không gian làm việc", "This login method requires choosing your workspace to continue": "Phương thức đăng nhập này yêu cầu chọn không gian làm việc của bạn để tiếp tục", - "subdomain": "tên miền phụ", "Check your email": "Kiểm tra email của bạn", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "Một liên kết đăng nhập kỳ diệu đã được gửi tới email {{ emailLinkSentTo }} nếu có tài khoản.", "Back to login": "Quay lại đăng nhập", @@ -760,6 +772,10 @@ "Copied": "\u001dĐã sao chép", "Revoking": "Đang thu hồi", "Are you sure you want to revoke the {{ tokenName }} token?": "Bạn có chắc chắn muốn thu hồi Token {{ tokenName }} không?", + "Disconnect integration": "Disconnect integration", + "Connected": "Đã kết nối", + "Disconnect": "Ngắt kết nối", + "Disconnecting": "Disconnecting", "Allowed domains": "Các tên miền cho phép", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Các miền được phép tạo tài khoản mới bằng SSO. Việc thay đổi cài đặt này không ảnh hưởng đến các tài khoản người dùng hiện có.", "Remove domain": "Xóa tên miền", @@ -789,6 +805,7 @@ "Where do I find the file?": "Tôi tìm tệp ở đâu?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "Trong Notion, Click vào Cài đặt & Thành viên ở thanh bên trái và mở Cài đặt. Tìm phần Xuất và nhấp vào Xuất tất cả nội dung không gian làm việc. Chọn HTML làm định dạng để có khả năng tương thích dữ liệu tốt nhất.", "Last active": "Hoạt động lần cuối", + "Guest": "Guest", "Shared": "Được chia sẻ", "by {{ name }}": "bằng {{ name }}", "Last accessed": "Truy nhập lần cuối", @@ -796,8 +813,10 @@ "Date shared": "Ngày chia sẻ", "Domain": "Domain", "Views": "Lượt xem", - "Everyone": "Mọi người", + "All roles": "All roles", "Admins": "Quản trị viên", + "Editors": "Editors", + "All status": "All status", "Settings saved": "Đã lưu cài đặt", "Logo updated": "Đã cập nhật logo", "Unable to upload new logo": "Không thể tải lên biểu trưng mới", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "Nhập các trang từ Confluence", "Enterprise": "Doanh nghiệp", "Recent imports": "Kết xuất gần đây", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "Mọi người đã đăng nhập vào {{appName}} được liệt kê ở đây. Có thể có những người dùng khác có quyền truy cập thông qua {team.signinMethods} nhưng chưa đăng nhập.", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "Bộ Lọc", "Receive a notification whenever a new document is published": "Nhận thông báo bất cứ khi nào một tài liệu mới được xuất bản", "Document updated": "Tài liệu được cập nhật", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "Người dùng mới trước tiên sẽ cần được mời để tạo tài khoản. Vai trò mặc địnhCác miền được phép sẽ không còn áp dụng.", "Settings that impact the access, security, and content of your workspace.": "Settings that impact the access, security, and content of your workspace.", "Allow members to sign-in with {{ authProvider }}": "Cho phép thành viên đăng nhập bằng {{ authProvider }}", - "Connected": "Đã kết nối", "Disabled": "Vô hiệu hóa", "Allow members to sign-in using their email address": "Cho phép thành viên đăng nhập bằng địa chỉ email của họ", "The server must have SMTP configured to enable this setting": "Máy chủ phải được định cấu hình SMTP để bật cài đặt này", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "Các đường Link đến các dịch vụ được hỗ trợ được hiển thị dưới dạng nhúng phong phú trong tài liệu của bạn", "Collection creation": "Tạo bộ sưu tập", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Triển khai Draw.io", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Thêm url cài đặt draw.io tự lưu trữ của bạn tại đây để cho phép tự động nhúng sơ đồ vào tài liệu.", "Grist deployment": "Grist deployment", @@ -933,6 +953,7 @@ "Workspace name": "Tên không gian làm việc", "You are creating a new workspace using your current account — {{email}}": "You are creating a new workspace using your current account — {{email}}", "To create a workspace under another email please sign up from the homepage": "To create a workspace under another email please sign up from the homepage", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "Thùng rác hiện đang trống.", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "Bạn có chắc không? Xóa tài khoản của bạn sẽ hủy dữ liệu nhận dạng được liên kết với người dùng của bạn và không thể hoàn tác. Bạn sẽ bị đăng xuất khỏi {{appName}} ngay lập tức và tất cả mã thông báo API của bạn sẽ bị thu hồi.", @@ -943,25 +964,37 @@ "This month": "Tháng này", "Last month": "Tháng trước", "This year": "Năm nay", + "Connect": "Kết nối", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "Thêm vào Slack", "document published": "tài liệu được đăng tải", "document updated": "tài liệu được cập nhật", "Posting to the {{ channelName }} channel on": "Đăng lên kênh {{ channelName }}", "These events should be posted to Slack": "Những sự kiện này nên được đăng lên Slack", - "Disconnect": "Ngắt kết nối", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?", - "Something went wrong while authenticating your request. Please try logging in again.": "Something went wrong while authenticating your request. Please try logging in again.", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "Nhận các bản xem trước phong phú của {{ appName }} liên kết được chia sẻ trong Slack và sử dụng lệnh gạch chéo {{ command }} để tìm kiếm tài liệu mà không cần rời khỏi cuộc trò chuyện của bạn.", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "Kết nối {{appName}} bộ sưu tập với các kênh Slack. Tin nhắn sẽ tự động được đăng lên Slack khi tài liệu được xuất bản hoặc cập nhật.", - "Connect": "Kết nối", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Tích hợp Slack hiện đã bị vô hiệu hóa. Vui lòng đặt các biến môi trường được liên kết và khởi động lại máy chủ để kích hoạt tích hợp.", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "How to use {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "Rất tiếc, chúng tôi không thể tìm thấy tích hợp cho nhóm của bạn. Đi tới cài đặt {{ appName }} của bạn để thiết lập một cài đặt.", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "Có vẻ như bạn chưa đăng nhập vào {{ appName }} nên kết quả có thể bị hạn chế", "Post to Channel": "Đăng lên Kênh", "This is what we found for \"{{ term }}\"": "Đây là những gì chúng tôi tìm thấy cho \"{{ term }}\"", "No results for \"{{ term }}\"": "Không có kết quả cho \"{{ term }}\"", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "Bạn có chắc chắn muốn xóa webhook {{ name }} không?", "Webhook updated": "Webhook đã cập nhật", "Update": "Cập nhật", diff --git a/shared/i18n/locales/zh_CN/translation.json b/shared/i18n/locales/zh_CN/translation.json index b5f74a2e0e3f..854412cd27d1 100644 --- a/shared/i18n/locales/zh_CN/translation.json +++ b/shared/i18n/locales/zh_CN/translation.json @@ -6,7 +6,7 @@ "Edit collection": "编辑文档集", "Permissions": "权限", "Collection permissions": "文档集权限", - "Star": "加入收藏", + "Star": "收藏", "Unstar": "取消收藏", "Delete": "删除", "Delete collection": "删除文档集", @@ -31,7 +31,7 @@ "Unsubscribe": "取消订阅", "Unsubscribed from document notifications": "取消订阅文档通知", "Share": "分享", - "Share this document": "共享文档", + "Share this document": "共享此文档", "HTML": "HTML", "PDF": "PDF", "Exporting": "正在导出", @@ -41,23 +41,23 @@ "Copy as Markdown": "以 Markdown 格式复制", "Markdown copied to clipboard": "Markdown 已复制到剪贴板", "Copy link": "复制链接", - "Link copied to clipboard": "链接已经复制到剪贴板", + "Link copied to clipboard": "链接已复制到剪贴板", "Copy": "拷贝", "Duplicate": "复制", "Duplicate document": "复制文档", "Copy document": "复制文档", "collection": "文档集", - "Pin to {{collectionName}}": "固定为 {{collectionName}}", + "Pin to {{collectionName}}": "固定到{{collectionName}}", "Pinned to collection": "置顶到文档集", - "Pin to home": "固定到首页", + "Pin to home": "固定到主页", "Pinned to home": "已固定到主页", - "Pin": "置顶", + "Pin": "固定", "Print": "打印", "Print document": "打印文档", "Import document": "导入文档", - "Templatize": "作为模板", + "Templatize": "模板化", "Create template": "创建模板", - "Open random document": "随机打开文档", + "Open random document": "打开随机文档", "Search documents for \"{{searchQuery}}\"": "搜索匹配 \"{{searchQuery}}\" 的文档", "Move": "移动", "Move {{ documentType }}": "移动 {{ documentType }}", @@ -69,8 +69,8 @@ "Comments": "评论", "History": "历史记录", "Insights": "统计", - "Disable viewer insights": "Disable viewer insights", - "Enable viewer insights": "Enable viewer insights", + "Disable viewer insights": "禁用浏览者统计", + "Enable viewer insights": "启用浏览者统计", "Home": "主页", "Drafts": "草稿箱", "Trash": "回收站", @@ -78,30 +78,36 @@ "Profile": "基本资料", "Templates": "文档模板", "Notifications": "通知", - "Preferences": "首选项", + "Preferences": "偏好设置", + "Documentation": "帮助文档", "API documentation": "API 文档", "Toggle sidebar": "切换侧边栏", "Send us feedback": "发送反馈", - "Report a bug": "提交 Bug", + "Report a bug": "报告错误", "Changelog": "更新日志", "Keyboard shortcuts": "快捷键", "Download {{ platform }} app": "下载 {{ platform }} 应用程序", "Log out": "退出登录", "Mark notifications as read": "将通知标记为已读", - "Archive all notifications": "Archive all notifications", + "Archive all notifications": "将所有通知存档", "Restore revision": "还原修改", "Link copied": "链接已复制", "Dark": "暗黑模式", "Light": "明亮模式", - "System": "系统信息", - "Appearance": "外观", + "System": "跟随系统", + "Appearance": "界面风格", "Change theme": "更改主题", "Change theme to": "更改主题为", "Switch workspace": "切换工作区", "Select a workspace": "选择工作区", "New workspace": "新建工作区", "Create a workspace": "创建工作区", + "Login to workspace": "Login to workspace", "Invite people": "邀请其他人", + "Invite to workspace": "邀请到工作区", + "Promote to {{ role }}": "提升为 {{ role }}", + "Demote to {{ role }}": "降级为 {{ role }}", + "Update role": "更新角色", "Delete user": "删除用户", "Collection": "文档集", "Debug": "调试", @@ -114,43 +120,43 @@ "Recent searches": "最近的搜索", "currently editing": "正在编辑", "currently viewing": "正在浏览", - "previously edited": "之前已编辑", + "previously edited": "先前已编辑", "You": "你", "Viewers": "浏览者", - "Collections are used to group documents and choose permissions": "Collections are used to group documents and choose permissions", + "Collections are used to group documents and choose permissions": "文档集用于对文档进行分组和权限管理", "Name": "名称", - "The default access for workspace members, you can share with more users or groups later.": "The default access for workspace members, you can share with more users or groups later.", + "The default access for workspace members, you can share with more users or groups later.": "工作区成员的默认访问权限,你可以稍后与更多的用户或组分享。", "Public document sharing": "公开共享文档", - "Allow documents within this collection to be shared publicly on the internet.": "Allow documents within this collection to be shared publicly on the internet.", + "Allow documents within this collection to be shared publicly on the internet.": "允许此集合中的文档在 internet 上公开共享。", "Saving": "保存中", "Save": "保存", "Creating": "正在创建", "Create": "创建", - "Collection deleted": "收藏已删除", + "Collection deleted": "文档集已删除", "I’m sure – Delete": "确认删除", "Deleting": "正在删除", - "Are you sure about that? Deleting the {{collectionName}} collection is permanent and cannot be restored, however all published documents within will be moved to the trash.": "您确定要这样做吗? 删除 {{collectionName}} 合集是永久性的,且无法还原。不过,合集中的文件将被移动到回收站。", + "Are you sure about that? Deleting the {{collectionName}} collection is permanent and cannot be restored, however all published documents within will be moved to the trash.": "你确定吗?删除 {{collectionName}} 合集是永久性的,且无法还原。不过,合集中的文件将被移动到回收站。", "Also, {{collectionName}} is being used as the start view – deleting it will reset the start view to the Home page.": "另外,{{collectionName}} 被用作起始视图--删除它将重置起始视图为主页。", "Sorry, an error occurred saving the collection": "抱歉,保存文档集时出错", "Add a description": "添加描述", "Collapse": "折叠", "Expand": "展开", "Type a command or search": "输入命令或搜索", - "Are you sure you want to permanently delete this entire comment thread?": "您确定要永久删除此评论吗?", - "Are you sure you want to permanently delete this comment?": "您确定要永久删除此评论吗?", + "Are you sure you want to permanently delete this entire comment thread?": "你确定要永久删除此评论吗?", + "Are you sure you want to permanently delete this comment?": "你确定要永久删除此评论吗?", "Confirm": "确认", "Document is too large": "文档太大", "This document has reached the maximum size and can no longer be edited": "此文档已达到最大尺寸,无法再编辑", "Authentication failed": "身份验证失败", "Please try logging out and back in again": "请尝试注销并再次登录", "Authorization failed": "用户授权失败", - "You may have lost access to this document, try reloading": "您或已失去对此文档的访问权限,请尝试重新加载", + "You may have lost access to this document, try reloading": "你似乎失去了对此文档的访问权限,请尝试重新加载", "Too many users connected to document": "连接到文档的用户过多", - "Your edits will sync once other users leave the document": "您的编辑将在其他用户离开文档后同步", + "Your edits will sync once other users leave the document": "你的编辑将在其他用户离开文档后同步", "Server connection lost": "服务器连接断开", - "Edits you make will sync once you’re online": "您所做的修改将在您重新连接后立即同步", + "Edits you make will sync once you’re online": "你所做的修改将在你在线后立即同步", "Submenu": "子菜单", - "Collections could not be loaded, please reload the app": "无法加载收藏夹,请重新加载应用", + "Collections could not be loaded, please reload the app": "无法加载文档集,请重新加载应用", "Default collection": "默认文档集", "Install now": "立即安装", "Deleted Collection": "删除文档集", @@ -159,23 +165,23 @@ "No results found": "未找到结果", "Untitled": "无标题", "New": "新", - "Only visible to you": "只对您可见", + "Only visible to you": "仅自己可见", "Draft": "草稿", "Template": "模板", - "You updated": "您更新了", + "You updated": "你已更新", "{{ userName }} updated": "{{ userName }} 已更新", - "You deleted": "您已删除", + "You deleted": "你已删除", "{{ userName }} deleted": "{{ userName }} 已删除", - "You archived": "您归档了", + "You archived": "你归档了", "{{ userName }} archived": "{{ userName }} 已归档", "{{ userName }} created": "{{ userName }} 已创建", - "Imported": "Imported", - "You created": "你创建了", + "Imported": "已导入", + "You created": "你已创建", "You published": "你发布了", "{{ userName }} published": "{{ userName }} 已发布", "You saved": "你保存了", "{{ userName }} saved": "{{ userName }} 已保存", - "Never viewed": "未被浏览", + "Never viewed": "从未被浏览过", "Viewed": "已浏览", "in": "在", "nested document": "子文档", @@ -189,9 +195,10 @@ "Creating a template from {{titleWithDefault}} is a non-destructive action – we'll make a copy of the document and turn it into a template that can be used as a starting point for new documents.": "从 {{titleWithDefault}} 创建模板是一个非破坏性的操作 - 我们将制作一个文档副本,并将其变成一个可以用作新文档起点的模板。", "Currently editing": "正在编辑", "Currently viewing": "正在浏览", - "Viewed {{ timeAgo }}": "{{ timeAgo }} 前浏览", + "Viewed {{ timeAgo }}": "{{ timeAgo }} 浏览", "Copy of {{ documentName }}": "复制 {{ documentName }}", "Title": "标题", + "Published": "已发布", "Include nested documents": "包含子文档", "Emoji Picker": "表情选择器", "Remove": "移除", @@ -208,26 +215,28 @@ "{{userName}} archived": "已被 {{userName}} 归档", "{{userName}} restored": "已被 {{userName}} 恢复", "{{userName}} deleted": "已被 {{userName}} 删除", - "{{userName}} added {{addedUserName}}": "{{userName}} added {{addedUserName}}", - "{{userName}} removed {{removedUserName}}": "{{userName}} removed {{removedUserName}}", + "{{userName}} added {{addedUserName}}": "{{userName}} 添加了 {{addedUserName}}", + "{{userName}} removed {{removedUserName}}": "{{userName}} 移除了 {{removedUserName}}", "{{userName}} moved from trash": "已被 {{userName}} 已从回收站移出", "{{userName}} published": "已被 {{userName}} 发布", "{{userName}} unpublished": "{{userName}} 未发布", "{{userName}} moved": "已被 {{userName}} 移动", "Export started": "已开始导出", - "Your file will be available in {{ location }} soon": "您的文件将很快在 {{ location }} 中提供", + "Your file will be available in {{ location }} soon": "你的文件将很快在 {{ location }} 中提供", "View": "浏览", "A ZIP file containing the images, and documents in the Markdown format.": "包含图像和 Markdown 格式文档的 ZIP 文件。", "A ZIP file containing the images, and documents as HTML files.": "包含图像和 HTML 格式文档的 ZIP 文件。", "Structured data that can be used to transfer data to another compatible {{ appName }} instance.": "结构化数据可以用于传输数据到另一个兼容的 {{ appName }} 实例。", "Export": "导出", "Exporting the collection {{collectionName}} may take some time.": "导出集合 {{collectionName}} 可能需要一些时间。", - "You will receive an email when it's complete.": "完成后,您将收到一封电子邮件。", + "You will receive an email when it's complete.": "完成后,你将收到一封电子邮件。", "Include attachments": "包含附件", "Including uploaded images and files in the exported data": "导出数据中包含上传的图像和文件", "{{ count }} member": "{{ count }} 位成员", "{{ count }} member_plural": "{{ count }} 位成员", "Group members": "群组成员", + "{{authorName}} created <3>": "{{authorName }} 已创建>", + "{{authorName}} opened <3>": "{{authorName}} 已打开 <3>", "Show menu": "显示菜单", "Choose icon": "选择图标", "Loading": "加载中", @@ -235,67 +244,67 @@ "Search": "搜索", "Permission": "权限", "Can edit": "可编辑", - "View only": "仅查看", + "View only": "仅浏览", "No access": "无访问权限", "Default access": "默认访问权限", - "Change Language": "更改界面语言", + "Change Language": "更改语言", "Dismiss": "忽略", - "You’re offline.": "您处于离线状态。", + "You’re offline.": "你已离线。", "Sorry, an error occurred.": "抱歉,出错了。", "Click to retry": "点击重试", "Back": "返回", "Unknown": "未知", "Mark all as read": "全部标记为已读", - "You're all caught up": "您已全部完成", + "You're all caught up": "你已全部完成", "Documents": "文档", "Results": "结果", "No results for {{query}}": "没有找到\"{{query}}\"的结果", - "{{ userName }} was removed from the document": "{{ userName }} was removed from the document", + "{{ userName }} was removed from the document": "已从文档中移除 {{ userName }}", "Could not remove user": "无法删除用户", - "Permissions for {{ userName }} updated": "Permissions for {{ userName }} updated", + "Permissions for {{ userName }} updated": "{{ userName }} 的权限已更新", "Could not update user": "无法更新用户", - "Has access through <2>parent": "Has access through <2>parent", + "Has access through <2>parent": "通过 <2>父 访问", "Suspended": "已停用", "Invited": "已邀请", "Viewer": "浏览者", - "Editor": "Editor", + "Editor": "编辑者", "Leave": "离开", - "All members": "All members", - "Everyone in the workspace": "Everyone in the workspace", - "Can view": "可查看", - "Everyone in the collection": "Everyone in the collection", - "You have full access": "You have full access", - "Created the document": "Created the document", - "Other people": "Other people", - "Other workspace members may have access": "Other workspace members may have access", - "This document may be shared with more workspace members through a parent document or collection you do not have access to": "This document may be shared with more workspace members through a parent document or collection you do not have access to", - "Access inherited from collection": "Access inherited from collection", + "All members": "所有成员", + "Everyone in the workspace": "工作区中的所有人", + "Can view": "可浏览", + "Everyone in the collection": "文档集中的所有人", + "You have full access": "你有完全访问权限", + "Created the document": "已创建文档", + "Other people": "其他人", + "Other workspace members may have access": "其他工作区成员也可以访问", + "This document may be shared with more workspace members through a parent document or collection you do not have access to": "此文档可能通过你没有访问权限的父文档或集合与更多工作区成员共享。", + "Access inherited from collection": "", "Only lowercase letters, digits and dashes allowed": "只允许使用小写字母、数字和破折号", "Sorry, this link has already been used": "抱歉,该链接已被占用", "Public link copied to clipboard": "公开链接已复制到剪贴板", "Copy public link": "复制公开链接", - "Web": "Web", + "Web": "网页", "Anyone with the link can access because the parent document, <2>{{documentTitle}}, is shared": "因为父文档《<2>{{documentTitle}}》设为共享,任何知道链接的人都可以访问", "Allow anyone with the link to access": "允许所有知道链接的人访问", "Publish to internet": "发布到外部网络", - "Nested documents are not shared on the web. Toggle sharing to enable access, this will be the default behavior in the future": "Nested documents are not shared on the web. Toggle sharing to enable access, this will be the default behavior in the future", - "Invite": "Invite", - "{{ userName }} was invited to the document": "{{ userName }} was invited to the document", - "{{ count }} people invited to the document": "{{ count }} people invited to the document", - "{{ count }} people invited to the document_plural": "{{ count }} people invited to the document", - "Invite by name": "Invite by name", - "No matches": "No matches", + "Nested documents are not shared on the web. Toggle sharing to enable access, this will be the default behavior in the future": "嵌套文档不会在网页上共享。切换共享以启用访问,这将是未来的默认行为。", + "Invite": "邀请", + "{{ userName }} was invited to the document": "{{ userName }} 被邀请到此文档", + "{{ count }} people invited to the document": "{{ count }} 个人被邀请到此文档", + "{{ count }} people invited to the document_plural": "{{ count }} 个人被邀请到此文档", + "Invite by name": "通过名字邀请", + "No matches": "无匹配项", "Logo": "网站图标", "Move document": "移动文档", "New doc": "新建文档", - "You can't reorder documents in an alphabetically sorted collection": "您不能在按字母排序的文档集中排序", + "You can't reorder documents in an alphabetically sorted collection": "你不能在按字母排序的文档集中排序", "Collections": "文档集", "Document not supported – try Markdown, Plain text, HTML, or Word": "不支持的文档类型 - 请用Markdown,纯文本,HTML或Word格式", "Empty": "空", "Go back": "返回", "Go forward": "前进", - "Could not load shared documents": "Could not load shared documents", - "Shared with me": "Shared with me", + "Could not load shared documents": "无法加载共享文档", + "Shared with me": "与我共享", "Show more": "显示更多", "Could not load starred documents": "无法加载星标文件", "Starred": "已加星标", @@ -304,17 +313,18 @@ "{{ releasesBehind }} versions behind_plural": "落后 {{ releasesBehind }} 个版本", "Return to App": "返回应用", "Installation": "安装", - "Unstar document": "取消星标文档", - "Star document": "星标文档", + "Unstar document": "取消收藏文档", + "Star document": "收藏文档", "No results": "没有找到结果", "Previous page": "上一页", "Next page": "下一页", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "您确定要将 {{ userName }} 设为只读模式吗?他们将无法编辑任何内容", - "Are you sure you want to make {{ userName }} a member?": "您确定要设置 {{ userName }} 为成员吗?", + "Admins can manage the workspace and access billing.": "管理员可以管理工作区和访问计费操作。", + "Editors can create, edit, and comment on documents.": "编辑者可以创建、编辑和评论文档。", + "Viewers can only view and comment on documents.": "浏览者只能浏览和评论文档。", + "Are you sure you want to make {{ userName }} a {{ role }}?": "您确定要设置 {{ userName }} 作为成员吗?", "I understand, delete": "我了解,删除", - "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "您确定要永久删除 {{ userName }} 吗?此操作不可恢复,请考虑停用用户而非删除。", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "您确定要提升 {{ userName }} 为管理员吗?管理员可以修改团队和账单信息。", - "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "您确定要冻结此账户({{ userName }})吗?被冻结的用户将无法登录。", + "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "你确定要永久删除 {{ userName }} 吗?此操作不可恢复,请考虑停用用户而非删除。", + "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "你确定要停用账户({{ userName }})吗?被停用的用户将无法登录。", "New name": "新的名称", "Name can't be empty": "名称不能为空", "Your import completed": "导入已完成", @@ -329,8 +339,8 @@ "Replace": "替换", "Replace all": "全部替换", "Profile picture": "个人头像", - "Insert after": "Insert after", - "Insert before": "Insert before", + "Insert after": "在后面插入", + "Insert before": "在此之前插入", "Align center": "居中对齐", "Align left": "左对齐", "Align right": "右对齐", @@ -344,7 +354,7 @@ "Create link": "创建链接", "Sorry, an error occurred creating the link": "抱歉,创建链接时发生错误", "Create a new doc": "新建文档", - "Create a new child doc": "Create a new child doc", + "Create a new child doc": "创建一个新的子文档", "Delete table": "删除表格", "Delete file": "删除文件", "Download file": "下载文件", @@ -371,7 +381,7 @@ "Type '/' to insert": "输入'/'来插入", "Keep typing to filter": "继续输入以过滤", "Open link": "打开链接", - "Go to link": "点击链接", + "Go to link": "转到链接", "Sorry, that type of link is not supported": "抱歉,尚不支持该类型的链接", "Ordered list": "有序列表", "Page break": "分页符", @@ -384,8 +394,8 @@ "Strikethrough": "删除线", "Bold": "加粗", "Subheading": "副标题", - "Sort ascending": "Sort ascending", - "Sort descending": "Sort descending", + "Sort ascending": "升序排序", + "Sort descending": "降序排序", "Table": "表格", "Math inline (LaTeX)": "行内公式 (LaTeX)", "Math block (LaTeX)": "数学公式 (LaTeX)", @@ -409,18 +419,18 @@ "Security": "安全性", "Features": "功能", "Members": "成员", - "Groups": "用户组", + "Groups": "群组", "Shared Links": "分享的链接", "Import": "导入", "Self Hosted": "自托管", "Integrations": "集成", - "Google Analytics": "Google Analytics(分析)", + "Google Analytics": "Google Analytics", "Choose a template": "选择模板", "Revoke token": "吊销该令牌", "Revoke": "撤回", "Show path to document": "显示文档路径", "Path to document": "文件路径", - "Group member options": "小组成员选项", + "Group member options": "群组成员选项", "Export collection": "导出文档集", "Rename": "重命名", "Sort in sidebar": "调整侧边栏的显示顺序", @@ -435,7 +445,7 @@ "Enable embeds": "启用嵌入", "Export options": "导出选项", "Edit group": "编辑群组", - "Delete group": "刪除群組", + "Delete group": "删除群组", "Group options": "分组选项", "Member options": "成员选项", "New child document": "新建子文档", @@ -448,15 +458,13 @@ "Go to document": "转到文档", "Revoke link": "撤消链接", "Contents": "目录", - "Headings you add to the document will appear here": "您添加到文档的标题将显示在此处", + "Headings you add to the document will appear here": "添加到文档中的标题将显示在这里", "Table of contents": "目录", - "Change role to admin": "角色更改为管理员", - "Change role to editor": "将角色更改为查看者", - "Change role to viewer": "将角色更改为查看者", "Change name": "更换名称", "Suspend user": "停用用户", "An error occurred while sending the invite": "发送邀请时遇到错误", "User options": "用户选项", + "Change role": "更改角色", "Resend invite": "重新发送邀请", "Revoke invite": "撤消邀请", "Activate user": "激活用户", @@ -464,13 +472,13 @@ "document": "文档", "published": "已发布", "edited": "编辑", - "created the collection": "收藏已创建", - "mentioned you in": "提及您", + "created the collection": "文档集已创建", + "mentioned you in": "提及你", "left a comment on": "留下评论在", - "shared": "shared", - "invited you to": "invited you to", + "shared": "已共享", + "invited you to": "邀请你加入", "API token created": "API 令牌已创建", - "Name your token something that will help you to remember it's use in the future, for example \"local development\", \"production\", or \"continuous integration\".": "为您的 API 令牌起一个有助于您记住它在未来使用场景的名称,例如“本地开发”、“生产”或“持续集成”。", + "Name your token something that will help you to remember it's use in the future, for example \"local development\", \"production\", or \"continuous integration\".": "为你的令牌起一个有助于你记住它在未来使用场景中的名称,例如“本地开发”、“生产”或“持续集成”。", "The document archive is empty at the moment.": "尚未归档的文档", "Search in collection": "在文档集中搜索", "This collection is only visible to those given access": "该集合仅对具有访问权限的用户可见", @@ -495,46 +503,46 @@ "{{ groupsCount }} groups with access_plural": "{{ groupsCount }} 个组有访问权限", "{{ groupName }} was added to the collection": "{{ groupName }} 已添加到文档集", "Could not add user": "无法添加用户", - "Can’t find the group you’re looking for?": "找不到您正在寻找的组?", - "Create a group": "创建组", - "Search by group name": "按组名搜索", - "Search groups": "搜索组", + "Can’t find the group you’re looking for?": "找不到你正在寻找的群组?", + "Create a group": "创建群组", + "Search by group name": "按群组名搜索", + "Search groups": "搜索群组", "No groups matching your search": "没有匹配信息", - "No groups left to add": "没有可添加的组", + "No groups left to add": "没有可添加的群组", "Add": "添加", "{{ userName }} was added to the collection": "{{ userName }} 已添加到文档集", "Need to add someone who’s not on the team yet?": "需要添加尚未加入团队的人?", "Invite people to {{ teamName }}": "邀请他们使用 {{ teamName }}", - "Ask an admin to invite them first": "Ask an admin to invite them first", + "Ask an admin to invite them first": "请管理员先邀请他们。", "Search by name": "按名称搜索", "Search people": "搜索用户", "No people matching your search": "没有符合搜索条件的用户", "No people left to add": "没有人可以添加", "Admin": "管理员", - "Active <1> ago": "<1>前活跃", + "Active <1> ago": " <1> 前活跃", "Never signed in": "从未登录", "{{ userName }} was removed from the collection": "{{ userName }} 已从合集中删除", "{{ userName }} permissions were updated": "{{ userName }} 权限已更新", "The {{ groupName }} group was removed from the collection": "{{ groupName }} 组已从合集中删除", - "Could not remove group": "无法删除用户组", + "Could not remove group": "无法删除群组", "{{ groupName }} permissions were updated": "{{ groupName }} 权限已更新", "Default access permissions were updated": "默认访问权限已更新", "Could not update permissions": "无法更新权限", "Public document sharing permissions were updated": "公共文档共享权限已更新", "Could not update public document sharing": "无法更新公共文档共享", - "The {{ collectionName }} collection is private. Workspace members have no access to it by default.": "{{ collectionName }} 合集是私有的。默认情况下,工作区人成员没有访问权限。", - "Workspace members can view and edit documents in the {{ collectionName }} collection by default.": "默认情况下,工作区成员可以查看和编辑 {{ collectionName }} 合集中的文档。", - "Workspace members can view documents in the {{ collectionName }} collection by\n default.": "默认情况下,工作区成员可以查看 {{ collectionName }} 合集中的文档。", + "The {{ collectionName }} collection is private. Workspace members have no access to it by default.": "{{ collectionName }} 合集是私有的。默认情况下,工作区成员没有访问权限。", + "Workspace members can view and edit documents in the {{ collectionName }} collection by default.": "默认情况下,工作区成员可以浏览和编辑 {{ collectionName }} 合集中的文档。", + "Workspace members can view documents in the {{ collectionName }} collection by\n default.": "默认情况下,工作区成员可以浏览 {{ collectionName }} 合集中的文档。", "When enabled, documents can be shared publicly on the internet.": "启用后,可以在互联网上公开共享文档。", "Public sharing is currently disabled in the workspace security settings.": "在工作区安全设置中,公共共享目前是禁用的。", "Additional access": "额外访问权限", "Add groups": "添加群组", "Add people": "添加人员", - "Add additional access for individual members and groups": "为成员和组添加额外的访问权限", + "Add additional access for individual members and groups": "为成员和群组添加额外的访问权限", "Add groups to {{ collectionName }}": "将群组加到 {{ collectionName }}", "Add people to {{ collectionName }}": "添加用户到 {{ collectionName }}", "Signing in": "登录中", - "You can safely close this window once the Outline desktop app has opened": "Outline 桌面应用程序打开后,您可以安全地关闭此窗口", + "You can safely close this window once the Outline desktop app has opened": "Outline 桌面应用程序打开后,你可以安全地关闭此窗口", "Error creating comment": "创建评论时出错", "Add a comment": "添加评论", "Add a reply": "增加回复", @@ -544,11 +552,11 @@ "Upload image": "上传图片", "No comments yet": "暂无评论", "Error updating comment": "更新评论时出错", - "Images are still uploading.\nAre you sure you want to discard them?": "图像仍在上传中。\n您确定要丢弃它们吗?", + "Images are still uploading.\nAre you sure you want to discard them?": "图像仍在上传中。\n你确定要丢弃它们吗?", "{{ count }} comment": "{{ count }} 条评论", "{{ count }} comment_plural": "{{ count }} 条评论", - "Viewed by": "被浏览", - "only you": "仅您自己", + "Viewed by": "已被浏览", + "only you": "仅你自己", "person": "人", "people": "用户", "Type '/' to insert, or start writing…": "输入'/'来插入,或开始写...", @@ -562,8 +570,8 @@ "Done editing": "保存编辑", "Restore version": "恢复此版本", "No history yet": "暂无历史记录", - "Source": "Source", - "Imported from {{ source }}": "Imported from {{ source }}", + "Source": "源", + "Imported from {{ source }}": "从 {{ source }} 导入", "Stats": "统计信息", "{{ count }} minute read": "已读 {{ count }} 分钟", "{{ count }} minute read_plural": "已读 {{ count }} 分钟", @@ -583,17 +591,17 @@ "Creator": "创建者", "Last edited": "最后编辑者", "Previously edited": "上次编辑", - "No one else has viewed yet": "其他人尚未查看", + "No one else has viewed yet": "还没有其他人浏览过", "Viewed {{ count }} times by {{ teamMembers }} people": "{{ teamMembers }} 人浏览 {{ count }} 次", "Viewed {{ count }} times by {{ teamMembers }} people_plural": "{{ teamMembers }} 人浏览 {{ count }} 次", - "Viewer insights are disabled.": "Viewer insights are disabled.", + "Viewer insights are disabled.": "浏览者统计功能已禁用。", "Sorry, the last change could not be persisted – please reload the page": "抱歉,无法保存上次更改 - 请重新载入页面", - "{{ count }} days": "{{ count }} day", - "{{ count }} days_plural": "{{ count }} days", - "This template will be permanently deleted in <2> unless restored.": "此模板将在 <2> 中永久删除,除非手动恢复。", - "This document will be permanently deleted in <2> unless restored.": "此文档将在 <2> 中永久删除,除非手动恢复。", + "{{ count }} days": "{{ count }} 天", + "{{ count }} days_plural": "{{ count }} 天", + "This template will be permanently deleted in <2> unless restored.": "此模板将在 <2> 后永久删除,除非手动恢复。", + "This document will be permanently deleted in <2> unless restored.": "此文档将在 <2> 后永久删除,除非手动恢复。", "Highlight some text and use the <1> control to add placeholders that can be filled out when creating new documents": "选中一些文本,然后通过 <1> 来添加占位符,以便在创建新文件时填写。", - "You’re editing a template": "您正在编辑模板", + "You’re editing a template": "你正在编辑一个模板", "Archived by {{userName}}": "已被 {{userName}} 存档", "Deleted by {{userName}}": "已被 {{userName}} 删除", "Observing {{ userName }}": "观察 {{ userName }}", @@ -601,10 +609,10 @@ "Close": "关闭", "{{ teamName }} is using {{ appName }} to share documents, please login to continue.": "{{ teamName }} 正在使用 {{ appName }} 共享文档,请登录以继续。", "Are you sure you want to delete the {{ documentTitle }} template?": "确认删除 {{ documentTitle }} 文档模板?", - "Are you sure about that? Deleting the {{ documentTitle }} document will delete all of its history.": "您确定吗?删除 {{ documentTitle }} 文档将一并清除其所有历史记录。", - "Are you sure about that? Deleting the {{ documentTitle }} document will delete all of its history and {{ any }} nested document.": "您确定继续吗?删除文档 {{ documentTitle }} 将一并删除其所有历史记录与其包含的{{ any }} 份子文档。", - "Are you sure about that? Deleting the {{ documentTitle }} document will delete all of its history and {{ any }} nested document._plural": "您确定继续吗?删除文档 {{ documentTitle }} 将一并删除其所有历史记录与其包含的{{ any }} 份子文档。", - "If you’d like the option of referencing or restoring the {{noun}} in the future, consider archiving it instead.": "如果您将来希望引用或还原{{noun}},请考虑将其存档。", + "Are you sure about that? Deleting the {{ documentTitle }} document will delete all of its history.": "你确定吗?删除 {{ documentTitle }} 文档将一并清除其所有历史记录。", + "Are you sure about that? Deleting the {{ documentTitle }} document will delete all of its history and {{ any }} nested document.": "你确定吗?删除文档 {{ documentTitle }} 将一并删除其所有历史记录与其包含的{{ any }} 份子文档。", + "Are you sure about that? Deleting the {{ documentTitle }} document will delete all of its history and {{ any }} nested document._plural": "你确定吗?删除文档 {{ documentTitle }} 将一并删除其所有历史记录与其包含的{{ any }} 份子文档。", + "If you’d like the option of referencing or restoring the {{noun}} in the future, consider archiving it instead.": "如果你将来希望引用或还原{{noun}},请考虑将其存档。", "Archiving": "正在归档", "Select a location to move": "选择要移动的目标位置", "Document moved": "文档已被移动", @@ -612,29 +620,29 @@ "Move to {{ location }}": "移动到 {{ location }}", "Couldn’t create the document, try again?": "无法创建文档,请重试?", "Document permanently deleted": "文档已被永久删除", - "Are you sure you want to permanently delete the {{ documentTitle }} document? This action is immediate and cannot be undone.": "您确定要永久地删除 {{ documentTitle }} 文档吗?此操作即时生效且无法撤消。", + "Are you sure you want to permanently delete the {{ documentTitle }} document? This action is immediate and cannot be undone.": "确定要永久地删除 {{ documentTitle }} 文档吗?此操作即时生效且无法撤消。", "Select a location to publish": "选择发布位置", "Document published": "文档已发布", "Couldn’t publish the document, try again?": "无法发布文档,请重试", "Publish in {{ location }}": "发布到{{ location }}", - "view and edit access": "查看和编辑权限", - "view only access": "仅查看权限", + "view and edit access": "浏览和编辑权限", + "view only access": "仅浏览权限", "no access": "无访问权限", "Heads up – moving the document {{ title }} to the {{ newCollectionName }} collection will grant all members of the workspace {{ newPermission }}, they currently have {{ prevPermission }}.": "注意:将文档 {{ title }} 移动到 {{ newCollectionName }} 文档集,该工作区所有成员将拥有 {{ newPermission }} 权限,目前他们只有 {{ prevPermission }} 权限。", "Moving": "移动", "Search documents": "搜索文档", "No documents found for your filters.": "没有找到相关文档。", - "You’ve not got any drafts at the moment.": "您目前还没有任何草稿。", + "You’ve not got any drafts at the moment.": "你目前还没有任何草稿。", "Payment Required": "需要付款", "Not Found": "没找到", - "We were unable to find the page you’re looking for. Go to the <2>homepage?": "我们找不到您要查找的页面。转到<2>主页?", + "We were unable to find the page you’re looking for. Go to the <2>homepage?": "我们找不到你要查找的页面。转到<2>主页?", "Offline": "离线", "We were unable to load the document while offline.": "离线状态无法加载文档。", - "Your account has been suspended": "您的账户已被停用", + "Your account has been suspended": "你的账户已被停用", "Warning Sign": "警告标志", - "A workspace admin ({{ suspendedContactEmail }}) has suspended your account. To re-activate your account, please reach out to them directly.": "团队管理员 ({{ suspendedContactEmail }}) 已暂停您的账户。要重新激活您的账户,请与团队管理员联系。", - "Are you sure about that? Deleting the {{groupName}} group will cause its members to lose access to collections and documents that it is associated with.": "您确定要这样做吗? 删除 {{groupName}} 组将使其成员无法访问它所关联的文档集和文档。", - "You can edit the name of this group at any time, however doing so too often might confuse your team mates.": "您可以随时编辑该群组的名称,但过于频繁可能会使您的队友感到困惑。", + "A workspace admin ({{ suspendedContactEmail }}) has suspended your account. To re-activate your account, please reach out to them directly.": "工作区管理员 ({{ suspendedContactEmail }}) 已暂停你的账户。要重新激活你的账户,请直接联系他们。", + "Are you sure about that? Deleting the {{groupName}} group will cause its members to lose access to collections and documents that it is associated with.": "你确定吗?删除 {{groupName}} 组将使其成员无法访问它所关联的文档集和文档。", + "You can edit the name of this group at any time, however doing so too often might confuse your team mates.": "你可以随时编辑该群组的名称,但过于频繁可能会使你的队友感到困惑。", "{{userName}} was added to the group": "{{userName}} 已添加到群组", "Add members below to give them access to the group. Need to add someone who’s not yet a member?": "在下方添加成员来访问该群组。想要添加更多人进入群组吗?", "Invite them to {{teamName}}": "邀请他们加入 {{teamName}}", @@ -643,26 +651,28 @@ "Listing members of the {{groupName}} group.": "列出 {{groupName}} 组的成员。", "This group has no members.": "这个群组没有任何成员", "Add people to {{groupName}}": "添加用户到 {{groupName}}", - "Groups are for organizing your team. They work best when centered around a function or a responsibility — Support or Engineering for example.": "群组用于管理您的团队。当以职能或责任为中心时,工作效果最好——例如支撑类或工程类。", - "You’ll be able to add people to the group next.": "接下来,您将能够将人员添加到群组中。", + "Groups are for organizing your team. They work best when centered around a function or a responsibility — Support or Engineering for example.": "群组用于管理你的团队。当以职能或责任为中心时,工作效果最好 — 例如支持类或工程类。", + "You’ll be able to add people to the group next.": "接下来,你将能够将人员添加到群组中。", "Continue": "继续操作", - "Recently viewed": "最近浏览", + "Recently viewed": "最近浏览过", "Created by me": "由我创建", "Weird, this shouldn’t ever be empty": "奇怪,这里不应该是空的", - "You haven’t created any documents yet": "您尚未创建任何文档", - "Documents you’ve recently viewed will be here for easy access": "您最近浏览过的文档将放在此处以方便快速访问", - "We sent out your invites!": "我们发送了您的邀请!", + "You haven’t created any documents yet": "你尚未创建任何文档", + "Documents you’ve recently viewed will be here for easy access": "你最近浏览过的文档将放在此处以方便快速访问", + "We sent out your invites!": "我们发送了你的邀请!", "Those email addresses are already invited": "这些电子邮箱地址已经被邀请过", - "Sorry, you can only send {{MAX_INVITES}} invites at a time": "抱歉,您一次只能发送 {{MAX_INVITES}} 个邀请", - "Invited members will receive access to": "Invited members will receive access to", - "{{collectionCount}} collections": "{{collectionCount}} collections", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "邀请成员或访客加入您的工作区。他们可以使用 {{signinMethods}} 或电子邮箱登录。", - "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "邀请成员加入您的工作区。他们需要通过 {{signinMethods}} 登录。", - "As an admin you can also <2>enable email sign-in.": "作为管理员,您还可以<2>启用电子邮件登录.", - "Want a link to share directly with your team?": "想要一个链接直接分享到您的团队吗?", - "Email": "邮箱", + "Sorry, you can only send {{MAX_INVITES}} invites at a time": "抱歉,你一次只能发送 {{MAX_INVITES}} 个邀请", + "Invited {{roleName}} will receive access to": "被邀请的 {{roleName}} 将获得访问权限", + "{{collectionCount}} collections": "{{collectionCount}} 个文档集", + "Can manage all workspace settings": "可以管理所有工作区设置", + "Can create, edit, and delete documents": "可以创建、编辑和删除文档", + "Can view and comment": "可以浏览和评论", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "邀请成员或访客加入你的工作区。他们可以使用 {{signinMethods}} 或电子邮箱登录。", + "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "邀请成员加入你的工作区。他们需要通过 {{signinMethods}} 登录。", + "As an admin you can also <2>enable email sign-in.": "作为管理员,你还可以 <2>启用电子邮件登录.", + "Invite as": "邀请作为", "Role": "角色", - "Remove invite": "撤消邀请", + "Email": "邮箱", "Add another": "再添加一个", "Inviting": "邀请中……", "Send Invites": "发送邀请", @@ -701,38 +711,40 @@ "Continue with Email": "使用电子邮件继续", "Continue with {{ authProviderName }}": "使用 {{ authProviderName }} 继续", "Back to home": "回到主页", - "The domain associated with your email address has not been allowed for this workspace.": "与您的电子邮件地址相关联的域名未被允许在此工作区使用。", - "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "无法登录。请导航至您工作区的自定义 URL,然后尝试重新登录。<1>如果您受邀加入某个工作区,您会在邀请电子邮件中找到指向该工作区的链接。", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "子域", + "The domain associated with your email address has not been allowed for this workspace.": "与你的电子邮件地址相关联的域名未被允许在此工作区使用。", + "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "无法登录。请导航至你工作区的自定义 URL,然后尝试重新登录。<1>如果你受邀加入某个工作区,你会在邀请电子邮件中找到指向该工作区的链接。", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "抱歉,无法使用个人Gmail地址创建新账户。<1>请使用 Google Workspaces 账户。", - "The workspace associated with your user is scheduled for deletion and cannot be accessed at this time.": "The workspace associated with your user is scheduled for deletion and cannot be accessed at this time.", - "The workspace you authenticated with is not authorized on this installation. Try another?": "您使用的工作区未被授权在此安装中进行操作。请尝试其他工作区?", - "We could not read the user info supplied by your identity provider.": "我们无法读取您的身份验证提供者提供的用户信息。", - "Your account uses email sign-in, please sign-in with email to continue.": "您的账户使用电子邮件登录,请使用电子邮件进行登录以继续。", - "An email sign-in link was recently sent, please check your inbox or try again in a few minutes.": "最近已发送了一封电子邮件登录链接,请检查您的收件箱或稍后再试。", - "Authentication failed – we were unable to sign you in at this time. Please try again.": "身份验证失败 - 我们现在无法让您登录,请重试。", - "Authentication failed – you do not have permission to access this workspace.": "身份验证失败 - 您没有访问此工作区的权限。", + "The workspace associated with your user is scheduled for deletion and cannot be accessed at this time.": "与你的用户相关联的工作区已计划删除,目前无法访问。", + "The workspace you authenticated with is not authorized on this installation. Try another?": "你使用的工作区未被授权在此安装中进行操作。请尝试其他工作区?", + "We could not read the user info supplied by your identity provider.": "我们无法读取你的身份验证提供者提供的用户信息。", + "Your account uses email sign-in, please sign-in with email to continue.": "你的账户使用电子邮件登录,请使用电子邮件进行登录以继续。", + "An email sign-in link was recently sent, please check your inbox or try again in a few minutes.": "最近已发送了一封电子邮件登录链接,请检查你的收件箱或稍后再试。", + "Authentication failed – we were unable to sign you in at this time. Please try again.": "身份验证失败 - 我们现在无法让你登录,请重试。", + "Authentication failed – you do not have permission to access this workspace.": "身份验证失败 - 你没有访问此工作区的权限。", "Sorry, it looks like that sign-in link is no longer valid, please try requesting another.": "抱歉,看起来该登录链接已经失效,请尝试其他链接。", - "Your account has been suspended. To re-activate your account, please contact a workspace admin.": "您的账户已被暂停。若要重新激活您的账户,请联系工作区管理员。", - "This workspace has been suspended. Please contact support to restore access.": "This workspace has been suspended. Please contact support to restore access.", + "Your account has been suspended. To re-activate your account, please contact a workspace admin.": "你的账户已被停用。若要重新激活你的账户,请联系工作区管理员。", + "This workspace has been suspended. Please contact support to restore access.": "此工作区已暂停。请联系支持以恢复访问。", "Authentication failed – this login method was disabled by a team admin.": "身份验证失败 - 此登录方式已被团队管理员禁用。", - "The workspace you are trying to join requires an invite before you can create an account.<1>Please request an invite from your workspace admin and try again.": "您正在尝试加入的工作区需要邀请才能创建账户。<1>请向您的工作区管理员申请邀请并重试。", - "Sorry, your domain is not allowed. Please try again with an allowed workspace domain.": "抱歉,您的域名不被允许。请使用允许的团队域名重试。", + "The workspace you are trying to join requires an invite before you can create an account.<1>Please request an invite from your workspace admin and try again.": "你正在尝试加入的工作区需要邀请才能创建账户。<1>请向你的工作区管理员申请邀请并重试。", + "Sorry, your domain is not allowed. Please try again with an allowed workspace domain.": "抱歉,你的域名不被允许。请使用允许的团队域名重试。", "Login": "登录", "Error": "加载失败", "Failed to load configuration.": "配置文件加载失败。", "Check the network requests and server logs for full details of the error.": "检查网络请求和服务器日志以获取错误的完整详细信息。", "Custom domain setup": "自定义域名", "Almost there": "即将完成", - "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "您的自定义域已成功指向 Outline。要完成设置过程,请联系支持人员。", + "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "你的自定义域名已成功指向Outline。要完成设置过程,请联系支持人员。", "Choose workspace": "选择工作区", "This login method requires choosing your workspace to continue": "这种登录方法需要选择工作区才能继续", - "subdomain": "子域", - "Check your email": "请查看您的电子邮件", + "Check your email": "检查你的电子邮件", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "魔法登录链接已经发送到电子邮箱 {{ emailLinkSentTo }}(若账户已存在)。", "Back to login": "回到登录界面", "Get started by choosing a sign-in method for your new workspace below…": "先为你的新工作区选择一种登录方法,再继续…", "Login to {{ authProviderName }}": "登录到 {{ authProviderName }}", - "You signed in with {{ authProviderName }} last time.": "您上次登录的方式为 {{ authProviderName }}。", + "You signed in with {{ authProviderName }} last time.": "你上次登录的方式为 {{ authProviderName }}。", "Or": "或", "Already have an account? Go to <1>login.": "已经有帐户了?前往<1>登录.", "Any collection": "文档集", @@ -744,29 +756,33 @@ "Published documents": "已发布的文档", "Archived documents": "归档", "Draft documents": "文档草稿", - "Any status": "Any status", + "Any status": "任何状态", "Search Results": "搜索结果", "Remove search": "移除搜索", "Any author": "任何作者", "Author": "作者", - "We were unable to find the page you’re looking for.": "我们找不到您要查找的页面。", + "We were unable to find the page you’re looking for.": "我们找不到你要查找的页面。", "Search titles only": "仅搜索标题", - "No documents found for your search filters.": "没有找到您搜索的文件。", + "No documents found for your search filters.": "没有找到你搜索的文件。", "New token": "新建令牌", - "You can create an unlimited amount of personal tokens to authenticate\n with the API. Tokens have the same permissions as your user account.\n For more details see the developer documentation.": "您可以创建无限数量的个人令牌以使用 API\n 令牌与您的用户帐户具有相同的权限。\n 有关详细信息,请参阅 开发人员文档。", - "Active": "活动的", + "You can create an unlimited amount of personal tokens to authenticate\n with the API. Tokens have the same permissions as your user account.\n For more details see the developer documentation.": "你可以创建无限数量的个人令牌以使用 API\n 令牌与你的用户帐户具有相同的权限。\n 有关详细信息,请参阅 开发人员文档。", + "Active": "活跃的", "Create a token": "创建令牌", "API token copied to clipboard": "API 密钥已复制到剪贴板", "Copied": "已复制", "Revoking": "吊销中", "Are you sure you want to revoke the {{ tokenName }} token?": "确认吊销 {{ tokenName }} 令牌?", + "Disconnect integration": "断开集成", + "Connected": "已连接", + "Disconnect": "断开连接", + "Disconnecting": "正在断开连接", "Allowed domains": "域名白名单", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "允许通过SSO创建新账户的域。更改此设置不会影响现有用户账户。", "Remove domain": "删除域", "Add a domain": "添加域", "Save changes": "保存更改", "Please choose a single file to import": "请选择要导入的文件", - "Your import is being processed, you can safely leave this page": "您的导入正在处理中,您可以安全地离开此页面", + "Your import is being processed, you can safely leave this page": "你的导入正在处理中,你可以安全地离开此页面", "File not supported – please upload a valid ZIP file": "不支持文件 - 请上传有效的 ZIP 文件", "Processing": "处理中", "Expired": "已过期", @@ -775,20 +791,21 @@ "All collections": "所有文档集", "Import deleted": "导入已删除", "Export deleted": "导出已删除", - "Are you sure you want to delete this import?": "您确定要删除此导入吗?", - "Deleting this import will also delete all collections and documents that were created from it. This cannot be undone.": "删除此导入也会删除从它创建的所有收藏和文档。此操作无法撤消。", + "Are you sure you want to delete this import?": "你确定要删除此导入吗?", + "Deleting this import will also delete all collections and documents that were created from it. This cannot be undone.": "删除此导入也会删除从它创建的所有文档集和文档。此操作无法撤消。", "Check server logs for more details.": "检查服务器日志获取更多详情。", "{{userName}} requested": "{{userName}} 已请求", "Upload": "上传", "Drag and drop the zip file from the JSON export option in {{appName}}, or click to upload": "通过拖放或点击来上传从 {{appName}} 导出的zip文件", "How does this work?": "这是如何运作的?", - "You can import a zip file that was previously exported from the JSON option in another instance. In {{ appName }}, open Export in the Settings sidebar and click on Export Data.": "您可以导入先前从另一个实例中的 zip 备份文件。在 {{ appName }} 的首选项中打开 导出 侧边栏,并点击 导出数据。", + "You can import a zip file that was previously exported from the JSON option in another instance. In {{ appName }}, open Export in the Settings sidebar and click on Export Data.": "你可以导入从之前实例中使用JSON选项导出的zip文件。在 {{ appName }} 的侧边栏设置中打开 导出 ,并点击 导出数据。", "Drag and drop the zip file from the Markdown export option in {{appName}}, or click to upload": "通过拖放或点击上传 {{appName}} 导出的 zip 文件", - "You can import a zip file that was previously exported from an Outline installation – collections, documents, and images will be imported. In Outline, open Export in the Settings sidebar and click on Export Data.": "您可以导入之前从 Outline 导出的 zip 文件 - 集合、文档和图像会被导入。在 Outline 中,在 Settings 侧边栏中打开 Export 并单击 Export Data。", + "You can import a zip file that was previously exported from an Outline installation – collections, documents, and images will be imported. In Outline, open Export in the Settings sidebar and click on Export Data.": "你可以导入之前从 Outline 导出的 zip 文件 - 集合、文档和图像会被导入。在 Outline 中,在侧边栏设置中打开 导出 并单击 导出数据。", "Drag and drop the zip file from Notion's HTML export option, or click to upload": "拖放,或点击上传使用 Notion 的 HTML 导出选项导出的 zip 文件", "Where do I find the file?": "该在何处找到文件", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "在 Notion 中,点击左侧栏中的 Settings & Members 并打开设置。查找导出部分,然后单击 Export all workspace content。选择 HTML 作为导出格式来获得最佳的数据兼容性。", "Last active": "最近活跃", + "Guest": "访客", "Shared": "已共享", "by {{ name }}": "由 {{ name }}", "Last accessed": "上次访问", @@ -796,45 +813,47 @@ "Date shared": "分享日期", "Domain": "域名", "Views": "浏览次数", - "Everyone": "所有人", + "All roles": "所有角色", "Admins": "管理员", + "Editors": "编辑者", + "All status": "所有状态", "Settings saved": "设置已保存", "Logo updated": "徽标已更新", "Unable to upload new logo": "无法上传新logo", "Delete workspace": "删除工作区", - "These settings affect the way that your workspace appears to everyone on the team.": "这些设置会影响Outline向工作区中的每个人显示的方式。", + "These settings affect the way that your workspace appears to everyone on the team.": "这些设置影响团队中每个人的工作区显示方式。", "Display": "显示", "The logo is displayed at the top left of the application.": "标志显示在应用程序左上角。", - "The workspace name, usually the same as your company name.": "工作区名称,通常与您的公司名称相同。", + "The workspace name, usually the same as your company name.": "工作区名称,通常与你的公司名称相同。", "Theme": "主题", "Customize the interface look and feel.": "自定义外观和样式", "Reset theme": "重置主题", "Accent color": "主题色", "Accent text color": "文本强调色", "Public branding": "品牌推广", - "Show your team’s logo on public pages like login and shared documents.": "在公开页面上,例如登录页面和共享文档页面,显示您团队的徽标。", + "Show your team’s logo on public pages like login and shared documents.": "在公开页面上,例如登录页面和共享文档页面,显示你的团队徽标。", "Behavior": "行为", "Subdomain": "二级域名", - "Your workspace will be accessible at": "您的工作区将在", + "Your workspace will be accessible at": "你的工作区将在", "Choose a subdomain to enable a login page just for your team.": "选择一个子域名来启用登陆页面,仅供你的团队使用。", - "Start view": "开始查看", + "Start view": "开始浏览", "This is the screen that workspace members will first see when they sign in.": "这是工作区成员登录时首先看到的界面。", "Danger": "危险操作", - "You can delete this entire workspace including collections, documents, and users.": "您可以删除整个工作区,包括文档集、文档和用户。", + "You can delete this entire workspace including collections, documents, and users.": "你可以删除整个工作区,包括文档集、文档和用户。", "Export data": "导出数据", - "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started – if you have notifications enabled, we will email a link to {{ userEmail }} when it’s complete.": "完整导出可能需要一些时间,请考虑导出单个文档或集合。导出的数据是 Markdown 格式文档的压缩包。导出开始后,您可以离开此页面。此外,如果你开启了通知,导出完成后,我们会发送链接至邮箱 {{ userEmail }}。", + "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started – if you have notifications enabled, we will email a link to {{ userEmail }} when it’s complete.": "完整导出可能需要一些时间,请考虑导出单个文档或集合。导出的数据是 Markdown 格式文档的压缩包。导出开始后,你可以离开此页面。此外,如果你开启了通知,导出完成后,我们会发送链接至邮箱 {{ userEmail }}。", "Recent exports": "最近导出", "Manage optional and beta features. Changing these settings will affect the experience for all members of the workspace.": "管理可选功能和测试功能。更改这些设置将影响工作组内所有成员的使用。", - "Separate editing": "关闭协同编辑", - "When enabled documents have a separate editing mode by default instead of being always editable. This setting can be overridden by user preferences.": "关闭协同编辑后,编辑文档需要进入编辑模式,而不是直接编辑。此设置可以被用户首选项覆盖。", + "Separate editing": "独立编辑", + "When enabled documents have a separate editing mode by default instead of being always editable. This setting can be overridden by user preferences.": "当启用时,默认情况下文档为独立编辑模式,而不总是可编辑的。此设置可以由用户偏好设置覆盖。", "Commenting": "评论", "When enabled team members can add comments to documents.": "启用后,团队成员可以向文档添加评论。", - "Add a Google Analytics 4 measurement ID to send document views and analytics from the workspace to your own Google Analytics account.": "添加 Google Analytics(分析)4 Measurement ID 后,您可以在自己的 Google Analytics(分析) 账户中查看文档访问量和访问分析。", + "Add a Google Analytics 4 measurement ID to send document views and analytics from the workspace to your own Google Analytics account.": "添加 Google Analytics 4 Measurement ID 后会将文档访问量和分析从工作区发送到你自己的 Google Analytics 帐户。", "Measurement ID": "Measurement ID", - "Create a \"Web\" stream in your Google Analytics admin dashboard and copy the measurement ID from the generated code snippet to install.": "在您的 Google Analytics 管理仪表板中创建一个“Web”流,从生成的代码片段中可以找到 Measurement ID。", + "Create a \"Web\" stream in your Google Analytics admin dashboard and copy the measurement ID from the generated code snippet to install.": "在你的 Google Analytics 管理仪表板中创建一个“Web”流,从生成的代码片段中可以找到 Measurement ID。", "New group": "新建群组", - "Groups can be used to organize and manage the people on your team.": "可以使用群组来组织和管理您团队中的人。", - "No groups have been created yet": "没有组可供加入", + "Groups can be used to organize and manage the people on your team.": "可以使用群组来组织和管理你的团队成员。", + "No groups have been created yet": "没有群组可供加入", "All": "全部", "Quickly transfer your existing documents, pages, and files from other tools and services into {{appName}}. You can also drag and drop any HTML, Markdown, and text documents directly into Collections in the app.": "快速将你现有的文件、页面和文件从其他工具和服务转移到 {{appName}}。你还可以将任何HTML、Markdown和文本文件直接拖入到应用程序中的文档集合中。", "Import a zip file of Markdown documents (exported from version 0.67.0 or earlier)": "导入包含 Markdown 文档的 zip 文件 (从 0.67.0 或更早版本导出)", @@ -844,98 +863,100 @@ "Import pages from a Confluence instance": "从 Confluence 实例导入页面", "Enterprise": "企业服务", "Recent imports": "最近导入", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "每个登录到 {{appName}} 的用户都会出现在这里。可能还有其他尚未登录的用户可以通过 {team.signinMethods} 访问。", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "每个登录到 {{appName}} 的用户都会出现在这里。可能还有其他用户可以通过 {{signinMethods}} 访问,但还尚未登录。", "Filter": "筛选", "Receive a notification whenever a new document is published": "每当发布新文档时收到通知", "Document updated": "文档已更新", - "Receive a notification when a document you are subscribed to is edited": "每当您订阅的文档被编辑时收到通知", + "Receive a notification when a document you are subscribed to is edited": "每当你订阅的文档被编辑时收到通知", "Comment posted": "注释已发布", - "Receive a notification when a document you are subscribed to or a thread you participated in receives a comment": "每当您订阅的文档或参与的话题收到评论时收到通知", - "Mentioned": "已提及", - "Receive a notification when someone mentions you in a document or comment": "每当有人在文档或评论中提及您时收到通知", + "Receive a notification when a document you are subscribed to or a thread you participated in receives a comment": "每当你订阅的文档或参与的话题收到评论时收到通知", + "Mentioned": "被提及", + "Receive a notification when someone mentions you in a document or comment": "每当有人在文档或评论中提及你时收到通知", "Collection created": "已创建文档集", "Receive a notification whenever a new collection is created": "每当创建新文档集时收到通知", "Invite accepted": "邀请已被接受", - "Receive a notification when someone you invited creates an account": "当您邀请的人创建账号时接收通知", - "Invited to document": "Invited to document", - "Receive a notification when a document is shared with you": "Receive a notification when a document is shared with you", - "Invited to collection": "Invited to collection", - "Receive a notification when you are given access to a collection": "Receive a notification when you are given access to a collection", + "Receive a notification when someone you invited creates an account": "当你邀请的人创建账号时接收通知", + "Invited to document": "被邀请到文档", + "Receive a notification when a document is shared with you": "每当有文档共享给你时收到通知", + "Invited to collection": "邀请到文档集", + "Receive a notification when you are given access to a collection": "当你有权访问文档集时收到通知", "Export completed": "导出已完成", - "Receive a notification when an export you requested has been completed": "当您请求的导出任务完成时接收通知", + "Receive a notification when an export you requested has been completed": "当你请求的导出任务完成时接收通知", "Getting started": "新手指南", "Tips on getting started with features and functionality": "有关特性和功能的入门提示", "New features": "新特性", "Receive an email when new features of note are added": "当笔记增加新功能时收到电子邮件", "Notifications saved": "通知配置已保存", - "Unsubscription successful. Your notification settings were updated": "取消订阅成功。您的通知设置已更新", - "Manage when and where you receive email notifications.": "管理您接收电子邮件通知的时间和地点。", + "Unsubscription successful. Your notification settings were updated": "取消订阅成功。你的通知设置已更新", + "Manage when and where you receive email notifications.": "管理你接收电子邮件通知的时间和地点。", "Email address": "电子邮件地址", - "Your email address should be updated in your SSO provider.": "您的电子邮件地址应该在您的 SSO 提供商中更新。", + "Your email address should be updated in your SSO provider.": "你的电子邮件地址应该在你的 SSO 提供商中更新。", "The email integration is currently disabled. Please set the associated environment variables and restart the server to enable notifications.": "电子邮件集成当前已禁用。请设置相关的环境变量并重新启动服务器以启用通知。", "Preferences saved": "首选项已保存", "Delete account": "删除账户", - "Manage settings that affect your personal experience.": "管理影响您个人体验的设置。", + "Manage settings that affect your personal experience.": "管理影响你个人体验的设置。", "Language": "语言", - "Choose the interface language. Community translations are accepted though our <2>translation portal.": "选择界面语言。我们通过<2>翻译门户接受来自社区的翻译。", + "Choose the interface language. Community translations are accepted though our <2>translation portal.": "选择界面语言。我们通过 <2>翻译门户 接受来自社区的翻译。", "Use pointer cursor": "使用指针光标", "Show a hand cursor when hovering over interactive elements.": "将鼠标悬停在交互式元素上时显示手形光标。", "Show line numbers": "显示行号", "Show line numbers on code blocks in documents.": "在文档中的代码块上显示行号。", - "When enabled, documents have a separate editing mode. When disabled, documents are always editable when you have permission.": "启用后,文档具有单独的编辑模式。禁用时,文档在您拥有权限时始终可编辑。", + "When enabled, documents have a separate editing mode. When disabled, documents are always editable when you have permission.": "启用时,文档为独立编辑模式。禁用时,文档在你拥有权限时始终可编辑。", "Remember previous location": "记住上一次的位置", - "Automatically return to the document you were last viewing when the app is re-opened.": "重新打开应用程序时自动返回到您上次查看的文档。", - "You may delete your account at any time, note that this is unrecoverable": "您可以随时删除您的帐户,请注意删除后将无法恢复该账号", + "Automatically return to the document you were last viewing when the app is re-opened.": "重新打开应用程序时自动返回到你上次浏览的文档。", + "You may delete your account at any time, note that this is unrecoverable": "你可以随时删除你的帐户,请注意这不可恢复", "Profile saved": "配置已保存", "Profile picture updated": "头像已更新", "Unable to upload new profile picture": "无法上传个人图片", "Manage how you appear to other members of the workspace.": "管理工作区其他成员的看到你的样式。", "Photo": "图片", - "Choose a photo or image to represent yourself.": "选择一张照片或图像来代表你自己。", + "Choose a photo or image to represent yourself.": "选择一张照片或图片作为你的头像。", "This could be your real name, or a nickname — however you’d like people to refer to you.": "可以选择使用真实的姓名或者网络昵称,当别人提及你的时候使用。", - "Are you sure you want to require invites?": "您确定要发出邀请吗?", + "Are you sure you want to require invites?": "你确定要发出邀请吗?", "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "新用户首先需要通过邀请来创建一个账户。 默认角色允许的域 将不再适用。", - "Settings that impact the access, security, and content of your workspace.": "影响您工作区访问权限、安全性和内容的设置。", + "Settings that impact the access, security, and content of your workspace.": "影响你工作区访问权限、安全性和内容的设置。", "Allow members to sign-in with {{ authProvider }}": "允许成员使用 {{ authProvider }} 登录", - "Connected": "已连接", "Disabled": "已禁用", "Allow members to sign-in using their email address": "允许成员使用他们的电子邮件地址登录", "The server must have SMTP configured to enable this setting": "服务器必须配置 SMTP 以启用此设置", "Access": "访问", - "Allow users to send invites": "Allow users to send invites", - "Allow editors to invite other people to the workspace": "Allow editors to invite other people to the workspace", + "Allow users to send invites": "允许用户发送邀请", + "Allow editors to invite other people to the workspace": "允许编辑者邀请其他人到工作区", "Require invites": "需要邀请", - "Require members to be invited to the workspace before they can create an account using SSO.": "成员需要先被邀请进入工作空间,才能通过SSO创建账户。", + "Require members to be invited to the workspace before they can create an account using SSO.": "成员需要先被邀请进入工作区,才能通过SSO创建账户。", "Default role": "默认权限", "The default user role for new accounts. Changing this setting does not affect existing user accounts.": "新帐户的默认用户角色。更改此设置不会影响现有用户帐户。", "When enabled, documents can be shared publicly on the internet by any member of the workspace": "启用后,工作区的任何成员都可以在公网上公开共享文档", - "Viewer document exports": "查看者文档导出", - "When enabled, viewers can see download options for documents": "启用时,查看者可以看到文档的下载选项", + "Viewer document exports": "浏览者文档导出", + "When enabled, viewers can see download options for documents": "启用时,浏览者可以看到文档的下载选项", "Rich service embeds": "丰富的服务嵌入", - "Links to supported services are shown as rich embeds within your documents": "支持服务的链接作为丰富的嵌入显示在您的文档中", + "Links to supported services are shown as rich embeds within your documents": "支持服务的链接作为丰富的嵌入显示在你的文档中", "Collection creation": "文档集创建", - "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Allow editors to create new collections within the workspace": "允许成员在工作区中创建新的文档集", + "Workspace creation": "工作区已创建", + "Allow editors to create new workspaces": "允许编辑者创建新的工作区", "Draw.io deployment": "部署于 Draw.io", - "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "在此处添加您自托管 draw.io 安装地址,以支持在文档中自动嵌入图表。", + "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "在此处添加你自托管 draw.io 安装地址,以支持在文档中自动嵌入图表。", "Grist deployment": "部署于 Grist", - "Add your self-hosted grist installation URL here.": "在此处添加您自托管 grist 安装地址", + "Add your self-hosted grist installation URL here.": "在此处添加你的自托管 grist 安装地址", "Sharing is currently disabled.": "共享功能当前被禁用。", - "You can globally enable and disable public document sharing in the security settings.": "您可以在安全设置 中对共享文档功能进行全局启用或禁用。", - "Documents that have been shared are listed below. Anyone that has the public link can access a read-only version of the document until the link has been revoked.": "这是您分享给其他人的所有文档,在您撤销链接之前,任何人都可以通过该链接阅读该文档", - "You can create templates to help your team create consistent and accurate documentation.": "您可以创建模板来帮助您的团队创建风格一致和准确的文档。", + "You can globally enable and disable public document sharing in the security settings.": "你可以在安全设置 中对共享文档功能进行全局启用或禁用。", + "Documents that have been shared are listed below. Anyone that has the public link can access a read-only version of the document until the link has been revoked.": "这是你分享给其他人的所有文档,在你撤销链接之前,任何人都可以通过该链接阅读该文档。", + "You can create templates to help your team create consistent and accurate documentation.": "你可以创建模板来帮助你的团队创建风格一致和准确的文档。", "Alphabetical": "按字母顺序排列", "There are no templates just yet.": "尚无可用模板。", - "Zapier is a platform that allows {{appName}} to easily integrate with thousands of other business tools. Automate your workflows, sync data, and more.": "Zapier 是一个平台,可以让 {{appName}} 轻松地与数以千计的其他业务工具集成。自动化您的工作流程、同步数据等。", - "A confirmation code has been sent to your email address, please enter the code below to permanently destroy this workspace.": "验证码已经发送至您的电子邮箱,请在下面输入代码以永久销毁此工作区。", + "Zapier is a platform that allows {{appName}} to easily integrate with thousands of other business tools. Automate your workflows, sync data, and more.": "Zapier 是一个平台,可以让 {{appName}} 轻松地与数以千计的其他业务工具集成。自动化你的工作流程、同步数据等。", + "A confirmation code has been sent to your email address, please enter the code below to permanently destroy this workspace.": "验证码已经发送至你的电子邮箱,请在下面输入代码以永久销毁此工作区。", "Confirmation code": "验证码", - "Deleting the <1>{{workspaceName}} workspace will destroy all collections, documents, users, and associated data. You will be immediately logged out of {{appName}}.": "删除工作区<1>{{workspaceName}}将会销毁所有的文档集、文档、用户和相关数据。您将立即注销{{appName}}。", - "Please note that workspaces are completely separated. They can have a different domain, settings, users, and billing.": "Please note that workspaces are completely separated. They can have a different domain, settings, users, and billing.", + "Deleting the <1>{{workspaceName}} workspace will destroy all collections, documents, users, and associated data. You will be immediately logged out of {{appName}}.": "删除工作区<1>{{workspaceName}}将会销毁所有的文档集、文档、用户和相关数据。你将立即注销{{appName}}。", + "Please note that workspaces are completely separated. They can have a different domain, settings, users, and billing.": "请注意,工作区是完全分离的。他们可以有不同的域名、设置、用户和计费。", "Workspace name": "工作区名称", - "You are creating a new workspace using your current account — {{email}}": "您正在使用当前账户创建新的工作区 —— {{email}}", + "You are creating a new workspace using your current account — {{email}}": "你正在使用当前账户创建新的工作区 —— {{email}}", "To create a workspace under another email please sign up from the homepage": "若要在另一个电子邮件下创建工作区,请从主页注册", + "Recently deleted": "最近删除的", "Trash is empty at the moment.": "回收站为空。", - "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "验证码已经发送至您的电子邮箱,请在下面输入代码以永久销毁您的账户。", - "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "你确定吗?注销您的账户将销毁与您的用户相关联的识别数据并且无法撤消。您将立即退出 {{appName}},并且您的所有 API 令牌都将被撤销。", + "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "验证码已经发送至你的电子邮箱,请在下面输入代码以永久销毁你的账户。", + "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "你确定吗?注销你的账户将销毁与你的用户相关联的识别数据并且无法撤消。你将立即退出 {{appName}},并且你的所有 API 令牌都将被撤销。", "Delete my account": "删除我的帐户", "Today": "今天", "Yesterday": "昨天", @@ -943,26 +964,38 @@ "This month": "本月", "Last month": "上月", "This year": "今年", + "Connect": "连接", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "糟糕,你需要在 Slack 中接受权限才能将 {{appName}} 连接到你的团队。再试一次?", + "Something went wrong while authenticating your request. Please try logging in again.": "验证你的请求时出现问题。请尝试重新登录。", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "GitHub帐户的所有者已被要求安装 {{githubAppName}} GitHub应用程序。一旦批准,预览将显示各自的链接。", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "通过连接GitHub组织或特定存储库到 {appName},可以在文档中预览GitHub issues和pull requests。", + "Enabled by {{integrationCreatedBy}}": "由 {{integrationCreatedBy}} 启用", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "断开连接后将无法在文档中预览来自此组织的GitHub链接。你确定吗?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Github 集成当前已禁用。请设置相关的环境变量并重新启动服务以启用此集成。", "Add to Slack": "添加到 Slack", "document published": "文档已发布", "document updated": "文档已更新", "Posting to the {{ channelName }} channel on": "发布到 {{ channelName }} 频道", "These events should be posted to Slack": "这些事件应该发布到 Slack", - "Disconnect": "断开连接", - "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "糟糕,您需要在 Slack 中接受权限才能将 {{appName}} 连接到您的工作区。再试一次?", - "Something went wrong while authenticating your request. Please try logging in again.": "验证您的请求时出现问题。请尝试重新登录。", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "这将阻止将来的任何更新被发布到此Slack频道。你确定吗?", + "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "糟糕,你需要在 Slack 中接受权限才能将 {{appName}} 连接到你的工作区。再试一次?", + "Personal account": "个人账号", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "将你的 {{appName}} 帐户链接到Slack,以便在聊天中直接搜索你可以访问的文档。", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "断开你的个人帐户会无法从Slack搜索文档。你确定吗?", + "Slash command": "斜杠命令", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "获取 Slack 中共享的 {{ appName }} 预览链接,并使用 {{ command }} 斜杠命令搜索文档而无需离开聊天。", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "这将从你的 Slack 工作区移除轮廓斜杠命令。你确定吗?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "将 {{appName}} 集合连接到 Slack 频道,当文档发布或更新时,消息将自动发布到 Slack。", - "Connect": "连接", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Slack 集成当前已禁用。请设置相关的环境变量并重新启动服务器以启用此集成。", + "Comment by {{ author }} on \"{{ title }}\"": "{{ author }} 对 \"{{ title }}\" 的评论", "How to use {{ command }}": "如何使用 {{ command }}", - "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "要搜索您的工作区,请使用 {{ command }} 命令。\n输入 {{ command2 }} help以显示此帮助文本。", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "抱歉,我们找不到适合您团队的集成。前往您的 {{ appName }} 设置进行设置。", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "您似乎还没有登录到 {{ appName }} ,所以结果可能会被限制", + "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "要搜索你的工作区,请使用 {{ command }} 命令。\n输入 {{ command2 }} help以显示此帮助文本。", "Post to Channel": "发布到频道…", "This is what we found for \"{{ term }}\"": "在 \"{{ term }}\" 中检索到", "No results for \"{{ term }}\"": "在 \"{{ term }}\" 中检索不到结果", - "Are you sure you want to delete the {{ name }} webhook?": "您确定要删除 {{ name }} 网络钩子吗?", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "看起来你还没有将你的 {{ appName }} 帐户连接到Slack", + "Link your account": "关联你的帐户", + "Link your account in {{ appName }} settings to search from Slack": "在 {{ appName }} 设置中连接你的帐户以从Slack中搜索", + "Are you sure you want to delete the {{ name }} webhook?": "你确定要删除 {{ name }} 网络钩子吗?", "Webhook updated": "Webhook已更新", "Update": "更新", "Updating": "正在更新", @@ -970,7 +1003,7 @@ "A memorable identifer": "一个容易记的名称", "URL": "URL", "Signing secret": "签名密钥", - "Subscribe to all events, groups, or individual events. We recommend only subscribing to the minimum amount of events that your application needs to function.": "订阅所有事件、群组或单独事件。我们建议您只订阅应用程序运行所需的必要事件。", + "Subscribe to all events, groups, or individual events. We recommend only subscribing to the minimum amount of events that your application needs to function.": "订阅所有事件、群组或单独事件。我们建议你只订阅应用程序运行所需的必要事件。", "All events": "全部事件", "All {{ groupName }} events": "全部 {{ groupName }} 事件", "Delete webhook": "删除 Webhook", @@ -979,16 +1012,16 @@ "Webhook created": "已创建 Webhook", "Webhooks": "Webhooks", "New webhook": "新建 Webhook", - "Webhooks can be used to notify your application when events happen in {{appName}}. Events are sent as a https request with a JSON payload in near real-time.": "网络钩子用于 {{appName}} 中有事件发生时通知您的应用程序。事件是以带JSON格式数据的 https 请求的形式,接近实时地发送。", + "Webhooks can be used to notify your application when events happen in {{appName}}. Events are sent as a https request with a JSON payload in near real-time.": "网络钩子用于 {{appName}} 中有事件发生时通知你的应用程序。事件是以带JSON格式数据的 https 请求的形式,接近实时地发送。", "Inactive": "未激活", "Create a webhook": "创建 Webhook", "Never logged in": "从未登录", "Online now": "当前在线", "Online {{ timeAgo }}": "{{ timeAgo }} 在线", - "Viewed just now": "刚刚查看", - "You updated {{ timeAgo }}": "{{ timeAgo }} 由您更新", + "Viewed just now": "刚刚浏览过", + "You updated {{ timeAgo }}": "{{ timeAgo }} 由你更新", "{{ user }} updated {{ timeAgo }}": "{{ timeAgo }} 由 {{ user }} 更新", - "You created {{ timeAgo }}": "{{ timeAgo }} 由您创建", + "You created {{ timeAgo }}": "{{ timeAgo }} 由你创建", "{{ user }} created {{ timeAgo }}": "{{ timeAgo }} 由 {{ user }} 创建", "Uploading": "上传中" } diff --git a/shared/i18n/locales/zh_TW/translation.json b/shared/i18n/locales/zh_TW/translation.json index 956f8201840a..bced3e1c9373 100644 --- a/shared/i18n/locales/zh_TW/translation.json +++ b/shared/i18n/locales/zh_TW/translation.json @@ -79,6 +79,7 @@ "Templates": "文件範本", "Notifications": "通知", "Preferences": "喜好設定", + "Documentation": "Documentation", "API documentation": "API 文件", "Toggle sidebar": "切換側邊欄", "Send us feedback": "回饋意見給我們", @@ -101,7 +102,12 @@ "Select a workspace": "選擇工作空間", "New workspace": "新建的工作空間", "Create a workspace": "建立新的工作空間", + "Login to workspace": "Login to workspace", "Invite people": "邀請使用者", + "Invite to workspace": "Invite to workspace", + "Promote to {{ role }}": "Promote to {{ role }}", + "Demote to {{ role }}": "Demote to {{ role }}", + "Update role": "Update role", "Delete user": "刪除使用者", "Collection": "文件集", "Debug": "除錯", @@ -192,6 +198,7 @@ "Viewed {{ timeAgo }}": "{{ timeAgo }} 前瀏覽過", "Copy of {{ documentName }}": "拷貝 {{ documentName }}", "Title": "標題", + "Published": "Published", "Include nested documents": "包含所有子文件", "Emoji Picker": "表情符號選擇器", "Remove": "移除", @@ -228,6 +235,8 @@ "{{ count }} member": "{{ count }} 位成員", "{{ count }} member_plural": "{{ count }} 位成員", "Group members": "群組成員", + "{{authorName}} created <3>": "{{authorName}} created <3>", + "{{authorName}} opened <3>": "{{authorName}} opened <3>", "Show menu": "顯示選單", "Choose icon": "選擇圖示", "Loading": "正在讀取", @@ -309,11 +318,12 @@ "No results": "找不到任何結果", "Previous page": "上一頁", "Next page": "下一頁", - "Are you sure you want to make {{ userName }} a read-only viewer? They will not be able to edit any content": "您確定要將 {{ userName }} 設定為檢視者嗎?他們將無法編輯任何內容。", - "Are you sure you want to make {{ userName }} a member?": "您確定要將 {{ userName }} 設定設為成員之一嗎?", + "Admins can manage the workspace and access billing.": "Admins can manage the workspace and access billing.", + "Editors can create, edit, and comment on documents.": "Editors can create, edit, and comment on documents.", + "Viewers can only view and comment on documents.": "Viewers can only view and comment on documents.", + "Are you sure you want to make {{ userName }} a {{ role }}?": "Are you sure you want to make {{ userName }} a {{ role }}?", "I understand, delete": "我明白了,刪除", "Are you sure you want to permanently delete {{ userName }}? This operation is unrecoverable, consider suspending the user instead.": "您確定要永久刪除 {{ userName }} 嗎?此操作不可恢復,請考慮使用暫停用戶。", - "Are you sure you want to make {{ userName }} an admin? Admins can modify team and billing information.": "您確定要將 {{ userName }} 設為管理員嗎?管理員可以修改團隊及帳單資訊。", "Are you sure you want to suspend {{ userName }}? Suspended users will be prevented from logging in.": "您確定要停用 {{ userName }} 的賬號嗎?遭到停用的使用者將無法登入。", "New name": "新的名稱", "Name can't be empty": "名稱不可以空白", @@ -450,13 +460,11 @@ "Contents": "目錄", "Headings you add to the document will appear here": "您在文件中新增的標題會顯示在此", "Table of contents": "目錄", - "Change role to admin": "更改身份為管理員", - "Change role to editor": "Change role to editor", - "Change role to viewer": "更改身份為檢視者", "Change name": "變更名稱", "Suspend user": "停用使用者", "An error occurred while sending the invite": "發送邀請時發生錯誤", "User options": "使用者選項", + "Change role": "Change role", "Resend invite": "重新發送邀請", "Revoke invite": "取消邀請", "Activate user": "啟用使用者", @@ -654,15 +662,17 @@ "We sent out your invites!": "我們發出了您的邀請!", "Those email addresses are already invited": "這些電子郵件地址早前已被邀請過", "Sorry, you can only send {{MAX_INVITES}} invites at a time": "抱歉,您一次最多只能發送 {{MAX_INVITES}} 個邀請", - "Invited members will receive access to": "被邀請的用戶可以存取", + "Invited {{roleName}} will receive access to": "Invited {{roleName}} will receive access to", "{{collectionCount}} collections": "{{collectionCount}} 個文件集", - "Invite members or guests to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "邀請成員或訪客加入您的工作區。他們可以使用 {{signinMethods}} 或電子郵件地址登入。", + "Can manage all workspace settings": "Can manage all workspace settings", + "Can create, edit, and delete documents": "Can create, edit, and delete documents", + "Can view and comment": "Can view and comment", + "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.": "Invite people to join your workspace. They can sign in with {{signinMethods}} or use their email address.", "Invite members to join your workspace. They will need to sign in with {{signinMethods}}.": "邀請成員加入您的工作區。他們需要使用 {{signinMethods}} 登入。", "As an admin you can also <2>enable email sign-in.": "\b身為管理員,您也可以啟用<2>使用電子郵件登入功能。", - "Want a link to share directly with your team?": "想要透過分享連結直接與您的團隊分享?", - "Email": "電子郵件", + "Invite as": "Invite as", "Role": "角色", - "Remove invite": "撤回邀請", + "Email": "電子郵件", "Add another": "新增另一個", "Inviting": "正在邀請", "Send Invites": "發送邀請", @@ -701,6 +711,9 @@ "Continue with Email": "使用電子郵件以繼續", "Continue with {{ authProviderName }}": "使用 {{ authProviderName }} 以繼續", "Back to home": "回到首頁", + "The workspace could not be found": "The workspace could not be found", + "To continue, enter your workspace’s subdomain.": "To continue, enter your workspace’s subdomain.", + "subdomain": "子網域", "The domain associated with your email address has not been allowed for this workspace.": "此工作區不允許與您的電子郵件地址的網域。", "Unable to sign-in. Please navigate to your workspace's custom URL, then try to sign-in again.<1>If you were invited to a workspace, you will find a link to it in the invite email.": "無法登入。請瀏覽至您工作區的自訂URL,再重新嘗試登入。<1>如果您是被邀請至工作區,你會在邀請信件中找到連結。", "Sorry, a new account cannot be created with a personal Gmail address.<1>Please use a Google Workspaces account instead.": "抱歉,無法使用個人 Gmail 地址建立新帳號。<1>請改用 Google Workspaces 帳號。", @@ -726,7 +739,6 @@ "Your custom domain is successfully pointing at Outline. To complete the setup process please contact support.": "您的自訂域名已成功指向 Outline。要完成設置過程,請聯繫客服人員。", "Choose workspace": "選擇工作區", "This login method requires choosing your workspace to continue": "此登入方法需要選擇您的工作區才能繼續", - "subdomain": "子網域", "Check your email": "確認您的電子郵件", "A magic sign-in link has been sent to the email {{ emailLinkSentTo }} if an account exists.": "如果帳戶存在,登錄連結會被發送到以下電子郵件 {{ emailLinkSentTo }}。", "Back to login": "返回登入頁面", @@ -760,6 +772,10 @@ "Copied": "已複製", "Revoking": "撤銷中", "Are you sure you want to revoke the {{ tokenName }} token?": "您確定要撤銷 {{ tokenName }} 權杖嗎?", + "Disconnect integration": "Disconnect integration", + "Connected": "已連接", + "Disconnect": "解除連結", + "Disconnecting": "Disconnecting", "Allowed domains": "域名白名單", "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "應該要可以使用SSO建立新帳號的網域。更改這個並不會影響現有的帳號。", "Remove domain": "移除網域", @@ -789,6 +805,7 @@ "Where do I find the file?": "我在哪裡可以找到該檔案?", "In Notion, click Settings & Members in the left sidebar and open Settings. Look for the Export section, and click Export all workspace content. Choose HTML as the format for the best data compatability.": "在Notion中,在側邊欄選取Settings & Members並開啟設定。找到輸出的部分,並按Export all workspace content。選取HTML格式以獲得最佳的相容性。", "Last active": "最近一次活動", + "Guest": "Guest", "Shared": "已分享", "by {{ name }}": "由 {{ name }}", "Last accessed": "最近存取", @@ -796,8 +813,10 @@ "Date shared": "分享日期", "Domain": "網域", "Views": "瀏覽次數", - "Everyone": "所有人", + "All roles": "All roles", "Admins": "管理員", + "Editors": "Editors", + "All status": "All status", "Settings saved": "設定已儲存", "Logo updated": "標誌已更新", "Unable to upload new logo": "無法上傳新 Logo", @@ -844,7 +863,7 @@ "Import pages from a Confluence instance": "從 Confluence 實例匯入文件", "Enterprise": "企業用戶", "Recent imports": "最近匯入的", - "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {team.signinMethods} but haven’t signed in yet.": "此處列出了所有已登入 {{appName}} 的人。可能還有其他用戶透過 {team.signinMethods} 存取但尚未登入。", + "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.": "Everyone that has signed into {{appName}} is listed here. It’s possible that there are other users who have access through {{signinMethods}} but haven’t signed in yet.", "Filter": "篩選器", "Receive a notification whenever a new document is published": "當新文件被發布時接收通知", "Document updated": "文件已更新", @@ -897,7 +916,6 @@ "New users will first need to be invited to create an account. Default role and Allowed domains will no longer apply.": "新使用者在創建賬號前需要先被邀請。 預設身份允許使用的域名 都將不再適用。", "Settings that impact the access, security, and content of your workspace.": "此處設定將影響您的知識庫存取、安全性、內容。", "Allow members to sign-in with {{ authProvider }}": "允許成員使用 {{ authProvider }} 登入", - "Connected": "已連接", "Disabled": "已停用", "Allow members to sign-in using their email address": "允許成員使用他們的電子郵件地址登入", "The server must have SMTP configured to enable this setting": "伺服器必須有已組態的 SMTP 才能啟用此設定", @@ -915,6 +933,8 @@ "Links to supported services are shown as rich embeds within your documents": "支援的外部服務連結將會被嵌入顯示於您的文件中", "Collection creation": "文件集已建立", "Allow editors to create new collections within the workspace": "Allow editors to create new collections within the workspace", + "Workspace creation": "Workspace creation", + "Allow editors to create new workspaces": "Allow editors to create new workspaces", "Draw.io deployment": "Draw.io 部署", "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "在此處添加您的自我託管 draw.io 安裝網址,以啟用在文件中自動嵌入圖表。", "Grist deployment": "部署Grist", @@ -933,6 +953,7 @@ "Workspace name": "工作區名字", "You are creating a new workspace using your current account — {{email}}": "您正在使用當前帳戶建立新的工作區 — {{email}}", "To create a workspace under another email please sign up from the homepage": "要使用另一個電子郵件建立工作區請從首頁登入", + "Recently deleted": "Recently deleted", "Trash is empty at the moment.": "垃圾桶目前是空的。", "A confirmation code has been sent to your email address, please enter the code below to permanently destroy your account.": "確認碼已發送至您的電子郵件,請輸入確認碼以永久地刪除您的帳號。", "Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of {{appName}} and all your API tokens will be revoked.": "您確定嗎?刪除您的帳號將會破壞您的使用者個人資料而且將無法還原。您將會被立刻從 {{appName}} 被登出,同時所有的 API 權杖都會被撤銷。", @@ -943,25 +964,37 @@ "This month": "這個月", "Last month": "上個月", "This year": "今年", + "Connect": "連結", + "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?": "Whoops, you need to accept the permissions in GitHub to connect {{appName}} to your workspace. Try again?", + "Something went wrong while authenticating your request. Please try logging in again.": "請求認證時發生一些錯誤,請嘗試重新登入。", + "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.": "The owner of GitHub account has been requested to install the {{githubAppName}} GitHub app. Once approved, previews will be shown for respective links.", + "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.": "Enable previews of GitHub issues and pull requests in documents by connecting a GitHub organization or specific repositories to {appName}.", + "Enabled by {{integrationCreatedBy}}": "Enabled by {{integrationCreatedBy}}", + "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?": "Disconnecting will prevent previewing GitHub links from this organization in documents. Are you sure?", + "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "The GitHub integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.", "Add to Slack": "新增到 Slack", "document published": "已發佈文件", "document updated": "已更新文件", "Posting to the {{ channelName }} channel on": "連結到 {{ channelName }} 頻道", "These events should be posted to Slack": "這些活動應該被發佈到 Slack", - "Disconnect": "解除連結", + "This will prevent any future updates from being posted to this Slack channel. Are you sure?": "This will prevent any future updates from being posted to this Slack channel. Are you sure?", "Whoops, you need to accept the permissions in Slack to connect {{appName}} to your workspace. Try again?": "喔歐!您必須在 Slack 允許 {{appName}} 取得權限連結您的工作區。再試一次?", - "Something went wrong while authenticating your request. Please try logging in again.": "請求認證時發生一些錯誤,請嘗試重新登入。", + "Personal account": "Personal account", + "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.": "Link your {{appName}} account to Slack to enable searching the documents you have access to directly within chat.", + "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?": "Disconnecting your personal account will prevent searching for documents from Slack. Are you sure?", + "Slash command": "Slash command", "Get rich previews of {{ appName }} links shared in Slack and use the {{ command }} slash command to search for documents without leaving your chat.": "使用 {{ command }} slash command 功能搜尋文件不需跳開聊天視窗,而且可以在 Slack 獲得更多細節的 {{ appName }} 文件預覽功能。", + "This will remove the Outline slash command from your Slack workspace. Are you sure?": "This will remove the Outline slash command from your Slack workspace. Are you sure?", "Connect {{appName}} collections to Slack channels. Messages will be automatically posted to Slack when documents are published or updated.": "將 {{appName}} 文件集連結到 Slack 頻道。若文件已經被更新或公開釋出,則會被自動張貼在 Slack 上。", - "Connect": "連結", - "The Slack integration is currently disabled. Please set the associated environment variables and restart the server to enable the integration.": "Slack 整合目前已停用,若要啟用,請設定相關的環境變數並重新啟動伺服器", + "Comment by {{ author }} on \"{{ title }}\"": "Comment by {{ author }} on \"{{ title }}\"", "How to use {{ command }}": "如何使用 {{ command }}", "To search your workspace use {{ command }}. \nType {{ command2 }} help to display this help text.": "要搜尋您的工作區請使用 {{ command }}.\n輸入 {{ command2 }} 來顯示這個幫助文字。", - "Sorry, we couldn’t find an integration for your team. Head to your {{ appName }} settings to set one up.": "抱歉,我們無法為您的團隊找到整合方式。前往 {{ appName }} 設置設定它。", - "It looks like you haven’t signed in to {{ appName }} yet, so results may be limited": "似乎您尚未登入 {{ appName }} ,因此結果可能會有所限制。", "Post to Channel": "發送到頻道", "This is what we found for \"{{ term }}\"": "這是我們找到關於 \"{{ term }}\" 的搜尋結果", "No results for \"{{ term }}\"": "找不到任何 ”{{ term }}“ 的搜尋結果", + "It looks like you haven’t linked your {{ appName }} account to Slack yet": "It looks like you haven’t linked your {{ appName }} account to Slack yet", + "Link your account": "Link your account", + "Link your account in {{ appName }} settings to search from Slack": "Link your account in {{ appName }} settings to search from Slack", "Are you sure you want to delete the {{ name }} webhook?": "您確定要刪除 {{ name }} webhook 嗎?", "Webhook updated": "已更新 Webhook", "Update": "更新", From 2f7112eb4276aa2f23a2c5806cfef8bfe64793d8 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 13 Apr 2024 15:20:46 -0400 Subject: [PATCH 023/129] fix: Improve display of original author information in document metadata --- app/components/DocumentMeta.tsx | 14 ++++++++++---- shared/i18n/locales/en_US/translation.json | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/components/DocumentMeta.tsx b/app/components/DocumentMeta.tsx index ee347f3a683e..fc273068cf72 100644 --- a/app/components/DocumentMeta.tsx +++ b/app/components/DocumentMeta.tsx @@ -95,17 +95,23 @@ const DocumentMeta: React.FC = ({